数据库系统原理与应用教程(039)—— MySQL 查询(一):SELECT 命令的语法分析
数据库系统原理与应用教程(039)—— MySQL 查询(一):SELECT 命令的语法分析
目录
- 数据库系统原理与应用教程(039)—— MySQL 查询(一):SELECT 命令的语法分析
- 一、SELECT 语句的语法结构
- 二、准备查询所需的数据表
- 三、SELECT 语句的书写顺序与执行顺序
- 1、SELECT 语句的书写顺序
- 2、SELECT 语句的执行顺序
- 四、查询举例
- 1、基本用法
- 2、指定查询条件
- 3、连接查询
- 4、对查询结果进行排序
- 5、分组查询
- 6、分页查询
MySQL 使用 SELECT 语句查询所需的数据。查询是指根据使用需求,使用不同的查询方式从数据库中获取所需的数据, 查询是 MySQL 最重要的操作。
一、SELECT 语句的语法结构
SELECT 语句的语法格式如下:
SELECT DISTINCT<列名或表达式列表>
FROM<表名> <连接类型>
JOIN <表名> ON <连接条件>
WHERE<筛选条件>
GROUP BY<分组字段列表>
HAVING<分组筛选条件>
ORDER BY<排序字段>
LIMIT <m,n>;/*
参数说明:
(1)DISTINCT:消除重复行。
(2)<字段或表达式列表>:表示所要查询字段的名称,可以使用(*)表示所有字段,也可以使用列名构造表达式。
(3)<连接类型>:可以使用 inner join,left join,right join 分别表示内连接,左连接,右连接。
(4)<连接条件>:一般使用两个表中的相同列构造连接条件。进行连接运算的表通常具有一对多联系,连接条件通常使用子表的外键和父表的主键建立。
(5)<筛选条件>:限定查询数据必须满足该查询条件。
(6)<分组字段列表>:按照指定的字段分组。
(7)<分组筛选条件>:对分组进行筛选。
(8)<排序字段>:对查询结果进行排序,可以进行升序(ASC)和降序(DESC)排列,默认是升序。
(9)LIMIT <m,n>:分页显示数据。
*/
二、准备查询所需的数据表
/*
CREATE TABLE student(s_id char(5) primary key,s_name char(20),birth datetime,phone char(20),addr varchar(100)
);INSERT INTO student
VALUES('S2011','张晓刚','1999-12-3','13163735775','信阳市'),
('S2012','刘小青','1999-10-11','13603732255','新乡市'),
('S2013','曹梦德','1998-2-13','13853735522','郑州市'),
('S2014','刘艳','1998-6-24','13623735335','郑州市'),
('S2015','刘岩','1999-7-6','13813735225','信阳市'),
('S2016','刘若非','2000-8-31','13683735533','开封市'),
('S2021','董雯花','2000-7-30','13533735564','开封市'),
('S2022','周华建','1999-5-25','13243735578','郑州市'),
('S2023','特朗普','1999-6-21','13343735588','新乡市'),
('S2024','奥巴马','2000-10-17','13843735885','信阳市'),
('S2025','周健华','2000-8-22','13788736655','开封市'),
('S2026','张学有','1998-7-6','13743735566','郑州市'),
('S2031','李明博','1999-10-26','13643732222','郑州市'),
('S2032','达芬奇','1999-12-31','13043731234','郑州市');CREATE TABLE teacher(t_id char(5) primary key,t_name char(20),job_title char(20),phone char(20)
);INSERT INTO teacher
VALUES('T8001','欧阳修','教授','13703735666'),
('T8002','华罗庚','教授','13703735888'),
('T8003','钟南山','教授','13703735675'),
('T8004','钱学森','教授','13703735638'),
('T8005','李白','副教授','13703735828'),
('T8006','孔子','教授','13703735457'),
('T8007','王安石','副教授','13703735369');CREATE TABLE course(c_id char(4) primary key,c_name char(20),t_id char(5)
);INSERT INTO course
VALUES('C101','古代文学','T8001'),
('C102','高等数学','T8002'),
('C103','线性代数','T8002'),
('C104','临床医学','T8003'),
('C105','传染病学','T8003'),
('C106','大学物理','T8004'),
('C107','诗歌欣赏','T8005'),
('C108','教育学','T8006'),
('C109','刑事诉讼法','T8007'),
('C110','经济法','T8007');CREATE TABLE score(s_id char(5),c_id char(4),score int,primary key(s_id, c_id)
);INSERT INTO score
VALUES('S2011','C102',84),('S2011','C105',90),('S2011','C106',79),('S2011','C109',65),
('S2012','C101',67),('S2012','C102',52),('S2012','C103',55),('S2012','C104',86),
('S2012','C105',87),('S2012','C106',64),('S2012','C107',62),
('S2012','C108',73),('S2012','C109',78),('S2012','C110',89),
('S2013','C102',97),('S2013','C103',68),('S2013','C104',66),('S2013','C105',68),
('S2014','C102',90),('S2014','C103',85),('S2014','C104',77),('S2014','C105',96),
('S2015','C101',69),('S2015','C102',66),('S2015','C103',88),('S2015','C104',69),
('S2015','C105',66),('S2015','C106',88),('S2015','C107',69),
('S2015','C108',66),('S2015','C109',88),('S2015','C110',69),
('S2016','C101',65),('S2016','C102',69),('S2016','C107',82),('S2016','C108',56),
('S2021','C102',72),('S2021','C103',90),('S2021','C104',90),('S2021','C105',57),
('S2022','C102',88),('S2022','C103',93),('S2022','C109',47),('S2022','C110',62),
('S2023','C102',68),('S2023','C103',86),('S2023','C109',56),('S2023','C110',91),
('S2024','C102',87),('S2024','C103',97),('S2024','C109',80),('S2024','C110',81),
('S2025','C102',61),('S2025','C105',62),('S2025','C106',87),('S2025','C109',82),
('S2026','C102',59),('S2026','C105',48),('S2026','C106',90),('S2026','C109',73);
*/
mysql> select * from student;
+-------+-----------+---------------------+-------------+-----------+
| s_id | s_name | birth | phone | addr |
+-------+-----------+---------------------+-------------+-----------+
| S2011 | 张晓刚 | 1999-12-03 00:00:00 | 13163735775 | 信阳市 |
| S2012 | 刘小青 | 1999-10-11 00:00:00 | 13603732255 | 新乡市 |
| S2013 | 曹梦德 | 1998-02-13 00:00:00 | 13853735522 | 郑州市 |
| S2014 | 刘艳 | 1998-06-24 00:00:00 | 13623735335 | 郑州市 |
| S2015 | 刘岩 | 1999-07-06 00:00:00 | 13813735225 | 信阳市 |
| S2016 | 刘若非 | 2000-08-31 00:00:00 | 13683735533 | 开封市 |
| S2021 | 董雯花 | 2000-07-30 00:00:00 | 13533735564 | 开封市 |
| S2022 | 周华建 | 1999-05-25 00:00:00 | 13243735578 | 郑州市 |
| S2023 | 特朗普 | 1999-06-21 00:00:00 | 13343735588 | 新乡市 |
| S2024 | 奥巴马 | 2000-10-17 00:00:00 | 13843735885 | 信阳市 |
| S2025 | 周健华 | 2000-08-22 00:00:00 | 13788736655 | 开封市 |
| S2026 | 张学有 | 1998-07-06 00:00:00 | 13743735566 | 郑州市 |
| S2031 | 李明博 | 1999-10-26 00:00:00 | 13643732222 | 郑州市 |
| S2032 | 达芬奇 | 1999-12-31 00:00:00 | 13043731234 | 郑州市 |
+-------+-----------+---------------------+-------------+-----------+
14 rows in set (0.00 sec)mysql> select * from teacher;
+-------+-----------+-----------+-------------+
| t_id | t_name | job_title | phone |
+-------+-----------+-----------+-------------+
| T8001 | 欧阳修 | 教授 | 13703735666 |
| T8002 | 华罗庚 | 教授 | 13703735888 |
| T8003 | 钟南山 | 教授 | 13703735675 |
| T8004 | 钱学森 | 教授 | 13703735638 |
| T8005 | 李白 | 副教授 | 13703735828 |
| T8006 | 孔子 | 教授 | 13703735457 |
| T8007 | 王安石 | 副教授 | 13703735369 |
+-------+-----------+-----------+-------------+
7 rows in set (0.00 sec)mysql> select * from course;
+------+-----------------+-------+
| c_id | c_name | t_id |
+------+-----------------+-------+
| C101 | 古代文学 | T8001 |
| C102 | 高等数学 | T8002 |
| C103 | 线性代数 | T8002 |
| C104 | 临床医学 | T8003 |
| C105 | 传染病学 | T8003 |
| C106 | 大学物理 | T8004 |
| C107 | 诗歌欣赏 | T8005 |
| C108 | 教育学 | T8006 |
| C109 | 刑事诉讼法 | T8007 |
| C110 | 经济法 | T8007 |
+------+-----------------+-------+
10 rows in set (0.00 sec)mysql> select * from score;
+-------+------+-------+
| s_id | c_id | score |
+-------+------+-------+
| S2011 | C102 | 84 |
| S2011 | C105 | 90 |
| S2011 | C106 | 79 |
| S2011 | C109 | 65 |
| S2012 | C101 | 67 |
| S2012 | C102 | 52 |
| S2012 | C103 | 55 |
| S2012 | C104 | 86 |
| S2012 | C105 | 87 |
| S2012 | C106 | 64 |
| S2012 | C107 | 62 |
| S2012 | C108 | 73 |
| S2012 | C109 | 78 |
| S2012 | C110 | 89 |
| S2013 | C102 | 97 |
| S2013 | C103 | 68 |
| S2013 | C104 | 66 |
| S2013 | C105 | 68 |
| S2014 | C102 | 90 |
| S2014 | C103 | 85 |
| S2014 | C104 | 77 |
| S2014 | C105 | 96 |
| S2015 | C101 | 69 |
| S2015 | C102 | 66 |
| S2015 | C103 | 88 |
| S2015 | C104 | 69 |
| S2015 | C105 | 66 |
| S2015 | C106 | 88 |
| S2015 | C107 | 69 |
| S2015 | C108 | 66 |
| S2015 | C109 | 88 |
| S2015 | C110 | 69 |
| S2016 | C101 | 65 |
| S2016 | C102 | 69 |
| S2016 | C107 | 82 |
| S2016 | C108 | 56 |
| S2021 | C102 | 72 |
| S2021 | C103 | 90 |
| S2021 | C104 | 90 |
| S2021 | C105 | 57 |
| S2022 | C102 | 88 |
| S2022 | C103 | 93 |
| S2022 | C109 | 47 |
| S2022 | C110 | 62 |
| S2023 | C102 | 68 |
| S2023 | C103 | 86 |
| S2023 | C109 | 56 |
| S2023 | C110 | 91 |
| S2024 | C102 | 87 |
| S2024 | C103 | 97 |
| S2024 | C109 | 80 |
| S2024 | C110 | 81 |
| S2025 | C102 | 61 |
| S2025 | C105 | 62 |
| S2025 | C106 | 87 |
| S2025 | C109 | 82 |
| S2026 | C102 | 59 |
| S2026 | C105 | 48 |
| S2026 | C106 | 90 |
| S2026 | C109 | 73 |
+-------+------+-------+
60 rows in set (0.00 sec)
三、SELECT 语句的书写顺序与执行顺序
1、SELECT 语句的书写顺序
SELECT DISTINCT <列名或表达式列表>
FROM <table_name> [INNER|LEFT|RIGHT] JOIN <table_name>
ON <连接条件>
WHERE <筛选条件>
GROUP BY <分组字段或表达式>
HAVING <分组筛选条件>
WITH ROLLUP
ORDER BY <排序字段或表达式>
LIMIT [m,]n
如果书写顺序不对会提示书写错误(1064):
-- order by 和 where 顺序不对
mysql> select * from student order by s_name where addr='郑州市';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where addr='郑州
市'' at line 1-- where 和 from 顺序不对
mysql> select * where addr='郑州市' from student;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where addr='郑州
市' from student' at line 1-- where 和 group 顺序不对
mysql> select addr,count(*) from student group by addr where s_name like '张%';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where s_name like'张%'' at line 1
2、SELECT 语句的执行顺序
--(1)指定查询所使用的表
FROM <table_name> [INNER|LEFT|RIGHT] JOIN <table_name>
ON <连接条件>
--(2)指定筛选条件(WHERE 后面不能使用 SELECT 所指定的列的别名,因为此时 select 子句还没有执行)
WHERE <筛选条件>
--(3)对数据分组
GROUP BY <分组字段或表达式>
WITH ROLLUP
HAVING <分组筛选条件>
--(4)生成需要显示的列和表达式
SELECT <字段或表达式列表>
--(5)消除重复的数据行
DISTINCT
--(6)对查询结果排序
ORDER BY <排序字段或表达式>
LIMIT [m,]n
四、查询举例
1、基本用法
mysql> select s_id,s_name,year(now())-year(birth) age from student;
+-------+-----------+------+
| s_id | s_name | age |
+-------+-----------+------+
| S2011 | 张晓刚 | 23 |
| S2012 | 刘小青 | 23 |
| S2013 | 曹梦德 | 24 |
| S2014 | 刘艳 | 24 |
| S2015 | 刘岩 | 23 |
| S2016 | 刘若非 | 22 |
| S2021 | 董雯花 | 22 |
| S2022 | 周华建 | 23 |
| S2023 | 特朗普 | 23 |
| S2024 | 奥巴马 | 22 |
| S2025 | 周健华 | 22 |
| S2026 | 张学有 | 24 |
| S2031 | 李明博 | 23 |
| S2032 | 达芬奇 | 23 |
+-------+-----------+------+
14 rows in set (0.03 sec)
2、指定查询条件
mysql> select * from student where s_name like '张%';
+-------+-----------+---------------------+-------------+-----------+
| s_id | s_name | birth | phone | addr |
+-------+-----------+---------------------+-------------+-----------+
| S2011 | 张晓刚 | 1999-12-03 00:00:00 | 13163735775 | 信阳市 |
| S2026 | 张学有 | 1998-07-06 00:00:00 | 13743735566 | 郑州市 |
+-------+-----------+---------------------+-------------+-----------+
2 rows in set (0.02 sec)
3、连接查询
/*
select s.s_id, s_name, c.c_id, c_name, score
from student s join score sc
on s.s_id = sc.s_id
join course c
on sc.c_id = c.c_id
where score > 90;
*/
mysql> select s.s_id, s_name, c.c_id, c_name, score-> from student s join score sc-> on s.s_id = sc.s_id-> join course c-> on sc.c_id = c.c_id -> where score > 90;
+-------+-----------+------+--------------+-------+
| s_id | s_name | c_id | c_name | score |
+-------+-----------+------+--------------+-------+
| S2013 | 曹梦德 | C102 | 高等数学 | 97 |
| S2014 | 刘艳 | C105 | 传染病学 | 96 |
| S2022 | 周华建 | C103 | 线性代数 | 93 |
| S2023 | 特朗普 | C110 | 经济法 | 91 |
| S2024 | 奥巴马 | C103 | 线性代数 | 97 |
+-------+-----------+------+--------------+-------+
5 rows in set (0.00 sec)
4、对查询结果进行排序
mysql> select * from student order by birth desc;
+-------+-----------+---------------------+-------------+-----------+
| s_id | s_name | birth | phone | addr |
+-------+-----------+---------------------+-------------+-----------+
| S2024 | 奥巴马 | 2000-10-17 00:00:00 | 13843735885 | 信阳市 |
| S2016 | 刘若非 | 2000-08-31 00:00:00 | 13683735533 | 开封市 |
| S2025 | 周健华 | 2000-08-22 00:00:00 | 13788736655 | 开封市 |
| S2021 | 董雯花 | 2000-07-30 00:00:00 | 13533735564 | 开封市 |
| S2032 | 达芬奇 | 1999-12-31 00:00:00 | 13043731234 | 郑州市 |
| S2011 | 张晓刚 | 1999-12-03 00:00:00 | 13163735775 | 信阳市 |
| S2031 | 李明博 | 1999-10-26 00:00:00 | 13643732222 | 郑州市 |
| S2012 | 刘小青 | 1999-10-11 00:00:00 | 13603732255 | 新乡市 |
| S2015 | 刘岩 | 1999-07-06 00:00:00 | 13813735225 | 信阳市 |
| S2023 | 特朗普 | 1999-06-21 00:00:00 | 13343735588 | 新乡市 |
| S2022 | 周华建 | 1999-05-25 00:00:00 | 13243735578 | 郑州市 |
| S2026 | 张学有 | 1998-07-06 00:00:00 | 13743735566 | 郑州市 |
| S2014 | 刘艳 | 1998-06-24 00:00:00 | 13623735335 | 郑州市 |
| S2013 | 曹梦德 | 1998-02-13 00:00:00 | 13853735522 | 郑州市 |
+-------+-----------+---------------------+-------------+-----------+
14 rows in set (0.00 sec)
5、分组查询
mysql> select addr,count(*) cnt from student group by addr;
+-----------+-----+
| addr | cnt |
+-----------+-----+
| 信阳市 | 3 |
| 开封市 | 3 |
| 新乡市 | 2 |
| 郑州市 | 6 |
+-----------+-----+
4 rows in set (0.00 sec)-- 对分组进行筛选
mysql> select addr,count(*) cnt from student group by addr having cnt>2;
+-----------+-----+
| addr | cnt |
+-----------+-----+
| 信阳市 | 3 |
| 开封市 | 3 |
| 郑州市 | 6 |
+-----------+-----+
3 rows in set (0.00 sec)
6、分页查询
-- 取前三条记录
mysql> select * from student order by birth limit 3;
+-------+-----------+---------------------+-------------+-----------+
| s_id | s_name | birth | phone | addr |
+-------+-----------+---------------------+-------------+-----------+
| S2013 | 曹梦德 | 1998-02-13 00:00:00 | 13853735522 | 郑州市 |
| S2014 | 刘艳 | 1998-06-24 00:00:00 | 13623735335 | 郑州市 |
| S2026 | 张学有 | 1998-07-06 00:00:00 | 13743735566 | 郑州市 |
+-------+-----------+---------------------+-------------+-----------+
3 rows in set (0.00 sec)-- 从第 4 条开始,取 2 条记录
mysql> select * from student order by birth limit 3,2;
+-------+-----------+---------------------+-------------+-----------+
| s_id | s_name | birth | phone | addr |
+-------+-----------+---------------------+-------------+-----------+
| S2022 | 周华建 | 1999-05-25 00:00:00 | 13243735578 | 郑州市 |
| S2023 | 特朗普 | 1999-06-21 00:00:00 | 13343735588 | 新乡市 |
+-------+-----------+---------------------+-------------+-----------+
2 rows in set (0.00 sec)
数据库系统原理与应用教程(039)—— MySQL 查询(一):SELECT 命令的语法分析相关推荐
- 数据库系统原理与应用教程(047)—— MySQL 查询(九):连接查询
数据库系统原理与应用教程(047)-- MySQL 查询(九):连接查询 目录 数据库系统原理与应用教程(047)-- MySQL 查询(九):连接查询 一.连接查询的语法格式 二.两张表的连接 1. ...
- 数据库系统原理与应用教程(070)—— MySQL 练习题:操作题 101-109(十四):查询条件练习
数据库系统原理与应用教程(070)-- MySQL 练习题:操作题 101-109(十四):查询条件练习 101.判断空值(1) 试卷答题记录表:exam_record(uid:用户ID,exam_i ...
- 数据库系统原理与应用教程(052)—— MySQL 的数据完整性(十四):交叉表查询(行列转换)
数据库系统原理与应用教程(052)-- MySQL 的数据完整性(十四):交叉表查询(行列转换) 目录 数据库系统原理与应用教程(052)-- MySQL 的数据完整性(十四):交叉表查询(行列转换) ...
- 数据库系统原理与应用教程(066)—— MySQL 练习题:操作题 71-81(十):连接查询
数据库系统原理与应用教程(066)-- MySQL 练习题:操作题 71-81(十):连接查询 71.连接查询(1) 数据表:Customers,包含顾客名称:cust_name.顾客 id:cust ...
- 数据库系统原理与应用教程(077)—— MySQL 练习题:操作题 168-172(二十一):综合练习
数据库系统原理与应用教程(077)-- MySQL 练习题:操作题 168-172(二十一):综合练习 168.分组统计(1) 该题目使用的表和数据如下: /* DROP TABLE IF EXIST ...
- 数据库系统原理与应用教程(074)—— MySQL 练习题:操作题 141-150(十八):综合练习
数据库系统原理与应用教程(074)-- MySQL 练习题:操作题 141-150(十八):综合练习 141.求名次(1) 该题目使用的表和数据如下: /* drop table if exists ...
- 数据库系统原理与应用教程(073)—— MySQL 练习题:操作题 131-140(十七):综合练习
数据库系统原理与应用教程(073)-- MySQL 练习题:操作题 131-140(十七):综合练习 131.子查询(1) 该题目使用的表和数据如下: /* drop table if exists ...
- 数据库系统原理与应用教程(058)—— MySQL 练习题(二):单选题
数据库系统原理与应用教程(058)-- MySQL 练习题(二):单选题 1.在成绩表中查询绩点在 3.7-4.0 之间,并且挂科数为 0 的学生的所有信息.下列SQL语句不正确的是(D). A.SE ...
- 数据库系统原理与应用教程(023)—— MySQL 创建数据表的各种方法总结
数据库系统原理与应用教程(023)-- MySQL 创建数据表的各种方法总结 目录 数据库系统原理与应用教程(023)-- MySQL 创建数据表的各种方法总结 一.使用 create table 命 ...
- 《数据库系统原理及应用教程》(苗雪兰等,第五版) 实验五:数据库的组合查询和统计查询实验
阅读前注意: 1. 本实验报告配套<数据库系统原理及应用教程>(苗雪兰等,第五版) 实验五:数据库的组合查询和统计查询实验(书上10.4节以及第六章部分内容),书本中采用Microsoft ...
最新文章
- (转)使用 Spring缓存抽象 支持 EhCache 和 Redis 混合部署
- request对象方法详解
- 河池学院计算机与信息工程学院官网 领导,关于成立我院宣传工作领导小组的方案...
- php 函数返回多个值
- Java:数列排序 给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
- 77种互联网盈利创新模式(3)
- kafka java客户端消息的分区与缓存发送
- 最长重复子串_3. 无重复字符的最长子串
- React入门基础+练习 (一)
- 【倒计时10day】看雪论坛精华优秀文章分享与点评
- java web代码混淆_JAVA WEB 项目的代码混淆
- python刷网易云_如何用Python爬取网易云歌曲?秘诀在这~
- 安装英伟达显卡旧版驱动
- 软考软件设计师中级考试(二)——操作系统基本原理
- Cadence PSpice 仿真5:运放噪声仿真实战图文教程
- VMWARE启动失败
- Python可配置爬虫_自定义IP+数据库+日志+分类+分页(代理IP破解反爬虫)
- 2021年第4季度记账理财应用监测,头部集聚加强,领跑者转型发展
- 喜羊羊与灰太狼java_java swing实现喜羊羊与灰太狼推箱子游戏附带视频开发教程...
- js原生ajax写法
热门文章
- python 猿编程模块(一)ybc_speech
- 结构建模设计——Solidworks软件之特征成型中拉伸凸台基体与设计树应用实战总结
- 根证书、服务器证书、用户证书的区别
- 【5号课堂】scratch制作电子生日贺卡
- 3D模型欣赏:《magician》次时代 美女 精灵
- IEEE论文检测的字体未嵌入问题Times New Roman,Bold, Times New Roman,Italic is not embedded解决方法
- 德国GMX Email免费邮箱服务65GB超大邮件存储空间
- python获取网页验证码cookie_python接口自动化(十三)--cookie绕过验证码登录(详解)(转载)...
- Google 2018 IO 大会要点
- react实战笔记172:navigate组件