1、单表操作
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[SQL_CACHE | SQL_NO_CACHE]
select_expr [, select_expr ...]
[FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[FOR UPDATE | LOCK IN SHARE MODE]
- 字段显示可以使用别名:
- col1 AS alias1, col2 AS alias2, …
- WHERE子句:指明过滤条件以实现”选择”的功能:
- 过滤条件:布尔型表达式
- 算术操作符:+, -, *, /, %
- 比较操作符:=,<=>(相等或都为空), <>, !=(非标准SQL), >, >=, <, <=
- 范例查询: BETWEEN min_num AND max_num
- 不连续的查询: IN (element1, element2, …)
- 空查询: IS NULL, IS NOT NULL
- DISTINCT 去除重复行,范例:SELECT DISTINCT gender FROM students;
- 模糊查询: LIKE 使用 % 表示任意长度的任意字符 _ 表示任意单个字符
- RLIKE:正则表达式,索引失效,不建议使用
- REGEXP:匹配字符串可用正则表达式书写模式,同上
- 逻辑操作符:NOT,AND,OR,XOR
- GROUP BY:根据指定的条件把查询结果进行”分组”以用于做”聚合”运算
- 常见聚合函数: count(), sum(), max(), min(), avg(),注意:聚合函数不对null统计
- HAVING: 对分组聚合运算后的结果指定过滤条件
- 一旦分组 group by ,select语句后只跟分组的字段,聚合函数
- ORDER BY: 根据指定的字段对查询结果进行排序
- 升序:ASC
- 降序:DESC
- LIMIT [[offset,]row_count]:对查询的结果进行输出行数数量限制,跳过offset,显示row_count行,offset默为值为0
- 对查询结果中的数据请求施加”锁”
- FOR UPDATE: 写锁,独占或排它锁,只有一个读和写操作
- LOCK IN SHARE MODE: 读锁,共享锁,同时多个读操作
# 范例
mysql> select id 学员ID,name 姓名,age 年龄,gender 性别 from students;
+----------+----------+--------+--------+
| 学员ID | 姓名 | 年龄 | 性别 |
+----------+----------+--------+--------+
| 1 | wangning | 18 | M |
| 13 | ailun | 19 | M |
+----------+----------+--------+--------+
2 rows in set (0.00 sec)
# 判断是否为null
mysql> select * from students where name is null;
Empty set (0.00 sec)
mysql> select * from students where name is not null;
+----+----------+------+--------+
| id | name | age | gender |
+----+----------+------+--------+
| 1 | wangning | 18 | M |
| 13 | ailun | 19 | M |
+----+----------+------+--------+
2 rows in set (0.00 sec)
mysql> alter table students add phone varchar(11) after name;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
mysql>
mysql> select * from students;
+----+----------+-------+------+--------+
| id | name | phone | age | gender |
+----+----------+-------+------+--------+
| 1 | wangning | NULL | 18 | M |
| 13 | ailun | NULL | 19 | M |
+----+----------+-------+------+--------+
2 rows in set (0.00 sec)
# ifnull函数判断指定的字段是否为空值,如果空值则使用指定默认值
mysql> select id,name,ifnull(phone,'无号码') from students;
+----+----------+---------------------------+
| id | name | ifnull(phone,'无号码') |
+----+----------+---------------------------+
| 1 | wangning | 无号码 |
| 13 | ailun | 无号码 |
+----+----------+---------------------------+
2 rows in set (0.00 sec)
# 去重
mysql> select distinct gender from students;
+--------+
| gender |
+--------+
| M |
+--------+
1 row in set (0.00 sec)
# 分页查询
# 只取前三
select * from students limit 3;
# 取第二开始三个
select * from students limit 1,3;
# 聚合函数
mysql> select sum(age)/count(*) from students where gender ='M';
+-------------------+
| sum(age)/count(*) |
+-------------------+
| 18.5000 |
+-------------------+
1 row in set (0.00 sec)
# 分组统计
mysql> select gender,count(*) 数量 from students group by gender;
+--------+--------+
| gender | 数量 |
+--------+--------+
| M | 2 |
+--------+--------+
1 row in set (0.00 sec)
2、多表查询
![图片[1]-DQL 语句-李佳程的个人主页](http://www.lijiach.com/wp-content/uploads/2022/11/image-107.png)
多表查询,即查询结果来自于多张表
- 子查询:在SQL语句嵌套着查询语句,性能较差,基于某语句的查询结果再次进行的查询
- 联合查询:UNION
- 交叉连接:笛卡尔乘积 CROSS JOIN
- 内连接:
- 等值连接:让表之间的字段以”等值”建立连接关系
- 不等值连接
- 自然连接:去掉重复列的等值连接 , 语法: FROM table1 NATURAL JOIN table2;
- 外连接:
- 左外连接:FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col
- 右外连接:FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col
- 完全外连接: FROM tb1 FULL OUTER JOIN tb2 ON tb1.col=tb2.col 注意:MySQL 不支持此SQL语法
- 自连接:本表和本表进行连接查询
3、SELECT 语句处理的顺序
![图片[2]-DQL 语句-李佳程的个人主页](http://www.lijiach.com/wp-content/uploads/2022/11/image-108.png)
查询执行路径中的组件:查询缓存、解析器、预处理器、优化器、查询执行引擎、存储引擎
# SELECT语句的执行流程
FROM Clause --> WHERE Clause --> GROUP BY --> HAVING Clause -->SELECT --> ORDER
BY --> LIMIT
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END