SQL通用语法
- SQL语法可以单行写或多行写,以分号结尾
- SQL语句可以使用空格、换行来增加语句的可读性
- MySQL数据库的SQL语句不区分大小写
- 注释:
- 单行注释:--注释内容 或 #注释内容
- 多行注释/**/
SQL分类
- DDL:数据定义语言,用来定义数据库对象(数据库、表、字段)
- DML:数据操作语言,用来对数据库表中的数据进行增删改查
- DQL:数据库查询语言,用来查询数据库中表的记录
- DCL:数据库控制语言,用来创建数据库用户、控制数据库的访问权限
DDL-数据库操作
-
查询
- 查询所有数据库:SHOW DATABASES;
- 查询当前数据库:SELECT DATABASE();
- 创建:CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];
**注意**:设置字符集是建议使用utf8md4,不建议设置成utf8,utf8存储汉字长度是3,数据库中有些特殊字符占4个字节create database if not exists db_mdbname default charset utf8md4; -
删除:DROP DATABASE [IF EXISTS] 数据库名;
-
使用:USE [数据库名];
-
DDL-表操作-查询
- 查询当前数据库所有表:SHOW TABLES;
- 表结构查询:DESC 表名;
- 查询指定表的创建语句:SHOW CREATE TABLE 表名;
DDL-表操作-创建
CREATE TABLE 表名(
字段1 字段1类型[CONNENT 字段1注释],
字段2 字段2类型[CONNENT 字段2注释],
字段3 字段3类型[CONNENT 字段3注释],
...
字段n 字段4类型[CONNENT 字段n注释]
)[COMMENT 表注释];
}
DDL-表操作-数据类型
-
分类:数值类型、字符串、日期时间
-
数值类型:TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)、BIGINT、FLOAT、DOUBLE、DECIMAL、BIGDECIMAL
-
字符串:CHAR、VARCHAR、TINYBLOB、TINYTEXT、BLOB、TEXT、MEDIUMBLOB、MEDIUNTEXT、LONGBLOB、LONGTEXT
-
日期时间:DATE、TIME、YEAR、DATETIME、TIMESTAMP
DDL-表操作-修改
- 添加字段:ALERT TABLE 表名 ADD 字段名 字段类型(长度) [COMMENT 注释] [约束];
- 修改数据类型:ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
- 修改字段名、字段类型:ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];
- 删除字段:ALTER TABLE 表名 DROP 字段名;
- 修改表名:ALTER TABLE 表名 RENAME TO 新表名;
- 删除表:DROP TABLE IF EXISTS 表名;
- 删除并重建该表:TRUNCATE TABLE 表名;
DML添加数据(INSERT)
-
给指定字段添加数据:INSERT INTO 表名(字段1,字段2,字段3...) VALUE (值1,值2,值3...);
-
给全部字段添加数据:INSERT INTO 表名 VALUE (值1,值2,值3...);
-
批量添加字段:
INSERT INTO 表名(字段1,字段2,字段3...) VALUE (值1,值2,值3...),(值1,值2,值3...),(值1,值2,值3...); INSERT INTO 表名 VALUE (值1,值2,值3...),(值1,值2,值3...),(值1,值2,值3...); -
注意:
- 插入字段时,指定的字段顺序需要与值的顺序一致
- 字符串和日期类型数据应该包含在引号中
- 插入的数据大小,应该在字段的规定范围内
-
修改数据(UPDATE):UPDATE 表名 SET 字段名1=值1, 字段名2=值2, 字段名3=值3... [WHERE条件];
-
删除数据(DELETE):DELETE FROM 表名 [WHERE条件]
DQL编写顺序
SELECT 字段列表 FROM 表名 WHERE条件
GROUP BY 分组字段列表
HAVING分组后条件列表
ORDER BY 排序字段列表
LIMIT 分页数
DQL基本查询
- 查询多个字段:SELECT 字段1, 字段2,... FROM 表名; SELECT * FROM 表名;
- 设置别名:SELECT 字段1 AS [别名1], 字段2 AS [别名2], ... FROM 表名;
- 去除重复记录:SELECT DISTINCT 字段1, 字段2,... FROM 表名;
条件查询(WHERE)
- 语法
- 条件:比较运算符、逻辑运算符、正则
聚合查询(COUNT/MAX/MIN/AVG/SUM)
- 聚合函数:将一列数据作为一个整体,进行纵向计算。count、max、min、avg、sum
- 语法:SELECT 聚合函数(字段列表) FROM 表名;
- 注意:null值不参与聚合函数运算
分组查询(GROUP BY)
-
语法:SELECT 字段列表 FROM 表名 WHERE条件 GROUP BY 分组字段名 HAVING 分组后过滤条件;
-
WHERE 与 HAVING 的区别:
- 执行时机不同:WHERE是分组之前过滤,不满足条件不参与分组,HAVING是分组之后对结果进行过滤
- 判断条件不同:WHERE不能对聚合函数进行判断,而HAVING可以
排序查询(ORDER BY)
- 语法:SELECT 字段列表 FROM 表名 WHERE条件 ORDER BY 字段1 排序方式1, 字段2 排序方式2, ...;
- 排序方式:ASC 升序(默认),DESC降序
分页查询(LIMIT)
-
语法:SELECT 字段列表 FROM 表名 LIMIT 起始索引, 记录数
-
注意:
- 起始索引从0开始
- 不同数据库分页关键字不同,MySQL是LIMIT
- 查询第一页时,起始索引可以省略
-
DQL 执行顺序:FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY -> LIMIT
DCL-管理用户
- 查询用户
USE mysql;
SELECT * FROM USER;
- 创建用户
CREATE USER '用户名'@'主机名' IDENTIFIDE BY '密码';
- 修改密码
ALTER USER '用户名'@'主机名' IDENTIFIDE WITH mysql_native_password BY '新密码';
- 删除用户
DROP USER '用户名'@'主机名';
DCL-权限管理
- ALL, ALL PRIVILEGES 所有权限
- SELECT 查询数据
- INSERT 插入数据
- UPDATE 修改数据
- DELETE 删除数据
- ALTER 修改表
- DROP 删除数据库、表、视图
- CREATE 创建数据库、表
- 查询权限:SHOW GRANTS FOR '用户名'@'主机名';
- 授予权限:GRANTS 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
- 撤销权限:REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
- 注意:多个权限之间用逗号分隔,授权时数据库和表名可以使用*进行通配,代表所有。