只言片语

:D 获取中...


数据库之SQL语言(中)

基本上全是重点……………..

例:有三张表

OlKOg0.png

(1)查询所有 & 查询部分列

查询即选择,使用SELECT关键字

1
2
3
4
5
6
7
8
9
10
-- (1) 查询所有
-- 查询Student表中的所有学生信息。
SELECT * FROM Student;
-- * 表示通配符,意为选择所有字段,等价于
SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student;

-- (2)查询部分
-- 查询Student表中的所有学生的学号和姓名。
SELECT Sno,Sname FROM Student;
-- 意为查询结果只显示Sno和Sname两列。
(2)给查询结果起别名

使用AS关键字即可

1
2
3
4
-- 如
-- 查询Student表中的所有学生的学号和姓名。
SELECT Sno AS "学号",Sname AS "姓名" FROM Student AS "学生表";
-- 使用AS关键字,且关键字AS可省略。表名也一样。
(3)结果去重

加上DISTINCT关键字就可以自动去重。

1
2
-- 比如:从Course查询课程名并删除重复结果。
SELECT DISTINCT Cname FROM Course;
(4)查询结果加条件
查询条件
谓词
比较 =,>,<,!=,<=,<>,!>,<!,NOT+比较运算符
确定范围 BETWEEN AND,NOT BETWEEN AND
确定集合 IN,NOT IN
字符匹配 LIKE,NOT LIKE
空值 IS NULL,IS NOT NULL
多重条件(逻辑运算) AND,OR,NOT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
-- 比较
-- 比如:查询年龄不小于19岁的学生所有信息。
SELECT * FROM Student WHERE Sage >= 19;

-- 确定范围
-- 查询年龄在18到20岁之间的学生信息。
SELECT * FROM Student WHERE Sage BETWEEN 18 AND 20;

-- 确定集合
-- 比如:1是否在集合1,2中?3呢?
SELECT 1 IN (1,2);
-- 执行完成后会返回1,表示true,在里面。
SELECT 3 IN (1,2);
-- 执行完成后会返回0,表示false,不在里面。

-- 字符匹配
-- 查询性别为王的学生信息。
SELECT * FROM Student WHERE Sname LIKE "王%";
-- 其中,%通配符可以代替任意多个字符,如果是只代表一个字符则用下划线_代替。

-- 空值
-- 查询先行课为空的课程信息。
SELECT * FROM Course WHERE Cpno IS NULL;

-- 多重条件
-- 查询性别为女并且所在系别为CS的学生信息。
SELECT * FROM Student WHERE Ssex='女' AND Sdept='CS';
(5)聚集函数的使用
函数名
解释
CENTER(*) 统计元组个数
COUNT([DISTINCT | ALL] <列名>) 统计一列中值的个数
AVG([DISTINCT | ALL] <列名>) 计算一列值的总和(此列必须是整数型)
SUM([DISTINCT | ALL] <列名>) 计算一列值的总和(此列必须是整数型)
MAX([DISTINCT | ALL] <列名>) 求一列值中的最大值
MIN([DISTINCT | ALL] <列名>) 求一列值中的最小值
1
2
3
4
-- 默认参数为ALL,如果需要去除重复值则需手动加入参数DISTINCT
-- 统计所有学生的人数。
SELECT COUNT(*) FROM Student;
-- 其他函数用法类似
(6)分组查询

使用GROUP BY参数进行分组查询,如果要对分组进行查询则需使用HAVING关键字。

1
2
3
4
5
6
7
-- 如:查询所有学生的学号,姓名和性别,并按学院进行分组
SELECT Sno,Ssex,Sname,Sdept FROM Student GROUP BY Sdept;
-- 分组时所查询的字段中必须包含要进行分组的字段。

-- 查询学院为CS学生的学号,姓名和性别,并按学院进行分组
SELECT Sno,Ssex,Sname,Sdept FROM Student GROUP BY Sdept HAVING Sdept='CS';
-- GROUP BY关键字之后是不可以使用WHERE关键字的,必须使用HAVING.
(7)连接

包含等值连接和非等值连接,以where为关键字

1
2
3
4
-- 如:
-- 连接Student和SC两张表进行笛卡尔积查询。
SELECT * FROM Student,SC where Student.Sno = SC.Sno;
-- 这样查询出来的结果符合笛卡尔积的运算结果,否则查询出来的结果会随机排列在一起。加where为等值连接,不加为非等值连接。

自身连接

1
2
3
-- 一个表与自身廉洁,为这两个表起两个别名,然后进行操作。
-- 如:使用Student表。
SELECT * FROM Student AS Stu1,Student AS Stu2 WHERE Stu1 = Stu2;

外连接

1
2
3
4
5
6
7
8
9
10
11
-- 左外连接
-- 取Student和SC表的交集。被舍弃的值也会被保留在结果中,但是要加NULL。
SELECT * FROM Student LEFT OUTER JOIN SC WHERE Student.Sno = SC.Sno;

-- 右外连接
-- 取Student和SC表的交集。被舍弃的值也会被保留在结果中,但是要加NULL。
SELECT * FROM Student RIGHT OUTER JOIN SC WHERE Student.Sno = SC.Sno;

-- 内连接
-- 两张表中共有的属性才能进行连接。
SELECT * FROM Student INNER JOIN SC WHERE Student.Sno = SC.Sno;

多表查询

1
2
3
-- 两个或两个以上的表进行连接。
-- 同时使用开头的三张表进行查询。
SELECT * FROM Student,SC,Course WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno;

嵌套查询