内容正文:
《MySQL数据库原理与应用》
(清华大学出版)
同步教学
1
第7章 数据查询
2
本章概述
数据查询是数据库操作中最常用也是最重要的操作,是指从数据库中获取所需要的数据。在MySQL中使用SELECT语句来查询数据。通过SELECT语句查询数据,有不同的查询方式。不同的查询方式可以获得不同的数据,开发人员可以根据需求选择不同的查询方式。
3
本章学习目标
掌握SELECT查询的语法结构,通过SELECT语句查询所有字段、指定字段和指定数据的操作;
掌握按条件查询数据的方法;
掌握常用的高级查询方式,例如,对查询结果排序、分组查询、使用LIMIT限制查询;
掌握在查询过程中使用聚合函数进一步对查询结果进行加工;
了解连接查询、子查询的操作,以及合并查询结果;
掌握在查询过程中定义表和字段的别名;
掌握常用的正则表达式在查询中的应用。
4
目录
01
02
03
04
高级查询
按条件查询
聚合函数查询
基本查询语句
05
连接查询
06
子查询
07
合并查询结果
定义表和字段的表明
08
使用正则表达式查询
09
5
基本查询语句
7.1.1 SELECT语句
SELECT语句是最常用的查询语句,它的使用方式有简单的,也有复杂的。SELECT语句的基本语法如下。
SELECT selection list //要查询的内容,选择哪些列
FROM 数据表名 //指定数据表
WHERE primary_constraint //查询时需要满足的条件,行必须满足的条件
GROUP BY grouping_columns //如何对结果进行分组
ORDER BY sortingcloumns //如何对结果进行排序
HAVING secondary_constraint //查询时满足的第二条件
LIMIT count //限定输出的查询结果
6
基本查询语句
7.1.1 SELECT语句-使用SELECT语句查询单个数据表
使用SELECT语句从某个数据表查询数据时,首先要确定要查询的列。“*”代表所有的列。例如,查询db_library数据库的tb_admin表中的所有数据,代码如下。
USE db_library;
SELECT * FROM tb_admin;
查询结果如图所示。
7
基本查询语句
7.1.1 SELECT语句-查询数据表中的指定列
查询数据表中的多列,只要在SELECT后面指定要查询的列名即可,多列之间用“,”分隔。例如,查询tb_admin表中的admin_id和username列数据:
SELECT admin_id,username FROM tb_admin;
查询结果如图所示。
8
基本查询语句
7.1.1 SELECT语句-从一个或多个表中获取数据
确定所要查询的数据在哪个表中,在对多个表进行查询时,同样使用“,”对多个表进行分隔。例如,从tb_book表和tb_category表中查询出tb_book.book_id、tb_book.bookname、tb_category.cat_name和tb_book.price字段的值:
SELECT tb_book.book_id,tb_book.bookname,tb_category.cat_name,tb_book.price from tb_category,tb_book WHERE tb_book.cat_id=tb_category.cat_id;
查询结果如图所示。
9
基本查询语句
7.1.2 查询所有字段
确定所要查询的数据在哪个表中,在对多个表进行查询时,同样使用“,”对多个表进行分隔。例如,从tb_book表和tb_category表中查询出tb_book.book_id、tb_book.bookname、tb_category.cat_name和tb_book.price字段的值:
SELECT tb_book.book_id,tb_book.bookname,tb_category.cat_name,tb_book.price from tb_category,tb_book WHERE tb_book.cat_id=tb_category.cat_id;
查询结果如图所示。
10
基本查询语句
7.1.3 查询指定字段
查询指定字段的数据可以使用下面的语法格式:
SELECT 字段名 FROM 表名;
如果查询多个字段,可以使用“,”对字段进行分隔。
例如,查询图书信息表tb_book中图书的名称、作者、价格、图书唯一识别码:
SELECT bookname,author,price,ISBN FROM tb_book;
11
基本查询语句
7.1.4 查询指定数据
如果要从很多记录中查询出指定的记录,则需要设定查询的条件。设定查询条件应用的是WHERE子句,该子句可以实现很多复杂的条件查询。例如,查询名称为Romero的管理员:
SELECT * FROM tb_admin WHERE username='Romero';
12
按条件查询
7.2.1 带关系运算符的查询
带关系运算符的查询,也就是将MySQL支持的关系运算符引入数据库查询中。例如,从图书管理数据库db_library的图书信息表tb_book中,查询定价price大于40元的图书。语句如下:
SELECT bookname,author,price FROM tb_book WHERE price>40;
13
按条件查询
7.2.2 带IN关键字的查询
关键字IN可以判断某个字段的值是否在指定的集合中。如果字段的值在集合中,则满足查询条件,返回该字段所属记录;如果不在集合中,则不满足查询条件,不返回该记录。
语法格式如下。
SELECT * FROM 表名 WHERE 条件 [NOT] IN(元素1,元素2,…,元素n);
例如:
SELECT book_id,bookname,author FROM tb_book WHERE author IN('明日科技', '刘丹冰');
14
按条件查询
7.2.3 带BETWEEN AND关键字的查询
关键字BETWEEN AND可以判断某个字段的值是否在指定的范围内。如果字段的值在指定范围内,则满足查询条件,该记录将被查询出来;如果不在指定范围内,则不满足查询条件。其语法如下。
SELECT * FROM 表名 WHERE 条件 [NOT] BETWEEN 取值1 AND 取值2;
例如:
SELECT bookname,author,price FROM tb_book WHERE price BETWEEN 30 AND 40;
15
按条件查询
7.2.4 空值查询
IS NULL关键字可以用来判断字段的值是否为空值(NULL)。例如,为图书信息表tb_book添加test字段,然后插入若干数据值,语句如下:
ALTER TABLE tb_book ADD test VARCHAR(50) NULL;
16
按条件查询
7.2.5 用关键字DISTINCT去除结果中的重复行
使用DISTINCT关键字可以去除查询结果中的重复记录,语法格式如下。
SELECT DISTINCT 字段名 FROM 表名;
例如,要查看tb_book表中有哪些书架上有书,语句如下:
SELECT DISTINCT bookcase FROM tb_book;
17
按条件查询
7.2.6 带LIKE关键字的查询
LIKE属于较常用的比较运算符,可用于实现模糊查询。它有两种通配符:“%”和下画线“_”。
“%”可以匹配一个或多个字符,可以代表任意长度的字符串,长度可以为0。例如,“明%技”表示以“明”开头、以“技”结尾的任意长度的字符串。该字符串可以代表明日科技、明日编程科技、明日图书科技等字符串。
“_”只匹配一个字符。例如,m_n表示以m开头、以n结尾的3个字符。中间的“_”可以是任意一个字符。
18
按条件查询
7.2.7 带AND关键字的多条件查询
AND关键字可以用来联合多个条件进行查询。使用AND关键字时,只有同时满足所有查询条件的记录才会被查询出来;如果不满足查询条件中的一个,那么这样的记录将被排除。AND关键字的语法格式如下。
SELECT * FROM 数据表名 WHERE 条件1 AND 条件2 […AND 条件表达式n];
判断输入的管理员账号和密码是否存在:
SELECT book_id,bookname,author FROM tb_book WHERE bookname LIKE '%GO%' AND author='刘丹冰';
19
按条件查询
7.2.8 带OR关键字的多条件查询
使用OR关键字时,只要满足查询条件中的一个,那么此记录就会被查询出来。例如,根据作者查询图书信息:
SELECT book_id,bookname,author FROM tb_book WHERE author='明日科技' OR author='刘丹冰';
20
7.3 高级查询
使用ORDER BY关键字可以对查询的结果进行升序(ASC)或降序(DESC)排列。
ORDER BY 字段名 [ASC|DESC];
ASC表示按升序排列,DESC表示按降序排列。例如:
SELECT book_id,bookname,price FROM tb_book ORDER BY price DESC;
7.3.1 对查询结果排序
21
7.3 高级查询
GROUP BY子句可以将数据划分到不同的组中,实现对记录进行分组查询。例如:使用GROUP BY关键字对tb_book表中bookcase字段进行分组查询,语句如下。
SELECT bookcase,COUNT(*) FROM tb_book GROUP BY bookcase;
此外,还可以按多个字段进行分组。
7.3.2 分组查询
22
7.3 高级查询
LIMIT子句可以对查询结果的记录条数进行限定,控制输出的行数。例如:
SELECT book_id,bookname,price FROM tb_book ORDER BY price DESC LIMIT 3;
7.3.3 使用LIMIT限制查询结果数量
23
聚合函数查询
返回选择集合中所有行的数目,包含NULL值的行:
SELECT COUNT(*) FROM tb_book;
COUNT函数
24
聚合函数查询
SUM()函数可以求出表中某个数值类型字段取值的总和。例如:使用SUM()函数统计tb_book表中总金额字段(total)的总和,语句如下。
SELECT SUM(total) FROM tb_book;
SUM函数
25
聚合函数查询
AVG()函数可以求出表中某个数值类型字段取值的平均值。例如:
使用AVG()函数求tb_book表中图书价格(price)字段值的平均值,语句如下。
SELECT AVG(price) FROM tb_book;
AVG函数
26
聚合函数查询
MAX()函数可以求出表中某个数值类型字段取值的最大值。例如,使用MAX()函数查询tb_book表中price字段值的最大值,语句如下。
SELECT MAX(price) FROM tb_book;
MAX函数
27
聚合函数查询
使用MIN()函数查询tb_book表中price字段值的最小值。查询语句如下。
SELECT MIN(price) FROM tb_book;
MIN函数
28
连接查询
内连接(INNER JOIN)是SQL中的一种连接类型,用于将两个或多个表中的记录根据某个条件进行匹配,并返回匹配的记录。
内连接可以分为几种类型:
等值连接。在连接条件中使用等于号(=)运算符比较被连接列的列值。
非等值连接。在连接条件中使用除等于运算符以外的其他比较运算符,如大于、小于等。
自连接。将一张表看作两张表,通过别名区分,然后进行连接查询。
内连接查询
29
连接查询
【例7-22】使用内连接查询图书的借阅信息。代码如下。
SELECT tb_borrow.book_id,tb_book.bookname,tb_borrow.borrowTime,tb_borrow.backTime,tb_borrow.ifback FROM tb_book,tb_borrow WHERE tb_borrow.book_id=tb_book.book_id;
内连接查询
30
连接查询
外连接(Outer Join)是一种SQL JOIN操作,它允许从一个表中选择所有的记录,而无论在另一个表中是否有匹配的记录。如果记录在另一个表中没有匹配,那么结果集中的值为NULL。
在左外连接查询时,查询左表所有数据,以及两张表交集部分的数据。语法格式如下:
SELECT 字段列表 FROM 表1 LEFT OUTER JOIN 表2 ON 条件…;
右外连接(RIGHT JOIN)和左外连接恰好相反。右外连接包括右边的所有数据,以及两张表交集部分数据。表中不符合条件的数据,在相应列中填充NULL值。
外连接查询
31
子查询
IN运算符可以检测结果集中是否存在某个特定的值,如果检测成功,则执行外部的查询。
SELECT book_id,bookname,author FROM tb_book WHERE book_id IN(SELECT book_id FROM tb_borrow);
带IN关键字的子查询
32
子查询
从归还表tb_back中查询图书编号book_id等于1002的管理员(operator),然后查询tb_admin表中姓名username为该管理员的信息,代码如下。
SELECT * FROM tb_admin WHERE username = ( SELECT operator FROM tb_back WHERE book_id=1002);
带比较运算符的子查询
33
子查询
应用带EXISTS关键字的子查询实现查询已经被借阅的图书的信息,代码如下。
SELECT book_id,bookname,author FROM tb_book WHERE EXISTS (SELECT * FROM tb_borrow WHERE tb_borrow.book_id=tb_book.book_id);
带EXISTS关键字的子查询
34
子查询
使用ANY关键字时,只要满足内层查询语句返回的结果中的任意一个,就可以通过该条件来执行外层查询语句。语法格式如下。
列名 比较运算符 ANY(子查询)
例如,从图书信息表tb_book中查询出非最低价格的全部图书信息,主要是通过带ANY关键字的子查询实现查询非最低图书价格的图书信息,示例代码如下。
SELECT book_id,bookname,author,price FROM tb_book WHERE price > ANY(SELECT Min(price) FROM tb_book);
带ANY关键字的子查询
35
子查询
使用ALL关键字时,只有满足内层查询语句返回的所有结果,才可以执行外层查询语句。语法格式如下。
列名 比较运算符 ALL(子查询)
例如,查询比图书编号1001价格高的全部图书信息,主要是通过带ALL关键字的子查询实现,示例代码如下。
SELECT book_id,bookname,author,price FROM tb_book WHERE price > ALL(SELECT price FROM tb_book WHERE book_id=1001);
带ALL关键字的子查询
36
合并查询结果
使用UNION关键字可以将多个结果集合并到一起,并且会去除相同记录。假设有一个与归还表tb_back结构相同的数据表tb_back_copy1,查询结果如图所示。
7.7.1 使用UNION关键字
37
合并查询结果
下面使用UNION关键字合并两个表的查询结果,语句如下。
SELECT * FROM tb_back UNION SELECT * FROM tb_back_copy1;
查询结果如图所示。结果显示,所有结果被合并,重复值被去除。
7.7.1 使用UNION关键字
38
合并查询结果
UNION ALL关键字的使用方法类似于UNION关键字,也是将多个结果集合并到一起,但是该关键字不会去除相同记录。下面使用UNION ALL关键字合并查询结果,但是不去除重复值,代码如下。
SELECT * FROM tb_back UNION ALL SELECT * FROM tb_back_copy1;
7.7.2 使用UNION ALL关键字
39
定义表和字段的别名
使用左连接查询实现查询图书的完整信息,并为图书信息表tb_book指定别名为book,为图书类别表tb_category指定别名为category。
具体代码如下。
SELECT book.bookname,book.author,category.cat_name
FROM tb_book AS book
LEFT JOIN tb_category AS category ON book.cat_id= category.cat_id;
7.8.1 为表取别名
40
定义表和字段的别名
MySQL中为字段取别名的基本形式如下。
字段名 [AS] 别名
实现统计每本图书的借阅次数,并取别名为degree。在COUNT(*)后面接上AS关键字和别名degree即可,修改后的代码如下。
SELECT book_id,COUNT(*) AS borrow_numbers FROM tb_borrow GROUP BY book_id;
7.8.2 为字段取别名
41
使用正则表达式查询
在MySQL中,使用关键字REGEXP来匹配查询正则表达式,其基本形式如下。
字段名 REGEXP '匹配方式'
例如,从tb_admin表username字段中查询包含a、e、i、o和u这5个字母的任意一个的记录,代码如下。
SELECT admin_id,username FROM tb_admin
WHERE username REGEXP '[aeiou]';
42
本章小结
本章对MySQL数据库常见的查询方法进行了详细讲解,并通过大量的举例说明,帮助读者更好地理解所学知识的用法。在阅读本章时,读者应该重点掌握单表查询、连接查询、子查询和合并查询结果。本章学习的难点是使用正则表达式来查询。正则表达式的功能很强大,使用起来很灵活。希望读者能够查阅正则表达式的相关资料,以更加透彻地理解正则表达式。
43
谢谢观看
汇报人:秒出PPT
44
$$