『数据库』数据库SQL语言从入门到精通-Part 6-单表查询(快来PICK)

『数据库』数据库 SQL 语言从入门到精通-Part 6-单表查询(快来 PICK)

数据库从入门到精通合集(超详细,学习数据库必看)

查询操作是 SQL 语言中很重要的操作,我们今天就来详细的学习一下。

一、数据查询的语句格式

1
2
3
4
5
6
 SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式> ....] --可以选择多个列
FROM <表名或视图名>[, <表名或视图名> ....]--可以选择多个表或视图
[ WHERE <条件表达式> ] --查询什么条件的数据
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ] --按什么条件分组
[ ORDER BY <列名2> [ ASC|DESC ] ];--按什么条件排序

  • SELECT 子句:指定要显示的属性列
  • FROM 子句:指定查询对象(基本表或视图)
  • WHERE 子句:指定查询条件
  • GROUP BY 子句:
    细化聚集函数的作用对象
    • 未对查询结果分组,聚集函数将作用于整个查询结果
    • 对查询结果分组后,聚集函数将分别作用于每个组
    • 作用对象是查询的中间结果表
    • 按指定的一列或多列值分组,值相等的为一组

合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句。

例子:
BILL 表

Customer Quantity Date
张三 10 2020-3-19
李四 29 2020-3-19
王五 9 2020-3-19
张三 21 2020-3-19
王五 19 2020-3-20
执行SELECT Customer ,SUM(Quantity) FROM BILL GROUP BY Customer
我们会得到如下表
Customer Quantity
张三 31 2020-3-19
李四 29 2020-3-19
王五 28 2020-3-19
如果我们不加 GROUP BY 会得到这样一个表
Customer Quantity
张三 88 2020-3-19
李四 88 2020-3-19
王五 88 2020-3-19
张三 88 2020-3-19
王五 88 2020-3-20
当然 GROUP BY 也可以按多个列分组,即两个都想同时才会被分到一个组
还是对 BILL 表操作 SELECT Customer ,SUM(Quantity) FROM BILL GROUP BY Customer,Date
我们会得到如下表
Customer Quantity
张三 31 2020-3-19
李四 29 2020-3-19
王五 9 2020-3-19
王五 19 2020-3-20
  • HAVING 短语:
    筛选出只有满足指定条件的组
    例子:
    BILL 表
    Customer Quantity Date
    张三 10 2020-3-19
    李四 29 2020-3-19
    王五 9 2020-3-19
    张三 21 2020-3-19
    王五 19 2020-3-20
    我们查询购买总量小于 30 的 Customer
    1
    2
    3
    SELECT  Customer,SUM(Quantity)  From BILL
    GROUP BY Customer
    HAVING SUM(Quantity)>30
    我们会得到如下:
    Customer Quantity
    张三 31
  • ORDER BY 子句:对查询结果表按指定列值的升序或降序排序
    还是对 BILL 表操作
    Customer Quantity Date
    张三 10 2020-3-19
    李四 29 2020-3-19
    王五 9 2020-3-19
    张三 21 2020-3-19
    王五 19 2020-3-20
    我们想按照购买总数量排列查询结果
    1
    2
    3
    SELECT Customer ,SUM(Quantity) FROM BILL
    GROUP BY Customer
    ORDER BY SUM(Quantity) ASC
    我们会得到如下表
    Customer Quantity
    王五 28
    李四 29
    张三 31

ORDER BY 子句

  • 可以按一个或多个属性列排序
  • 升序:ASC;降序:DESC;缺省值为升序
  • 当排序列含空值时
  • ASC:排序列为空值的元组最后显示
  • DESC:排序列为空值的元组最先显示

二、单表查询

刚才在介绍那几个保留字的时候,我们简单的举了几个查询的例子,现在我们详细系统的介绍一下,有点重复,但是比较基础,加深印象。

1.选择表中的若干列查询

选择某几列查询:

1
2
SELECT <1>,<2>......
FROM <数据表>;

选择全部列查询:
当然我们可以,把所有的列一一列举,我们也可以使用SELECT *

1
2
SELECT  *
FROM <数据表>

举例:
还是 BILL 表

Customer Quantity Date
张三 10 2020-3-19
李四 29 2020-3-19
王五 9 2020-3-19
张三 21 2020-3-19
王五 19 2020-3-20
1
SELECT Customer From BILL

得到如下表

| Customer|
|–|–|–|
| 张三|10 |2020-3-19
| 李四| 29 |2020-3-19
| 王五| 9 |2020-3-19
| 张三| 21 |2020-3-19
| 王五|19 |2020-3-20
执行:

1
2
3
SELECT Customer ,Quantity,Date FROM BILL
--或者
SELECT * FROM BILL

得到如下结果

Customer Quantity Date
张三 10 2020-3-19
李四 29 2020-3-19
王五 9 2020-3-19
张三 21 2020-3-19
王五 19 2020-3-20
2.查询经过计算的值

之前我们给出了 SELECT 标准格式:

1
2
3
4
5
6
 SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式> ....] --可以选择多个列
FROM <表名或视图名>[, <表名或视图名> ....]--可以选择多个表或视图
[ WHERE <条件表达式> ] --查询什么条件的数据
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ] --按什么条件分组
[ ORDER BY <列名2> [ ASC|DESC ] ];--按什么条件排序

其中目标表达式可以为:

  • 算术表达式
  • 字符串常量
  • 函数
  • 列别名

例子:
Students 表

Name Birth
李勇 1999
刘晨 1997
王敏 1996
张立 1998

我们查询每个人的年龄:

1
2
SELECT NAME,2020-Birth
FROM Student;

得道如下的查询结果:

Name 2020-Birth
李勇 21
刘晨 23
王敏 24
张立 22

在查询中添加新的字符串列
例子

Name Birth
李勇 1999
刘晨 1997
王敏 1996
张立 1998
1
2
SELECT  Name,'Birth is:',Birth
FROM Students ;

结果:

Name ‘Birth is:’ Birth
李勇 Birth is: 1999
刘晨 Birth is: 1997
王敏 Birth is: 1996
张立 Birth is: 1998

查询中显示列别名
例子
Students 表

Name Birth
李勇 1999
刘晨 1997
王敏 1996
张立 1998
1
2
SELECT  Name 姓名, Birth 生日
FROM Students ;

结果

姓名 生日
李勇 1999
刘晨 1997
王敏 1996
张立 1998
3.选择表中的若干元组(行)

元组(tuple)是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组,每列就是一个属性。 在二维表里,元组也称为行。

DISTINCT 语句:
指定 DISTINCT 关键词,去掉表中重复的行
例子:
BILL 表

Customer Quantity Date
张三 10 2020-3-19
李四 29 2020-3-19
王五 9 2020-3-19
张三 21 2020-3-19
王五 19 2020-3-20

我们执行以下语句查看区别:

1
SELECT DISTINCT Customer FROM BILL

| Customer |
| ——– | — | ——— |
| 张三 | 10 | 2020-3-19 |
| 李四 | 29 | 2020-3-19 |
| 王五 | 9 | 2020-3-19 |

如果不加 DISTINCT,结果如下:

| Customer|
|–|–|–|
| 张三|10 |2020-3-19
| 李四| 29 |2020-3-19
| 王五| 9 |2020-3-19
| 张三| 21 |2020-3-19
| 王五|19 |2020-3-20

作用显而易见

查询满足条件的元组:

常用的查询条件 谓词
比 较 =,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运算符
确定范围 BETWEEN AND,NOT BETWEEN AND
确定集合 IN,NOT IN
字符匹配 LIKE,NOT LIKE
空 值 IS NULL,IS NOT NULL
多重条件(逻辑运算) AND,OR,NOT

这次我们多举几个例子:
Student 表

Sname Sage Sdept Sgrade Ssex
张三 18 C.S 80 1
李四 18 C.S 72 0
王五 17 I.C.S 63 0
韩六 18 C.S 98 1
周七 19 I.C.S 34 0
赵八 20 C.S 60 1
以下所有查询的基本表都默认为 Student 表

例一: 查询计算机科学系全体学生的名单

1
2
3
SELECT Sname
FROM Student
WHERE Sdept='C.S.'

结果:

|Sname|
|–|–|–|–|–|
|张三|18|C.S|90|1
|李四|18|C.S|90|0
|韩六|18|C.S|90|1
|赵八|20|C.S|90|1

例二: 查询所有年龄在 18 岁以上的学生姓名及其年龄。

1
2
3
SELECT Sname,Sage
FROM Student
WHERE Sage>18

结果

|Sname|Sage
|–|–|–|–|–|
|周七|19|I.C.S|90|0
|赵八|20|C.S|90|1

BETWEEN…AND…语句
例三: 查询年龄在 18~20 岁(包括 18 岁和 20 岁)之间的学生的姓名、系别和年龄

1
2
3
SELECT Sname,Sage,Sdept
FROM Student
WHERE Sage BETWEEN 18 AND 20

结果

|Sname|Sage|Sdept|
|–|–|–|–|–|
|张三|18|C.S|80|1
|李四|18|C.S|72|0
|韩六|18|C.S|98|1
|周七|19|I.C.S|34|0
|赵八|20|C.S|60|1
例四: 查询年龄在 18~20 岁(包括 18 岁和 20 岁)之间的学生的姓名、系别和年龄

1
2
3
SELECT Sname,Sage,Sdept
FROM Student
WHERE Sage NOT BETWEEN 18 AND 20

结果

|Sname|Sage|Sdept|
|–|–|–|–|–|
|王五|17|I.C.S|63|0

IN/NOT IN 语句
例四: 查询年龄为 17 和 20 岁的学生姓名,年龄及专业

1
2
3
SELECT Sname,Sage,Sdept
FROM Student
WHERE Sage IN (1720);

结果

|Sname|Sage|Sdept|
|–|–|–|–|–|
|王五|17|I.C.S|63|0
|赵八|20|C.S|60|1

例五: 查询年龄不为 17 和 20 岁的学生姓名,年龄及专业

1
2
3
SELECT Sname,Sage,Sdept
FROM Student
WHERE Sage NOT IN (1720);

| Sname | Sage | Sdept |
| —– | —- | —– | — | — |
| 张三 | 18 | C.S | 80 | 1 |
| 李四 | 18 | C.S | 72 | 0 |
| 韩六 | 18 | C.S | 98 | 1 |
| 周七 | 19 | I.C.S | 34 | 0 |

字符串匹配:
语法格式:
谓词:
[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
<匹配串>:指定匹配模板
匹配模板:固定字符串或含通配符的字符串
当匹配模板为固定字符串时,
可以用 = 运算符取代 LIKE 谓词
用 != 或 < >运算符取代 NOT LIKE 谓词

通配符:

通配符 描述
% 代表任意长度(长度可以为 0)的字符串
_ 仅替代一个字符
[charlist] 字符列中的任何单一字符
[^charlist]或者[!charlist] 不在字符列中的任何单一字符

例:
a%b 表示以 a 开头,以 b 结尾的任意长度的字符串。如 acb,addgb,ab 等都满足该匹配串
a*b 表示以 a 开头,以 b 结尾的长度为 3 的任意字符串。如 acb,afb 等都满足该匹配串
ESCAPE 短语:
当用户要查询的字符串本身就含有 % 或 * 时,要使用 ESCAPE ‘<换码字符>’ 短语对通配符进行转义。

类型 1: 匹配串为固定字符串
查询学号为 200215121 的学生的详细情况。

1
2
3
SELECT *
FROM Student
WHERE Sno LIKE200215121';

等价于:

1
2
3
SELECT  *
FROM Student
WHERE Sno = ' 200215121 '

类型 2: 匹配串为含通配符的字符串

查询所有姓刘学生的姓名、学号和性别。

1
2
3
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE ‘刘%’;

查询姓”欧阳”且全名为三个汉字的学生的姓名。

1
2
3
SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳__'

查询名字中第 2 个字为”阳”字的学生的姓名和学号。

1
2
3
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE ‘__阳%’;

查询所有不姓刘的学生姓名。

1
2
3
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE '刘%'

类型 3: 使用换码字符将通配符转义为普通字符

查询 DB_Design 课程的课程号和学分。

1
2
3
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design' ESCAPE '\‘;

查询以”DB_“开头,且倒数第 3 个字符为 i 的课程的详细情况。

1
2
3
SELECT  *
FROM Course
WHERE Cname LIKE 'DB\_%i_ _' ESCAPE ' \ ‘;

ESCAPE ‘\’ 表示“ \” 为换码字符
学过 C++的大家都知道\n 代表换行,\为转义字符。这里是说,我们通过 ESCAPE 语句将\定义为换码字符(可以理解为转义字符)

类型 4: 涉及空值的查询

谓词:IS NULL 或 IS NOT NULL 而且 “IS” 不能用 “=” 代替。
如果某些同学的信息不完整,比如在某个表中手机号未填写,那这位同学的元组中的手机号这一属性为 NULL;
要想查出这类同学的姓名我们可以执行以下操作

Student 表

Sname Sage Sdept Sgrade Ssex Spho
张三 18 C.S 80 1 12345678
李四 18 C.S 72 0 12345679
王五 17 I.C.S 63 0 12345680
韩六 18 C.S 98 1 NULL
周七 19 I.C.S 34 0 234234234
赵八 20 C.S 60 1 NULL
1
2
SELECT Sname,Spho From Student
WHERE Spho IS NULL;
Sname Spho
韩六 NULL
赵八 NULL

类型 5: 多重条件查询
逻辑运算符:
AND:且 连接前后两个条件都成立时表达式为真
OR:或 连接前后表达式有一个为真时表达式为真
AND 优先级大于 OR,可以加括号进行复合运算,进而改变优先级。

常用的查询条件 谓词
比 较 =,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运算符
确定范围 BETWEEN AND,NOT BETWEEN AND
确定集合 IN,NOT IN
字符匹配 LIKE,NOT LIKE
空 值 IS NULL,IS NOT NULL
多重条件(逻辑运算) AND,OR,NOT
可以连接上面表中的所有运算符,只要保证最后得到表达可以分辨真假有意义即可。

这个比较简单我们举一个例子:
查询 18 岁的学生且属于计算机科学专业的姓名,年龄,专业

Sname Sage Sdept Sgrade Ssex Spho
张三 18 C.S 80 1 12345678
李四 18 C.S 72 0 12345679
王五 17 I.C.S 63 0 12345680
韩六 18 C.S 98 1 NULL
周七 19 I.C.S 34 0 234234234
赵八 20 C.S 60 1 NULL
1
2
SELECT Sname,Sage,Sdept FROM Students
WHERE Sage=18 AND Sdept='C.S.';

| Sname | Sage | Sdept |
| —– | —- | —– | — | — | ——– |
| 张三 | 18 | C.S | 80 | 1 | 12345678 |
| 李四 | 18 | C.S | 72 | 0 | 12345679 |
| 韩六 | 18 | C.S | 98 | 1 | NULL |

4.聚集函数

计数
SQL COUNT(column_name) 语法
COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):

1
SELECT COUNT(column_name) FROM table_name

SQL COUNT(*) 语法
COUNT(*) 函数返回表中的记录数:

1
SELECT COUNT(*) FROM table_name

SQL COUNT(DISTINCT column_name) 语法
COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:

1
SELECT COUNT(DISTINCT column_name) FROM table_name

例:
查询学生总人数。

1
2
SELECT COUNT(*)
FROM Student;

查询选修了课程的学生人数。

1
2
SELECT COUNT(DISTINCT Sno)
FROM SC

计算总和

SQL SUM() 语法

1
SELECT SUM(column_name) FROM table_name

开头举过例子,这里就不再重复赘述。

计算平均值

AVG 函数返回数值列的平均值。NULL 值不包括在计算中。

SQL AVG() 语法

1
SELECT AVG(column_name) FROM table_name


计算 1 号课程的学生平均成绩。

1
2
3
SELECT AVG(Grade)
FROM SC
WHERE Cno=1 ’;

最大最小值

MAX() 函数和 MIN()函数
MAX 函数返回一列中的最大值,MIN 函数返回一列中的最小值。NULL 值不包括在计算中。

SQL 中的语法

1
2
SELECT MAX(column_name) FROM table_name
SELECT MIN(column_name) FROM table_name

MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。
例:
查询选修 1 号课程的学生最高分数。

1
2
3
SELECT MAX(Grade)
FROM SC
WHERE Cno=1 ’;



写在最后:
我叫风骨散人,名字的意思是我多想可以不低头的自由生活,可现实却不是这样。家境贫寒,总得向这个世界低头,所以我一直在奋斗,想改变我的命运给亲人好的生活,希望同样被生活绑架的你可以通过自己的努力改变现状,深知成年人的世界里没有容易二字。目前是一名在校大学生,预计考研,热爱编程,热爱技术,喜欢分享,知识无界,希望我的分享可以帮到你!
如果有什么想看的,可以私信我,如果在能力范围内,我会发布相应的博文!
谢谢大家的阅读!😘


『数据库』数据库SQL语言从入门到精通-Part 6-单表查询(快来PICK)
https://chiamzhang.github.io/2024/06/29/『数据库』数据库SQL语言从入门到精通-Part 6-单表查询(快来PICK)/
Author
Chiam
Posted on
June 29, 2024
Licensed under