当前位置:网站首页>数据库系统原理与应用教程(039)—— MySQL 查询(一):SELECT 命令的语法分析
数据库系统原理与应用教程(039)—— MySQL 查询(一):SELECT 命令的语法分析
2022-07-23 06:49:00 【睿思达DBA_WGX】
数据库系统原理与应用教程(039)—— MySQL 查询(一):SELECT 命令的语法分析
目录
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)
边栏推荐
- 回溯法解决 八皇后问题
- 数据库-视图详探
- Day 10 notes
- Probability meditation: 2. The quantitative rules
- Backtracking method to solve the eight queens problem
- Research on hardware architecture of Ti single chip millimeter wave radar xwr1642
- 决策树详解
- 机器学习,吴恩达逻辑回归
- Jenkins continuous integration error stderr: fatal: unsafe repository ('/home/water/water' is owned by someone else)
- Why choose AMD epyc for cloud solutions?
猜你喜欢

Ti single chip millimeter wave radar code walk (XXV) -- angular dimension (3D) processing flow

keepalived双机热备

ES6——周考题
![Shell运算符、$((运算式))” 或 “$[运算式]、expr方法、条件判断、test condition、[ condition ]、两个整数之间比较、按照文件权限进行判断、按照文件类型进行判断](/img/65/a735ca2c2902e3fc773dda79438972.png)
Shell运算符、$((运算式))” 或 “$[运算式]、expr方法、条件判断、test condition、[ condition ]、两个整数之间比较、按照文件权限进行判断、按照文件类型进行判断

Optimising a 3D convolutional neural network for head and neck computed tomography segmentation with

Interface test - simple interface automation test demo

高性能JVM的参数

Running matlab program on GPU

Client does not support authentication protocol requested by server; consider upgrading MySQL client

Error running ‘XXX‘: Command line is too long. Shorten command line for AudioTest or also ...
随机推荐
深入理解微信小程序的底层框架(一)
Charles' bag grabbing tool test practice
【可視化調度軟件】上海道寧為SMB組織帶來NETRONIC下載、試用、教程
Learn to use canvas to build line chart, bar chart and pie chart
Knowledge map: basic concepts
第七天筆記
解决MySQL向表中增加数据插入中文乱码问题
Wechat applet -- dynamically set the navigation bar color
ROS中引用和输出消息类型
About this pointer
SparkSQL设计及入门,220722,
Special lecture 5 combinatorial mathematics learning experience (long-term update)
Reference and output message types in ROS
离屏渲染 &FBO
2. Les règles quantitatives
Optimising a 3D convolutional neural network for head and neck computed tomography segmentation with
QT creator.Pro file adds the corresponding library according to the kit
PHP framework MVC class code audit
基于BIM+3DGIS的智慧城市基础设施管理
Learn about canvas