在关系数据库中,最常用的操作就是查询,这章我们就开始学习查询数据的SQL语法。

为了便于大家的理解,我们需要预先创建好Students和Courses表格,以下是两张表的信息:

StudentIDNameGenderAgeCity
1DavidM21Shanghai
2KevinM19Beijing
3EmilyF22Shanghai
4WilliamM20New York City
5AliceF19Los Angeles
CourseIDCourseName
1CS101
2CS202
3EE101

下面是创建这两张表的SQL语句:

CREATE TABLE Students (
    StudentID int PRIMARY KEY,
    Name varchar(255),
    Gender varchar(1),
    Age int,
    City varchar(255)
);
INSERT INTO Students VALUES(1, 'David', 'M', 21, 'Shanghai');
INSERT INTO Students VALUES(2, 'Kevin', 'M', 19, 'Beijing');
INSERT INTO Students VALUES(3, 'Emily', 'F', 22, 'Shanghai');
INSERT INTO Students VALUES(4, 'William', 'M', 20, 'New York City');
INSERT INTO Students VALUES(5, 'Alice', 'F', 19, 'Los Angeles');
CREATE TABLE Courses (
    CourseID int PRIMARY KEY,
    CourseName varchar(255)
);
INSERT INTO Courses VALUES(1, 'CS101');
INSERT INTO Courses VALUES(2, 'CS202');
INSERT INTO Courses VALUES(3, 'EE101');

基本查询

如果想要查询表的数据,我们可以使用SELECT语句:

SELECT * FROM table_name;

其中 * 表示“所有列”,FROM紧跟着要查询的表名。如果要查询Students表中的所有记录,可以使用以下语句:

SELECT * FROM Students;

条件查询

使用SELECT * FROM table_name可以查到一张表的所有记录,但有时我们只需要获取符合特定条件的记录,那么我们就可以添加WHERE语句,来限定查询记录的条件:

SELECT * FROM table_name WHERE condition;

其中condition限定了查询内容的条件,以下的语句就只抓取年纪大于20的学生记录:

SELECT * FROM Students WHERE Age > 20;

条件表达式

条件表达式(condition)有很多种,如果我们需要满足多个条件,可以使用 AND 连接多个条件。如果我们希望同时满足两个条件,那么我们需要在WHERE后面加上condtion1 AND condition2。例如要查询同时满足以下两个条件的学生记录:

  • 性别为Male (Gender = M)
  • 年纪大于20 (Age > 20)

那么我们就可以使用以下语句:

SELECT * FROM Students WHERE Gender = 'M' AND Age > 20;

如果我们希望找到在多个条件中满足任意条件的记录的话,我们需要在condition之间加上OR,比如以下的语句就代表了选择Gender为F或者Age小于20的学生:

SELECT * FROM Students WHERE Gender = 'F' OR Age < 20;

很明显 OR 的条件比 AND 宽松,AND 要求满足列出的所有条件, OR只需要满足其中任意一个条件即可。还有一种条件是 NOT condition,代表不符合某种条件,比如我们要选取 Gender 为 ‘M’ 的学生,另一种写法就是 Gender 不为 ‘F’ 即可,语句如下:

SELECT * FROM Students WHERE NOT Gender = 'F';

上面 NOT Gender = ‘F’ 等价于 Gender <> ‘F’,所以两种写法都可以。如果要组合三个或更多的条件,那么就需要用圆括号()限制条件的判断顺序。比如我们需要查找Age在20以下或22以上,并且是男生的学生,可以使用以下语句:

SELECT * FROM Students WHERE (Age < 20 OR Age > 22) AND Gender = 'M';

如果不加括号,条件运算则会按照 NOT, AND, OR 的优先级顺序执行,既NOT优先级最高,最低的是OR。以下是常见条件表达式的总结:

条件说明Example1Example2
=判断相等age = 20name = ‘xyz’
>判断大于age > 20name > ‘xyz’
>=判断大于等于age >= 20name >= ‘xyz’
< 判断小于age < 20name < ‘xyz’
<=判断小于等于age <= 20name <= ‘xyz’
<>判断不等于age <> 20name <> ‘xyz’
LIKE判断相似name LIKE ‘xy%’(%表示任意字符,xy%表示以xy为开头的字符)

投影查询 (特定字段查询)

使用SELECT * FROM table_name WHERE condition可以选出表中的若干条记录,所返回的记录字段和原表是相同的,即结果的所有字段与原表的所有字段都一一对应。如果我们只希望返回某些特定字段的数据,而不是所有字段的数据,我们可以用 SELECT column1, column2, … FROM table_name; 让结果集仅包含指定字段。这种操作称为投影查询。

比如我们只想获得年纪大于20的学生的StudentID和Name字段,可以使用以下语句:

SELECT StudentID, Name FROM Students WHERE Age > 20;

如果我们只想要不同的数据,可以使用SELECT DISTINCT,语法如下:

SELECT DISTINCT column1, column2, ... FROM table_name;

例如我们只想知道学生来自哪些不同的城市,可以使用以下语句:

SELECT DISTINCT City FROM Students;

排序 ORDER BY

当我们使用SELECT查询的时候,查询的结果往往是根据主键排序的,在我们的例子中就是按照StudentID排序的。如果我们想要根据我们自定义的字段排序的话,我们可以在最后加上ORDER BY,以下是ORDER BY的语法:

SELECT col1, col2, ... 
FROM table_name
ORDER BY col1, col2, ... ASC|DESC;

例如,我们希望学生按照年龄从小到大排好序,那么就可以使用以下语句:

SELECT * FROM Students ORDER BY Age;

如果我们不在ORDE BY最后加上 ASC 或 DESC,那么就是默认从小到大排好序的。其中 ASC 表示从小到大的顺序,DESC表示倒序,以下语句获得的学生则会根据年龄从大到小排好序:

SELECT * FROM Students ORDER BY Age DESC;

如果我们希望结果按照年纪从小到大排好序后,再根据性别排序的话,可以使用以下语句:

SELECT * FROM Students ORDER BY Age ASC, Gender;

如果有WHERE子句,那么ORDER BY需要放在WHERE后面,如下:

SELECT * FROM Students 
WHERE City = 'Shanghai'
ORDER BY Age;

此语句将来自上海的学生选取出来,并按照年纪排好序。

这些就是关于查询语句的基础教程啦,下周我们会学习其他更高级的查询语句。

课后练习

写出满足以下要求的SQL语句:选取年纪大于20,并且来自上海的学生,将结果按照年纪从小到大的顺序排好,最后结果只需要StudentID字段。

答案:

SELECT StudentID 
FROM Students
WHERE Age > 20 AND City = 'Shanghai'
ORDER BY Age ASC;