SQL提供了SELECT语句进行查询操作。虽然只有这一个查询动词,但它有灵活的使用方式和丰富的功能。
查询的一般格式为:
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] …
FROM <表名或视图名>[,<表名或视图名>] …
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ]
单表查询只涉及一个表或一个视图,是一种最简单的查询操作。
假设这里有三张表,分别是:
例1:查询全体学生的学号、姓名和所在系的有关信息:
SELECT Sno, Sname, Sdept
FROM Student;
例2:查询全体学生的所有信息:
SELECT *
FROM Student;
/* 该查询等价于如下查询 :*/
SELECT Sno, Sname, Ssex, Sage, Sdept
FROM Student;
SELECT子句的<目标列表达式>可以是:表中的属性列、算术表达式、字符串常量、函数等。
对于算术表达式、常量、函数名的目标列表达式,通常会起一个别名。
例1:查询全体学生的姓名及出生年份:
SELECT Sname, 2023-Sage
FROM Student;
/* 这里的 2023-Sage 就是一个算术表达式,可以为它指定一个别名:*/
SELECT Sname, 2023-Sage BIRTHDAY
FROM Student;
在SELECT子句中使用DISTINCT关键字。
比如从学生选课表中查询选修了课程的学生学号,有的学生可能选修了多门课程,但只显示一次学号。这个时候就需要在查询的时候使用DISTINCT关键字消除重复行。
例1: 查询选修程的学生的学号,并消除重复的学号:
SELECT DISTINCT Sno
FROM SC
使用WHERE子句实现。
WHERE子句常用的查询条件有:
查 询 条 件 | 谓 词 |
---|---|
比较 | =,>,<,>=,<=,!=,<>,!>,!<,NOT+上述比较运算符 |
确定范围 | BETWEEN AND,NOT BETWEEN AND |
确定集合 | IN,NOT IN |
字符匹配 | LIKE,NOT LIKE |
空值 | IS NULL,IS NOT NULL |
逻辑运算 | AND,OR,NOT |
SELECT Sno,Sname
FROM Student
WHERE Sdept='CS';
例: 查询考试成绩不及格的学生的学号:
SELECT Sno
FROM SC
WHERE Grade<60;
/*等价于:*/
SELECT Sno
FROM SC
WHERE NOT Grade>=60;
SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
/*等价于:*/
SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage>=20 AND Sage<=23;
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( 'IS','MA','CS' );
/*等价于:*/
SELECT Sname, Ssex
FROM Student
WHERE Sdept=‘IS' OR Sdept='MA' OR Sdept=‘CS';
字符匹配(模糊查询)
例:查询所有姓张的、第3个字为“伟”的学生的姓名,学号和性别:
SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE '张__伟%';
例:查询DB_Design课程的课程号及学分:
SELECT *
FROM Course
WHERE Cname LIKE 'DB\_%i__' ESCAPE '\';
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;
SELECT Sno, Sname, Ssex
FROM Student
WHERE Sdept='CS' AND Sage<20;
使用ORDER BY子句,语法格式为:
ORDER BY <列名> [ASC | DESC ] [,…]
例:查询全体学生情况,查询结果按所在系的升序排序,同一系中的学生按年龄降序排序:
SELECT *
FROM Student
ORDER BY Sdept, Sage DESC;
为了增强检索功能,SQL提供了许多聚簇函数,主要有:
注意 ❗❗❗:
WHERE子句是不能用聚集函数作为条件表达式的。聚集函数只能用于SELECT子句和GROUP中的HAVING子句。
例:计算选修了2号课程的学生平均成绩:
SELECT AVG(Grade) AS '平均成绩' /* 起别名 */
FROM SC
WHERE Cno='2';
例:统计选修了课程的学生人数:
SELECT COUNT(DISTINCT Sno)
FROM SC;
用GROUP BY子句将查询的结果按指定的列进行分组,即将指定列值相同的元组分为同一个组。目的是细化聚集函数的作用对象。
例: 查询每门课程的课程号及相应的选课人数:
SELECT Cno, COUNT(Sno)
FROM SC
GROUP BY Cno;
如果要按一定的条件对分组进行筛选,则使用HAVING子句指定筛选条件。
例:查询选修了3门以上课程的学生学号:
SELECT Sno
FROM SC
GROUP BY Sno HAVING COUNT(*)>3;
/* 先根据学生学号进行分组,这样就将同一个学号的元组都放在了一组中,然后进行count(*)统计这个组里有多少行,这就是该学号学生选修的课程数*/
注意 ❗❗❗:
HAVING短语与WHERE子句的区别:
好啦,这次的分享就到这里,感谢大家看到这里