您的位置:首页 > 数据库

SQL增删改查

2014-11-16 14:29 141 查看
1. 增

1. 使用常量插入单个元组

格式:

INSERT
INTO <表名>[(<属性列1>[, <属性列2>]...)]
VALUES (<常量1>[, <常量2>]...);
例1:

INSERT
INTO 学生
VALUES ('98010', '张三', 20, '计算机系');


例2:

INSERT
INTO 选课 (学号, 课程号)
VALUES ('98010', 'C10');


2. 在表中插入子查询的结果集

格式:

INSERT
INTO <表名>[(<属性名1>[, <属性名2>]...)]
<子查询>;
例1:

INSERT
INTO 系平均年龄
SELECT 所在系, AVG(ALL 年龄)
FROM 学生
GROUP BY 所在系;


2. 删

格式:

DELETE
FROM <表名>
[WHERE <条件>];
例1:

DELETE
FROM 选课
WHERE 学号 IN (SELECT 学号
FROM 学生
WHERE 所在系='艺术系');
例2:

DELETE
FROM 学生
WHERE 所在系 = '艺术系'


3. 改

格式:

UPDATE <表名>
SET <列名> = <表达式>[, <列名>=<表达式>][,...n]
[WHERE <条件>];
例1:

UPDATE 学生
SET 年龄 = 年龄+2;
例2:

UPDATE 选课
SET 成绩=成绩*1.2
WHERE 课程号=(SELECT 课程号
FROM 课程
WHERE 课程名='数据库');


4. 查

格式:

SELECT <目标列组>
FROM <数据源>
[WHERE <元组选择条件>]
[GROUP BY <分列组> [HAVING <组选择条件>]]
[ORDER BY <排序列1><排序要求>[, ... n]];


1, 简单查询

例1:

求数学系学生的学号和姓名

SELECT 学号, 姓名
FROM 学生
WHERE 所在系='数学系';
例2:

求选修了课程的学生学号

SELECT DISTINCT 学号
FROM 选课;

DISTINCT避免重复
例3:

求选修C1课程的学生学号和成绩,并要求对查询结果按成绩的降序排列,如果成绩相同,则按学号的升序排列

SELECT 学号, 成绩
FROM 选课
WHERE 课程号='C1'
ORDER BY 成绩 DESC, 学号 ASC;
例4:

求选修课程C1且成绩在80~90之间的学生学号和成绩,并将成绩乘以系数0.8输出

SELECT 学号,成绩*0.8
FROM 选课
WHERE 课程号= 'C1' AND 成绩 BETWEEN 80 AND 90;
例5:

求数学系或计算机系姓张的学生的信息

SELECT *
FROM 学生
WHERE 所在系 IN ('数学系', '计算机系') AND 姓名 LIKE '张%';
例6:

求缺少了成绩的学生的学号和课程号

SELECT 学号, 课程号
FROM 选课
WHERE 成绩 IS NULL;

IS NULL 操作表达式


2. 连接查询

1. 等值连接和非等值连接

格式:

[<表名1>.]<列名1><比较运算符>[<表名2>.]<列名2>
例1:

查询每个学生的情况以及他所选修的课程

SELECT 学生.*, 选课.*
FROM 学生, 选课
WHERE 学生.学号 = 选课.学号;
例2:

求学生的学号,姓名,选修的课程名及成绩

SELECT 学生.学号, 姓名,课程名, 成绩
FROM 学生,课程,选课
WHERE 学生.学号=选课.学号 AND 课程.课程号=选课.课程号
例3:

求选修C1课程且成绩为90分以上的学生学号,姓名和成绩

SELECT 学生.学号, 姓名.成绩
FROM 学生, 选课
WHERE 学生.学号=选课.学号 AND 课程号='C1' AND 成绩>90;
2. 自身连接查询

例1:

查询每一门课的间接先行课

SELECT A.课程号, A.课程名, B.先行课
FROM 课程A, 课程B
WHERE A.先行课=B.课程号

一个表有两个作用,要对表起别名
3. 外部连接操作

左外部连接"*=" 在结果集中保留左表中的非匹配记录

右外部连接"=*" 在结果集中保留右表中的非匹配记录

3. 嵌套查询

1. 使用IN

求选修了高等数学的学生学号和姓名

SELECT 学号, 姓名
FROM 学生
WHERE 学号 IN (SELECT 学号
FROM 选课
WHERE 课程名='高等数学'));
2. 使用比较符的嵌套查询

求C1课程的成绩高于张三的学生的学号和成绩

SELECT 学号,成绩
FROM 选课
WHERE 课程号='C1' AND 成绩>(SELECT 成绩
FROM 选课
WHERE 课程号='C1' AND 学号=(SELECT 学号
FROM 学生
WHERE 姓名='张三'));
3. 使用ANY或ALL操作符的嵌套查询

求其他系中比计算机系某一学生年龄小的学生(即求年龄小于计算机系年龄最大者的学生)

SELECT *
FROM 学生
WHERE 年龄 < ANY(SELECT 年龄
FROM 学生
WHERE 所在系='计算机系') AND 所在系<>'计算机系';
求其他系中比计算机系的学生年龄都小的学生

SELECT *
FROM 学生
WHERE 年龄 < ALL (SELECT 年龄
FROM 学生
WHERE 所在系='计算机系') AND 所在系<>'计算机系';
4. 使用EXISTS操作符的嵌套查询

求选修了C2课程的学生姓名

SELECT 姓名
FROM 学生
WHERE EXISTS (SELECT *
FROM 选课
WHERE 学生.学号 = 学号 AND 课程号='C2');
求没有选修C2课程的学生姓名

SELECT 姓名
FROM 学生
WHERE NOT EXISTS (SELECT *
FROM 选课
WHERE 学生.学号 = 学号 AND 课程号='C2');
查询选修了全部课程的学生的姓名

SELECT 姓名
FROM 学生
WHERE NOT EXISTS (SELECT *
FROM 课程
WHERE NOT EXISTS (SELECT *
FROM 选课
WHRER 学生.学号=学号 AND 课程.课程号=课程号));
求选修了学号为"S2"的学生所选修的全部课程的学生学号和姓名

SELECT 学号, 姓名
FROM 学生
WHERE NOT EXISTS (SELECT *
FROM 选课1
WHERE 选课1.学号 = 'S2' AND NOT EXISTS(SELECT *
FROM 选课2
WHERE 学生.学号 = 选课2.学号 AND 选课2.课程号 = 选课1.课程号));

4. 组合查询

例1

求选修了C1课程或选修了C2课程的学生学号

SELECT 学号
FROM 选课
WHERE 课程号='C1'
UNION
SELECT 学号
FROM 选课
WHERE 课程号='C2';
例2

求选修C1课程, 并且也选修了C2课程的学生学号

SELECT 学号
FROM 选课
WHERE 课程号='C1'
INTERSECT
SELECT 学号
FROM 选课
WHERE 课程号='C2';
例3

求选修了C1课程但没有选修C2课程的学生学号

SELECT 学号
FROM 选课
WHERE 课程号='C1'
MINUS
SELECT 学号
FROM 选课
WHERE 课程号='C2'


5. 使用分组和函数查询

例1

求学生的总人数

SELECT COUNT (*)
FROM 学生;
例2

求选修了课程的学生人数

SELECT COUNT (DISTINCT 学号)
FROM 选课;
例3

求课程和选修该课程的人数

SELECT 课程号, COUNT(学号)
FROM 选课
GROUP BY 课程号;
例4

求选修了超过3门课的学生学号

SELECT 学号
FROM 选课
GROUP BY 学号 HAVING COUNT(*)>3;


本篇是对大学数据库课本上SQL增删改查知识的总结以备忘,如有不妥,请留言告知。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: