目录
通过之前的学习,已经能够创库表及进行相应的修改和删除,但是在日常生活中,用到最多的是把需要的数据从表中找出来。这就是这篇文章我要学习的内容。
查询:是在现有的数据表中,找到符合条件的记录行,将其提取出来,然后组成一个类似于表的结构体,返回给用户。
记录集:查询的结果就是记录集(结果集)。记录集是一张虚拟表,还可以使用SQL语句在记录集的基础上继续查询。
一,基本格式
语法如下:
sql
SELECT 列名或表达式
INTO 新表名 --创建新表并将结果集插入新表中
FROM 表名 --指定查询语句中所使用的表或视图
WHERE 查询条件 --设定检索条件。定义了源表中的行要满足SELECT语句的要求所必须达到的条件。只有符合条件的行才向结果集提供数据。即,不采用不符合条件的行数据。
GROUP BY 分组表达式 --分组子句
HAVING 分组条件 --和GROUP BY 一起使用,表示过滤组。
ORDER BY 列名或表达式 ASC升序/DESC降序 --为查询结果排序。
1,简单的SQL查询语句
最简单的查询语句由SELECT和FROM子句构成,如下👇查询数据表中所有列的数据(*)。
sql
SELECT * FROM students
SELECT * FROM dept
SELECT * FROM classes
SELECT * FROM courses
SELECT * FROM score
当然也可以只查找指定的列信息,将*号去掉,改成指定的列名即可。
这里以学生表为例,现在查询所有学生的学号sno,姓名sne,出生日期sbd:
sql
SELECT sno AS 学号,sne AS 姓名,sbd AS 出生日期 FROM students
其中,AS关键字用于给列起别名(表中的列名依旧没变),可知道询出来的信息具体是什么。
也省略AS关键字,使用空格,如下👇
sql
SELECT sno 学号,sne 姓名,sbd 出生日期 FROM students
或者是赋值的形式(使用'='号),语法如下:
sql
SELECT 别名=列名,...FROM 数据表名
sql
SELECT 学号=sno,姓名=sne,出生日期=sbd FROM students
2,关键字TOP
如果只想看数据表的前几条记录,可以使用TOP关键字,语法如下:
sql
SELECT TOP n 列名 AS 别名,...FROM 表名 --整数n:返回记录集的前n行或n%行
例如,我现在只想要看学号1~3,即前三个学生的学号sno,姓名sne,出生日期sbd
sql
SELECT TOP 3 sno AS 学号,sne AS 姓名,sbd AS 出生日期 FROM students
3,关键字DISTINCT
DISTINCT / dɪˈstɪŋkt /:不同的,有区别的;清楚的,明显的;确切的。
顾名思义,DISTINCT的作用就是消除记录集中的重复行,语法如下:
sql
SELECT DISTINCT 列名 FROM 表名
依旧是以学生表students为例,要求查找学生表中学生的班级编号有哪些(不同的班级编号),如果直不加DISTINCT关键字而直接使用列名进行查找,就会直接返回所有学生的班级编号(包括相同的班级编号),如下👇
如果在SELECT后面加上关键字DISTINCT之后,就会消除记录集中的重复行,如下👇
sql
SELECT DISTINCT cno AS 班级编号_D FROM students
二,模糊查询
之前的查询都是精确查询,即对查询字段的值有着准确完整的描述。有些时候记忆的东西多起来,就会容易忘掉细枝末节的部分,例如,学生表students中有李li姓同学,但是忘记ta具体叫什么,这个时候可以使用模糊查询来进行查找。在使用模糊查询之前,需要先认识SQL语言提供的通配符👇
1,通配符
带通配符的字符串就叫模式。
sql
SELECT 列名 AS 别名,...FROM 表名 WHERE 列名 LIKE '使用通配符查找关键字符'
可以看到模糊查询是基于LIKE关键字的WHERE子句。
|--------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 通配符 | 含义 |
| % | 零个或任意多个字符。 例如,给出模式"li%": 查询表中列以li(li为关键字符)开头的数据,后面带上零个或任意多个字符。如下👇找李li姓同学 sql SELECT sno AS 学号,sne AS 姓名,sbd AS 出生日期 FROM students WHERE sne LIKE 'li%'
也可以是模式"%wu ",包含字符"wu"的列数据。 sql SELECT sno AS 学号,sne AS 姓名,sbd AS 出生日期 FROM students WHERE sne LIKE '%wu'
|
| _ | 任意一个字符。 如果写一个下划线,则有一个字符,写两个,就有两个字符。例如: 对于模式"李_白",可以匹配的数据有: 李太白,李小白,李大白...... 而不能匹配:李太太白,李小小白,李大大白...... 如果要匹配:李xx白,则修改模式为:"李__白" --中间是两个下划线。 |
| [] | 方括号中列出的任意一个字符。 对于模式"X123[0,3,6]",可以匹配的数据有三种: X1230 ,X1233 ,X126 而不能匹配:X12311,..... |
| [^] | 任意一个没有出现在方括号中的字符。和[]相反。 |
[SQL语言提供的通配符]
三,对结果集排序
使用ORDER BY 子句可将查询结果按照指定的一个或多个列,进行升序或降序排序。语法如下:
sql
SELECT 查询列表 FROM 表名
ORDER BY 列名 | 表达式[ASC | DESC]
在默认情况下是升序排列,即如果想要对结果集进行升序排序,则ASC关键字可省略。而在降序排列的情况 下,DESC关键必须写。
被排序列可以是选择列表中的列,也可以不出现在选择列表中。
1,不含关键字DISTINCT
如下,查找对成绩表中的成绩进行降序排序,并返回对应的学生编号和课程编号:
可以看到,SELECT 语句选择了sno 和 cno两列,但排序是根据 成绩get列进行的,get可能并不出现在 SELECT 的选择列表中。
2,含关键字DISTINCT
需要注意的是:如果使用了DISTINCT关键字,ORDER BY 子句中的列必须出现在选择列表中,这是因为,DISTINCT 操作是基于选择列表中的列来判断是否有重复记录的。如果在 ORDER BY 中使用了不在 SELECT 列表中的列,SQL 引擎就无法确定如何对这些列进行去重或排序,因此会报错。
错误语句如下:
正确语句如下:
3,多列排序
可以根据多列进行排序,排列的优先级按照在ORDER BY后面出现的先后。
sql
SELECT * FROM score
ORDER BY cno ASC, get DESC;
有问题请在评论区留言或者是私信我,回复时间不超过一天。