MySQL概述
基础篇
通用语法及分类
DCL
DQL
DML
DDL
函数
字符串函数
数值函数
日期函数
流程函数
约束
常用约束
外键约束
多表查询
多表关系
查询
内连接查询
外连接查询
自连接查询
联合查询
子查询
事务
进阶篇
存储引擎
性能分析
查看执行频次
慢查询日志
profile
explain
索引
索引结构
索引分类
语法
使用规则
设计原则
SQL 优化
插入数据
主键优化
order by优化
group by优化
limit优化
count优化
update优化(避免行锁升级为表锁)
视图
存储过程
触发器
锁
InnoDB 引擎
事务原理
MVCC
数据类型
权限一览表
图形化界面工具
DQL - MySql学习文档 - 笔下光年
网站首页
DQL
语法: ```mysql SELECT 字段列表 FROM 表名字段 WHERE 条件列表 GROUP BY 分组字段列表 HAVING 分组后的条件列表 ORDER BY 排序字段列表 LIMIT 分页参数 ``` #### 基础查询 查询多个字段: `SELECT 字段1, 字段2, 字段3, ... FROM 表名;` `SELECT * FROM 表名;` 设置别名: `SELECT 字段1 [ AS 别名1 ], 字段2 [ AS 别名2 ], 字段3 [ AS 别名3 ], ... FROM 表名;` `SELECT 字段1 [ 别名1 ], 字段2 [ 别名2 ], 字段3 [ 别名3 ], ... FROM 表名;` 去除重复记录: `SELECT DISTINCT 字段列表 FROM 表名;` 转义: `SELECT * FROM 表名 WHERE name LIKE '/_张三' ESCAPE '/'` `/` 之后的\_不作为通配符 #### 条件查询 语法: `SELECT 字段列表 FROM 表名 WHERE 条件列表;` 条件: | 比较运算符 | 功能 | | ------------------- | ------------------------------------------- | | > | 大于 | | >= | 大于等于 | | < | 小于 | | <= | 小于等于 | | = | 等于 | | <> 或 != | 不等于 | | BETWEEN ... AND ... | 在某个范围内(含最小、最大值) | | IN(...) | 在in之后的列表中的值,多选一 | | LIKE 占位符 | 模糊匹配(\_匹配单个字符,%匹配任意个字符) | | IS NULL | 是NULL | | 逻辑运算符 | 功能 | | ------------------ | ---------------------------- | | AND 或 && | 并且(多个条件同时成立) | | OR 或 || | 或者(多个条件任意一个成立) | | NOT 或 ! | 非,不是 | 例子: ```mysql -- 年龄等于30 select * from employee where age = 30; -- 年龄小于30 select * from employee where age < 30; -- 小于等于 select * from employee where age <= 30; -- 没有身份证 select * from employee where idcard is null or idcard = ''; -- 有身份证 select * from employee where idcard; select * from employee where idcard is not null; -- 不等于 select * from employee where age != 30; -- 年龄在20到30之间 select * from employee where age between 20 and 30; select * from employee where age >= 20 and age <= 30; -- 下面语句不报错,但查不到任何信息 select * from employee where age between 30 and 20; -- 性别为女且年龄小于30 select * from employee where age < 30 and gender = '女'; -- 年龄等于25或30或35 select * from employee where age = 25 or age = 30 or age = 35; select * from employee where age in (25, 30, 35); -- 姓名为两个字 select * from employee where name like '__'; -- 身份证最后为X select * from employee where idcard like '%X'; ``` #### 聚合查询(聚合函数) 常见聚合函数: | 函数 | 功能 | | ----- | -------- | | count | 统计数量 | | max | 最大值 | | min | 最小值 | | avg | 平均值 | | sum | 求和 | 语法: `SELECT 聚合函数(字段列表) FROM 表名;` 例: `SELECT count(id) from employee where workaddress = "广东省";` #### 分组查询 语法: `SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后的过滤条件 ];` where 和 having 的区别: - 执行时机不同:where是分组之前进行过滤,不满足where条件不参与分组;having是分组后对结果进行过滤。 - 判断条件不同:where不能对聚合函数进行判断,而having可以。 例子: ```mysql -- 根据性别分组,统计男性和女性数量(只显示分组数量,不显示哪个是男哪个是女) select count(*) from employee group by gender; -- 根据性别分组,统计男性和女性数量 select gender, count(*) from employee group by gender; -- 根据性别分组,统计男性和女性的平均年龄 select gender, avg(age) from employee group by gender; -- 年龄小于45,并根据工作地址分组 select workaddress, count(*) from employee where age < 45 group by workaddress; -- 年龄小于45,并根据工作地址分组,获取员工数量大于等于3的工作地址 select workaddress, count(*) address_count from employee where age < 45 group by workaddress having address_count >= 3; ``` ##### 注意事项 - 执行顺序:where > 聚合函数 > having - 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义 #### 排序查询 语法: `SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1, 字段2 排序方式2;` 排序方式: - ASC: 升序(默认) - DESC: 降序 例子: ```mysql -- 根据年龄升序排序 SELECT * FROM employee ORDER BY age ASC; SELECT * FROM employee ORDER BY age; -- 两字段排序,根据年龄升序排序,入职时间降序排序(如果年龄相同那么就按这个) SELECT * FROM employee ORDER BY age ASC, entrydate DESC; ``` ##### 注意事项 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序 #### 分页查询 语法: `SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;` 例子: ```mysql -- 查询第一页数据,展示10条 SELECT * FROM employee LIMIT 0, 10; -- 查询第二页 SELECT * FROM employee LIMIT 10, 10; ``` ##### 注意事项 - 起始索引从0开始,起始索引 = (查询页码 - 1) * 每页显示记录数 - 分页查询是数据库的方言,不同数据库有不同实现,MySQL是LIMIT - 如果查询的是第一页数据,起始索引可以省略,直接简写 LIMIT 10 #### DQL执行顺序 FROM -> WHERE -> GROUP BY -> SELECT -> ORDER BY -> LIMIT
上一篇:
DCL
下一篇:
DML