DQL 语句

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 语句-李佳程的个人主页

多表查询,即查询结果来自于多张表

  • 子查询:在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 语句-李佳程的个人主页

查询执行路径中的组件:查询缓存、解析器、预处理器、优化器、查询执行引擎、存储引擎

# SELECT语句的执行流程
FROM Clause --> WHERE Clause --> GROUP BY --> HAVING Clause -->SELECT --> ORDER
BY --> LIMIT

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享