数据查询
语法格式:
- SELECT <目标列表达式1>[,<目标列表达式2>] ......
- FROM < 表名或者视图名 >[,<表名或者视图名>]......
- WHERE <条件表达式>
- GROUP BY <列名> HAVING <条件表达式>
- ORDER BY <列名> ASC/DESC
一,查询指定列操作
查询所有属性列
1.在SELECT 关键字后面列出所有列名
2.将<目标列表达式>指定为 *
eg:查询全体学生的详细记录
SELECT * FROM Student;
SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student;
查询经过计算的值
1.SELECT 子句的<目标列表达式>不仅可以为表中列属性,也可以是表达式
eg:查询全体学生的姓名,出生年份和所在的院系,要求用小写字母表示系名
SELECT Sname 学生姓名,2022-Sage 出生年份,LOWER(Dept) 所在院系 --2022-Sage就是一个表达式 FROM Student;
说明:Sname 后面的 ‘学生姓名’,是一个常量表达式,可将其视为列名
如下图所示
列名不再是 Sname而是 学生姓名。出生年份,所在院系同理。
二,消除取值重复的行
使用关键字 DISTINCT
eg:查询选修了课程的学生学号
SELECT Sno FROM SC;
这样的话,一名学生修多门课程时就会出现多个相同的学号。为避免这种情况的发生,可以使用DISTINC
SELECT DISTINCT Sno FROM SC;
三,查询满足条件的元组
查询条件 谓词 比较 =,>,<,>=,<=,!=,!>,!<;NOT + 上述比较运算符 确定范围 BETWEEN AND, NOT BETWEEN AND 确定集合 IN, NOT IN 字符匹配 LIKE, NOT LIKE 空值 IS NULL, IS NOT NULL 多重条件 AND,OR,NOT
-
比较 eg查询所有年龄在20岁以下的学生姓名及其年龄
SELECT Sname,Sage FROM Student WHERE Sage<20;--比较谓词 <
-
确定范围 eg:查询年龄在20~30岁之间的学生姓名及其年龄
SELECT Sname,Sage FROM Student WHERE Sage BETWEEN 20 AND 23;--范围谓词 BETWEEN AND
-
确定集合 eg:查询计算机科学系,数学系,信息系学生的姓名和年龄
SELECT Sname,Sage FROM Student WHERE Dept IN('计算机系','数学系','信息系');--确定集合谓词 IN
-
字符匹配
<匹配串>即可以是一个完整的字符串,也可以含有通配符 %和 _
1.%(百分号)代表任意长度的字符串(字符串长度可为0)
eg:查询所有姓刘的学生姓名,学号和性别
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE('刘%');
2._(下划线)代表任意单个字符
3.当你所要查询的字符本身就包括_或者%,那么就需要将通配符转义为普通字符,使用关键字ESCAPE
eg:查询以"DB_"开头,且倒数第3个字符为i的课程的详细情况
SELECT *
FROM Course
WHERE Cname LIKE ('DB\_%I__') ESCAPE'\';
补充:字符串匹配的通配符还有 [ ]和[^]
[ ]:匹配方括号中的任何一个字符
[^]:不匹配方括号中的任何一个字符
eg:查询姓‘张’,‘李’,‘刘’的学生的详细信息
SELECT * FROM Student WHERE Sname LIKE'[张刘李]%';
5.空值 eg:某些学生选修课程后没有参加考试,所以有选课记录,但是没有考试成绩。查询缺少成绩的学生的学号和相应的课程号
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;
6. 多重条件 eg:查询计算机年龄在二十岁以下的学生姓名
SELECT Sname
FROM Student
WHERE Dept = '计算机系' AND Sage<20;
四,ORDER BY 字句,可以按一个或多个属性列排列
升序:ASC 降序: DESC
注:对于空值,排序是显示的次序由具体系统实现来决定
eg:查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列
SELECT * FROM Student ORDER BY Dept ASC,Sage DESC;