通用语法
- SQL语句可以单行或多行书写,以分号结尾
- SQL语句可以使用空格/缩进来增强语句的可读性
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
- 注释单行注释:– 注释内容 或 # 注释内容多行注释:/* 注释内容 */
SQL分类
- DDL:数据定义语言,用来定义数据库对象(数据库,表,字段)
- DML:数据操作语言,用来对数据库表中的数据进行增删改
- DQL:数据查询语言,用来查询数据库中表的记录
- DCL:数据控制语言,用来创建数据库用户、控制数据库的访问权限
DDL
- 数据库操作查询所有数据库:show databases;查询当前数据库:select database();创建数据库:create database [ if not exists ] 数据库名 [ default charset 字符集 ] [ collate 排序 规则 ];删除数据库:drop database [ if exists ] 数据库名;切换数据库:use 数据库名;
- 表操作
- 查询
- 查询当前数据库所有的表:show tables;
- 查看表结构:desc 表名;
- 查询指定表的建表语句:show create table 表名;
- 创建
- 1
2
3
4
5
6
7
CREATE TABLE 表名(
字段1 字段1类型 [COMMENT 字段1注释 ],
字段2 字段2类型 [COMMENT 字段2注释 ],
字段3 字段3类型 [COMMENT 字段3注释 ],
......
字段n 字段n类型 [COMMENT 字段n注释 ]
) [ COMMENT 表注释 ] ; - 数据类型
- 数值类型
- 字符串类型
- char 与 varchar 都可以描述字符串,char是定长字符串,指定长度多长,就占用多少个字符,和字段值的长度无关 。而varchar是变长字符串,指定的长度为最大占用长度 。相对来说,char的性 能会更高些。
- 日期时间类型
- 修改
- 添加字段:ALTER TABLE 表名 ADD 字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ];
- 修改数据类型:ALTER TABLE 表名 MODIFY 字段名 新数据类型 (长度);
- 修改字段名和字段类型:ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ];
- 修改表名:ALTER TABLE 表名 RENAME TO 新表名;
- 删除
- 删除字段:ALTER TABLE 表名 DROP 字段名;
- 删除表:DROP TABLE [ IF EXISTS ] 表名;
- 删除表并重新创建:TRUNCATE TABLE 表名;
DML
- 添加数据(INSERT)给指定字段添加数据:INSERT INTO 表名 (字段名1, 字段名2, …) VALUES (值1, 值2, …);给全部字段添加数据:INSERT INTO 表名 VALUES (值1, 值2, …);批量添加数据INSERT INTO 表名 (字段名1, 字段名2, …) VALUES (值1, 值2, …), (值1, 值2, …), (值 1, 值2, …) ;INSERT INTO 表名 VALUES (值1, 值2, …), (值1, 值2, …), (值1, 值2, …) ;注意事项指定的字段顺序需要与值的顺序是一一对应的字符串和日期型数据应该包含在引号中插入的数据大小,应该在字段的规定范围内
- 修改数据(UPDATE):UPDATE 表名 SET 字段名1 = 值1 , 字段名2 = 值2 , …. [ WHERE 条件 ];
- 删除数据(DELETE):DELETE FROM 表名 [ WHERE 条件 ] ;DELETE 语句不能删除某一个字段的值(可以使用UPDATE,将该字段值置为NULL即可)
DQL
- 语法
- 1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数 - 基本查询
- 查询多个字段SELECT 字段1, 字段2, 字段3 … FROM 表名 ;SELECT * FROM 表名 ; *代表所有字段,尽量不要使用
- 设置别名SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] … FROM 表名; AS可以省略
- 去除重复记录:SELECT DISTINCT 字段列表 FROM 表名;
- 条件查询
- 语法:SELECT 字段列表 FROM 表名 WHERE 条件列表 ;
- 条件
- |比较运算符|功能|
|—|—|—|
|>|大于||
|>=|大于等于||
|<|小于||
|<=|小于等于||
|=|等于||
|<>或!=|不等于||
|BETWEEN … AND …|在某个范围之内(含最小、最大值)||
|IN(…)|在in之后的列表中的值,多选一||
|LIKE 占位符|模糊匹配(_匹配单个字符, %匹配任意个字符)|select * from emp where name like '__';|
|IS NULL|是NULL|| - 逻辑运算符功能AND或&&并且 (多个条件同时成立)OR或|或者 (多个条件任意一个成立)NOT或!非,不是
- 聚合函数:SELECT 聚合函数(字段列表) FROM 表名 ;
- null值不参与聚合函数运算
- 函数功能count统计数量max最大值min最小值avg平均值sum求和
- 分组查询
- 语法:SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
- where和having的区别
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤
- 判断条件不同:where当中不能使用聚合函数,而having可以
- 注意事项
- 执行顺序: where > 聚合函数 > having
- 支持多字段分组, 具体语法为 : group by columnA,columnB
- 排序查询
- 语法:SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ;
- 排序方式ASC:升序(默认)DESC:降序
- 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序 ;
- 分页查询
- 语法:SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数分页查询在不同的数据库有不同的实现,MySQL中是LIMIT如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10
- 执行顺序
DCL
- 管理用户
- 查询用户:
- select * from mysql.user;
- 1
2
use mysql;
select * from mysql; - 创建用户:CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
- 创建用户heima, 可以在任意主机访问该数据库, 密码123456:create user 'heima'@'%' identified by '123456';
- 修改用户密码:ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';
- 删除用户:DROP USER '用户名'@'主机名' ;
- 权限控制
权限 | 说明 |
ALL, ALL PRIVILEGES | 所有权限 |
SELECT | 查询数据 |
INSERT | 插入数据 |
UPDATE | 修改数据 |
DELETE | 删除数据 |
ALTER | 修改表 |
DROP | 删除数据库/表/视图 |
CREATE | 创建数据库/表 |
1. 查询权限:`SHOW GRANTS FOR '用户名'@'主机名' ;`
1. 授予权限:`GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';`
2. 撤销权限:`REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';`
3. 注意事项
- 多个权限之间,使用逗号分隔