SQL语言


SQL语言分类

DDL:数据定义语言,用来定义数据库对象:库,表,列等等。创建,删除,修改表和库的结构

DML:数据操作语言,用来操作数据库记录进行更新,增删改表的记录

DQL:数据查询语言,用来对表的记录进行查询

DCL:数据控制语言,用来定义表的访问权限和安全级别,对用户的创建及授权


DDL

1.数据库

查看所有数据库:SHOW DATABASES;

切换数据库:USE 数据库名;

创建数据库:CREATE DATABASE [IF NOT EXISTS] 数据库名 [CHARSET=utf8];

删除数据库:DROP DATABASE [IF EXISTS] 数据库名;

修改数据库编码:ALTER DATABASE 数据库名 CHARACTER SET utf8;

2.数据类型(列类型)

int:整形

double:浮点型,例如double(5,2) 意味最多五位,其中包含两位小数,即最大为999.99

decimal:浮点型,在表示钱方面比较好,因为不会出现精度缺失

char:固定长度字符串类型,例char(255)。最长255,数据长度不足指定长度会补足到指定长度

varchar:可变长度字符串类型。在内存中会至少花一个字节来记录长度。虽然好,但是相比char来说会浪费一定的空间。

text(clob):字符串类型,分为很小,小,中,大,四种长度。

blog:字节类型,分为很小,小,中,大,四种长度。

data:日期类型,格式为yyyy-mm-dd

time:时间类型,格式为hh:mm:ss

timestamp:时间戳类型,既有日期,又有时间

3.表

创建表

CREATE TABLE [IF NOT EXISTS] 表名(

  列名 列类型,

  列名 列类型,

  ......

  列名 列类型

);

1 CREATE TABLE TB_STU(
2 NUMBER CHAR(8),
3 NAME VARCHAR(50),
4 AGE INT,
5 GENDER VARCHAR(10)
6 );

查看当前数据库中所有表的名称

SHOW TABLES;

查看表结构

DESC 表名称;

 删除表

DROP 表名称;

修改表

前缀:ALTER TABLE 表名

  添加列:

    ALTER TABLE 表名

    ADD(

      列名 列类型,

      列名 列类型,

      .......

      列名 列类型

    );

  修改列类型:

    ALTER TABLE 表名

    MODIFY 列名 列新的类型;

  修改列名:

    ALTER TABLE 表名

    CHANGE 原类名 新类名 列类型;

  删除列:

    ALTER TABLE 表名

    DROP 列名;

  修改表名称:

    ALTER TABLE 表名

    RENAME TO 新表名;


DML

插入数据

INSERT INTO 表名(列名1,列名2....) VALUES (列值1,列值2.....);

插入部分列,没插入的数据默认为NULL

没指定插入列,默认插入所有列,且值的顺序应为表中列的顺序。

 

 修改记录

UPDATE 表名 SET 列名1=列值1,列名2=列值2;  更新列中所有的值

UPDATE 表名 SET 列名1=列值1,列名2=列值2 WHERE 条件; 更新符合特定条件的列中的值

条件必须是一个BOOLEAN类型的值或表达式,运算符:=,!=,<>,>,<,>=,<=,BETWEEN...AND,IN(.....),OR,AND,NOT,IS NULL,IS NOT NULL

注意,xxx=null,这个结果一定是false,如果想要找出某一个元素是NULL,要使用IS NULL这个运算符

 删除数据

DELETE FROM 表名 (WHERE 条件);


DCL

一个项目创建一个用户,一般一个项目对应的数据库只有一个,这个用户只能对这个数据库有权限,其他的数据库操作不了。

创建用户

CREATE USER 用户名@IP地址 IDENTIFIED BY '密码';

用户只能在指定的IP地址上登录

CREATE USER 用户名@‘%’IDENTIFIED BY ‘密码';

用户可以在任意IP地址上登录

给用户授权

GRANT 权限1, 权限2.....权限n ON 数据库 .* TO 用户名@IP地址

例如 GRANT SELECT, ALTER, DELETE, INSERT, UPDATE........... ON MYDB1.* TO ZHANGSAN@LOCALHOST;

要想赋予全部权限,可以写成 GRANT ALL ON MYDB1.* TO ZHANGSAN@LOCALHOST;

撤销权限

REVOKE 权限1,权限2......权限n ON 数据库.* FROM 用户名@IP地址

查看用户的权限

SHOW GRANTS FOR 用户名@IP地址;

删除用户

DROP USER 用户名@IP地址;


DQL

DQL是数据查询语言

基本查询

字段控制

  查询所有列

    SELECT * FROM 表名;   其中*表示所有列

  指定列查询

    SELECT 列1,列2,列3..... FROM 表名;

  完全重复的记录只记录一次

    SELECT DISTINCT 列1,列2..... FROM 表名;

  列运算

    数量类型的列可以加减乘除

    SELECT 列1*1.2, 列2+列3..... FROM 表名;

    无法转换为整数的数据会被当成0来计算,如果有NULL数值加入计算,则结果为NULL,如果不想要NULL,可以把NULL转化为其他的值,方法为 SELECT 列1*IFNULL(列名 , 想转化的值) FROM 表名;

    字符串不能用加减乘除运算,会被当成0,如果想合并字符串,需要用特殊的函数

    CONCAT(列1,列2,字符串.....)

     

     

    给列起别名 SELECT 列名 AS 别名 FROM 表名;

    AS可以省略

 条件查询

SELECT 列名 FROM 表名 WHERE 条件;

 模糊查询

SELECT 列名 FROM 表名 WHERE 某列 LIKE 'XXX';

表示在表中利用模糊条件查询,查询的条件是某一列的值类似于XXX。

 

XXX中有两个特殊符号,一种是_另一种是%,下划线表示的是单个字符,百分号表示0到无穷个字符。如果限定省略的字符数量,可以用_来表示,如果不限定省略的字符数量,用%表示。

排序

单条件查询

  SELECT 列名 FROM 表名 ORDER BY 列名 ASC;

  SELECT 列名 FROM 表名 ORDER BY 列名 DESC;

  ASC表示升序查询,DESC表示降序查询。
多条件查询

  SELECT 列名 FROM 表名 ORDER BY 列名1 ASC/DESC, 列名2 ASC/DESC, 列名3 ASC/DESC.....;

  表示按照多种条件排序,排序权重按照从左到右依次递减,当高权重排序方式排出的两个元素相同时,继续按照下一权重排序方式排序。

  如下所示,先按照性别顺序排序,再按照年龄降序排序

 聚合函数

查询数量

  SELECT COUNT(列名) FROM 表名;

  查询某一列的数量,当括号内为*时,查询整个表中元素数量。当所选列的某一行的该列的值为NULL时,计数器不会加一。当括号内为*时,当且仅当某一行的所有列的值都是NULL时计数器才不会加一。

  特殊情况,当括号内是一个数字的时候,这个数字没有任何意义,它在这里的作用和*一摸一样。

 查询总和

  SELECT SUM(列名) FROM 表名;

  将每一行的指定列的值相加求和,非数值变量当作1来看待

查询最大最小值

  SELECT MAX/MIN(列名) FROM 表名;

 查询平均值

  SELECT AVG(列名) FROM 表名;

 同时查询

  在后面添加多个条件即可,同时可以设置显示栏目名称。

分组查询

SELECT 列名, 聚合函数 FROM 表名 GROUP BY 列名;

  表示分组查询,按组别显示聚合函数。

   

   为什么前后两个列名要一致呢?因为如果不一致分组就没有意义,既然按照后面的列分组了,前面就要显示这个列的名字。当然可以交换顺序,但是保持前后列名一致是很有必要的。

  除了分组列,能查询的就只有聚合函数了。别的列和你分的组对不上号,没有任何意义!

   在这个基础上,可以增加一些条件,例如:

HAVING 关键字

  表示筛选包含某种条件的元素。

  例如:

 分组前条件用WHERE,分组后条件用HAVING


Mysql特有语句

LIMIT语句:

  SELECT 列名 FROM 表名 LIMIT a,b;

  表示从第a行开始,查询b行数据,如果b超过了总行数,那么查询到末尾即可。


关键字顺序

SELECT

FROM

WHERE

GROUP BY

HAVING

ORDER BY