数据库系统概论——3.第三章关系数据库标准语言SQL——3.4.数据查询[学习笔记]

3.4.数据查询

查询语句是数据库的核心操作。


语法格式:

SELECT [ALL|DISTINCT] <目标列表达式>
            [<目标列表达式>]FROM <表名或视图名>[<表名或视图名> ][ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ]

各部分的含义

  • SELECT子句:指定要显示的属性列

  • FROM子句:指定查询对象(基本表或视图)

  • WHERE子句:指定查询条件。 根据该条件筛选出满足条件的元组。

  • GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用集函数。

  • HAVING 语句: 筛选出满足指定条件的

  • ORDER BY子句: 对查询结果表按照指定列指的进行排序(升序或降序)


对比关系代数:

  • select 像关系代数里面的投影
  • where像关系代数里面选择

3.4.1. 单表查询

就是仅涉及一个表的查询。


1. 选择表中的若干列

数据库系统概论——3.第三章关系数据库标准语言SQL——3.4.数据查询[学习笔记]_第1张图片

Student表

①查询指定列: 如,查询学生表中的全部学生的学号和姓名

select sno,sname from Student;

*选择所有的列

select * from <表名>

③查询经过计算的值

select子句中的<目标列表达式>不仅可以是属性列, 也可是:

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

算数表达式,如:select Sname, 2020-Sage From Student。 第二列, 是一个计算表达式, 用来计算出几年学生的出生日期。


字符串常量, 函数:查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。

SELECT Sname,'Year of Birth', 2020-Sage, LOWER(Sdept) FROM Student;

数据库系统概论——3.第三章关系数据库标准语言SQL——3.4.数据查询[学习笔记]_第2张图片


列别名: 给上面的查询加个列别名。

数据库系统概论——3.第三章关系数据库标准语言SQL——3.4.数据查询[学习笔记]_第3张图片

2. 选择表中的若干元组

数据库系统概论——3.第三章关系数据库标准语言SQL——3.4.数据查询[学习笔记]_第4张图片

SCourse表(选课表)

①消除取值重复的行

使用DISTINCT短语。

select DISTINCT Sno from Scourse;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BGJDyO59-1588669036189)(D:\笔记图片集\1588665622224.png)]

②查询满足条件的元组

通过where子句实现。where子句常用的查询条件如下:

数据库系统概论——3.第三章关系数据库标准语言SQL——3.4.数据查询[学习笔记]_第5张图片

如:查询出Cno课分数大于80的学生学号

select Sno from SCourse where Cno='102' and GRADE > 80;

确定范围,查询年龄在19~23(包括19和23)的学生姓名和学号

select Sno, Sname from Student where Age BETWEEN 19 AND 23

确定集合,谓词IN 用来表示属性表示属于指定集合的元组

select Sno, Sname from Student where Age IN (19 ,20, 25)

字符匹配

语法格式:

[NOT] LIKE<匹配串>[ESCAPE<换码字符>]

通配符:

  • % (百分号) 代表任意长度(长度可以为0)的字符串例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串
  • _ (下横线) 代表任意单个字符例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串

ESCAPE语句:当用户要查询的字符串本身就含有 % 或 _ 时,要使用ESCAPE ‘<换码字符>’ 短语对通配符进行转义。


如果LIKE后面不会含有通配符可以用= 取代。 同理 NOT LIKE 可以用!=取代


查询姓刘的同学

select * from Student Where Sname LIKE '刘_'

注意:根据数据库字符集的不同, 要做出适当的改变。


转义查询:从某个表中查询名字叫S_的元组,_要转义

select * from table1 Where a='S\_' ESCAPE '\';

涉及空值的查询

查询102选修课, 成绩为空的学生学号

select Sno from SCourse Where Cno='102' and GRADE IS NULL;

数据库系统概论——3.第三章关系数据库标准语言SQL——3.4.数据查询[学习笔记]_第6张图片

IS NOT NULL 和IS NULL。注意IS不嫩用等号代替。

多重查询

用AND 或OR连接多个查询条件。

  • AND的优先级高于OR
  • 可以用括号改变优先级

如上面那个查询就是多重查询:

select Sno from SCourse Where Cno='102' and GRADE IS NULL;

③ORDER BY子句

ASC 升序[默认], DESC 降序.


这里要注意空值的位置。

select * from SCourse order By GRADE DESC;

数据库系统概论——3.第三章关系数据库标准语言SQL——3.4.数据查询[学习笔记]_第7张图片

按学号升序, 成绩降序

select * from SCourse order By Sno, GRADE DESC;

数据库系统概论——3.第三章关系数据库标准语言SQL——3.4.数据查询[学习笔记]_第8张图片

④聚集函数

  • 计数

    COUNT([DISTINCT|ALL] *)

    COUNT([DISTINCT|ALL] <列名>)

  • 计算总和

    SUM([DISTINCT|ALL] <列名>)

  • 计算平均值

    AVG([DISTINCT|ALL] <列名>)

  • 求最大值

    MAX([DISTINCT|ALL] <列名>)

  • 求最小值

    MIN([DISTINCT|ALL] <列名>)


如果指定DISTINCT短语,则表示在计算时要取消指定列中的重复值。如果不指定DISTINCT短语或指定ALL短语(默认), 则表示不取消重复值。

数据库系统概论——3.第三章关系数据库标准语言SQL——3.4.数据查询[学习笔记]_第9张图片

当聚集函数哟到空值时, 除了COUNT(*)外, 都跳过空值而只处理非空值。

如下:

数据库系统概论——3.第三章关系数据库标准语言SQL——3.4.数据查询[学习笔记]_第10张图片

⑤使用GROUP BY子句

按指定的一列或多列值分组,值相等的为一组;

对查询结果的分组的目的是为了细化聚集函数的作用对象。如果未分组聚集函数作用的是整个查询结果。 分组后, 聚集函数将作用于每一组, 即每一组都有一个函数值。


如:在选修表中按照学号分组, 查询每个学生选修课的数目

SELECT SNO, COUNT(*) FROM SCourse GROUP BY SNO;

数据库系统概论——3.第三章关系数据库标准语言SQL——3.4.数据查询[学习笔记]_第11张图片

HAVING短语与WHERE子句的区别

作用对象不同WHERE子句作用于基表或视图,从中选出满足条件的元组

HAVING短语作用于组,从中选出满足条件的

细化聚集函数的作用对象。如果未分组聚集函数作用的是整个查询结果。 分组后, 聚集函数将作用于每一组, 即每一组都有一个函数值。


如:在选修表中按照学号分组, 查询每个学生选修课的数目

SELECT SNO, COUNT(*) FROM SCourse GROUP BY SNO;

数据库系统概论——3.第三章关系数据库标准语言SQL——3.4.数据查询[学习笔记]_第12张图片

HAVING短语与WHERE子句的区别

作用对象不同WHERE子句作用于基表或视图,从中选出满足条件的元组

HAVING短语作用于组,从中选出满足条件的

你可能感兴趣的:(数据库)