三、SQL的查询

关于分号

一条SQL语句结束,结尾必须加分号 ( ; )

如果在结尾没有加分号的话,一般认为该语句没有结束。

正因如此,SQL语句可以换行增加可读性,不会产生语法错误。

本节的数据表

这里列出了本节的教程中出现的所有数据表。

表名:学生表

学号 名称 年龄 班级
1 小明 20 一班
2 小张 21 一班
3 小红 21 二班

完整语法

1
2
3
4
5
6
7
SELECT [DISTINCT] [TOP n] 字段列表
[FROM 数据源]
[WHERE 条件]
[GROUP BY 分组表达式]
[HAVING 条件]
[ORDER BY 排序项 ASC/DESC];

基本查询

要查询数据库表的数据,我们使用如下的SQL语句:

1
SELECT * FROM 数据表名称;

在字段列表使用*号匹配所有的字段。
此语句可以查询出数据表中的所有记录,例如以下数据表。

当我们执行以下语句时,表中的所有数据都会被查询出来:

1
SELECT * FROM 学生表;

查询结果:

学号 名称 年龄 班级
1 小明 20 一班
2 小张 21 一班
3 小红 21 二班

投影查询

在某些时候,我们并不想要列出所有的字段列,我们可能只想要知道学生的名字和班级,我们就可以使用投影查询:

基本语法

1
SELECT 字段列表 from 表名;

例如,这节开头提到的例子,就可以使用以下SQL来实现。

1
SELECT 名称,班级 FROM 学生表;

查询结果如下:

名称 班级
小明 一班
小张 一班
小红 二班

条件查询

如果想对查询添加一些条件,比如想要查询年龄为21岁或者名字叫小红的记录,就得使用条件查询。

语法:

1
SELECT 字段列表 FROM 条件表达式;

例如查询班级是一班的学生姓名,可以构造以下的SQL语句:

1
SELECT 姓名,班级 FROM 学生表 WHERE 班级 = "一班";

注意:值如果是字符串类型,需要加上双引号( “ )。

执行结果:

名称 班级
小明 一班
小张 一班

高级条件查询

这一节将介绍高级的条件查询来满足更多的需求。

AND操作符

可以用<条件1> AND <条件2>表达满足条件1并且满足条件2。

例如筛选出年龄20岁的的一班学生,可以使用以下语句:

1
SELECT * FROM 学生表 WHERE 年龄 = 20 AND 班级 = 一班;
学号 名称 年龄 班级
1 小明 20 一班

OR操作符

使用<条件1> OR <条件2>来表达满足条件1或者条件2,两个条件仅需要满足一个,例如筛选出年龄为20岁或者是一班的学生,可以使用以下语句。

1
SELECT * FROM 学生表 WHERE 年龄 = 20 OR 班级 = 一班;
学号 名称 年龄 班级
1 小明 20 一班
2 小张 21 一班

NOT操作符

使用NOT 表达式来表示不符合该条件的记录。
例如筛选出不是20岁的学生:

1
SELECT * FROM 学生表 WHERE NOT 年龄 = 20;
学号 名称 年龄 班级
2 小张 21 一班
3 小红 21 二班

BETWEEN操作符

使用BETWEEN 范围1 AND 范围2来表示选取介于两个值之间的数据范围,这些值可以是数值、文本或者日期。

如果范围是文本型,会按照字母顺序判断范围。

例如查询出学号在1-3号的学生,可以使用以下SQL语句:

1
SELECT * FROM 学生表 WHERE 学号 BETWEEN 1 AND 3;

结果:

学号 名称 年龄 班级
1 小明 20 一班
2 小张 21 一班
3 小红 21 二班

IN操作符

使用IN(条件列表)来表示选定指条件范围,条件列表中的每一个项目都会进行匹配

例如选出姓名为小红和小明的记录,可以使用以下SQL语句:

1
SELECT * FROM 学生表 WHERE 姓名 IN("小红","小明");

结果:

学号 名称 年龄 班级
1 小明 20 一班
3 小红 21 二班

你知道吗

其实in的功能和or一样,但是代码更短,上述的代码也可以等价成:

1
SELECT * FROM 学生表 WHERE 姓名 = "小红" OR 姓名 = "小明";