在关系数据库中,最常用的操作就是查询,这章我们就开始学习查询数据的SQL语法。
为了便于大家的理解,我们需要预先创建好Students和Courses表格,以下是两张表的信息:
StudentID | Name | Gender | Age | City |
1 | David | M | 21 | Shanghai |
2 | Kevin | M | 19 | Beijing |
3 | Emily | F | 22 | Shanghai |
4 | William | M | 20 | New York City |
5 | Alice | F | 19 | Los Angeles |
CourseID | CourseName |
1 | CS101 |
2 | CS202 |
3 | EE101 |
下面是创建这两张表的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。以下是常见条件表达式的总结:
条件 | 说明 | Example1 | Example2 |
= | 判断相等 | age = 20 | name = ‘xyz’ |
> | 判断大于 | age > 20 | name > ‘xyz’ |
>= | 判断大于等于 | age >= 20 | name >= ‘xyz’ |
< | 判断小于 | age < 20 | name < ‘xyz’ |
<= | 判断小于等于 | age <= 20 | name <= ‘xyz’ |
<> | 判断不等于 | age <> 20 | name <> ‘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;