SQL server (四)数据的增删改查

1.查询数据

 

1. SELECT语句

SELECT select_list

[INTO new_table_name]

FROM table_list

[WHERE search_conditions]

[GROUP BY group_by_list]

[HAVING search_conditions]

[ORDER BY order_list [ASC|DESC]]

 1  use sc_db
 2  ?
 3  --查询学生表中学生的姓名
 4  SELECT Sname
 5  FROM Student
 6  ?
 7  --查询三列
 8  SELECT Sno,Sname,Ssex
 9  FROM Student
10  ?
11  --查询所有
12  SELECT *
13  FROM Student

 

关键字DISTINCT

作用:去重

SELECT DISTINCT 列名称 FROM 表名称

1  --去重复数据
2  SELECT DISTINCT Sdept
3  FROM Student

 

关键字TOP

用于规定要返回的记录的数目

SELECT TOP n *|列名 FROM 表名

 1  --查询所有列的前三行
 2  SELECT TOP 3 *
 3  FROM Student
 4  ?
 5  --查询系名的前三行
 6  SELECT TOP 3 Sdept
 7  FROM Student
 8  ?
 9  --去掉重复数据后,后面的数据会往前补
10  SELECT DISTINCT TOP 3 Sdept
11  FROM Student 

 

使用别名查询

1.在列的表达式中给出别名

SELECT 列名 ‘别名’ FROM 表名

1  SELECT Sno Sno1,Sname Sname1,Ssex Ssex1,Sage Sage1,Sdept Sdept1
2  FROM Student

 

2.使用‘=‘表达式

SELECT ‘别名‘ =列名 FROM 表名

1  SELECT Sno1 =Sno,Sname1=Sname
2  FROM Student

 

3.使用AS关键字来连接列表达式和指定的别名

SELECT 列名 AS ‘别名‘ FROM 表名

1  SELECT Sno AS Sno1,Cno AS Cno1,Grade AS Grade1
2  FROM SC

 

计算列

 SELECT Sno,Cno,调整前的成绩=Grade,
 调整后的成绩=Grade-10
 FROM SC

 

在查询基础上创建新表

SELECT 选择列表

INTO 新表名

FROM 表名

2.选择查询

SELECT 列名

FROM 表名

WHERE 条件

比较搜索条件

=,>,<,>=,<=,<>(不等于),!>(不大于),!<(不小于),!=(不等于)

1  --查询计算机科学系的学生信息
2  SELECT *
3  FROM Student
4  WHERE Sdept=CS
5  ?
6  --查询计算机科学系的男学生信息
7  SELECT *
8  FROM Student
9  WHERE Sdept=CS AND Ssex=

 

范围搜索条件

BETWEEN和NOT BETWEEN

1  --查询成绩在80到90之间的学生       [80,90]闭区间
2  SELECT *
3  FROM SC
4  WHERE Grade BETWEEN 80 AND 90

 

列表搜索条件

IN关键字使用户可以选择与列表中的任意值匹配的行

1  --查询计算机科学系和数学系的学生
2  SELECT *
3  FROM Student
4  WHERE Sdept IN (CS,MA)

 

搜索条件中的字符匹配符

LIKE 关键字搜索与指定模式匹配的字符串,字符串中可包含4种通配符

%:代替零个或多个字符

-:仅替代一个字符

[]:代表指定范围内的单个字符,[]中可以是单个字符(如[acef]),也可以字符范围(如[a-f])

[^]:代表不在指定范围内的单个字符,如[^acef],[^a-f]

涉及空值的查询

列名 IS NULL

列名 IS NOT NULL

1  --查询课程表中先行课为空的课程
2  SELECT *
3  FROM Course
4  WHERE Cpno IS NULL

 

3.聚合函数

聚合函数对一组值执行计算,并返回单个值

SUM([DISTINCT] <列名>):求和

AVG([DISTINCT] <列名>):平均值

MAX([DISTINCT] <列名>):最大值

MIN([DISTINCT] <列名>):最小值

COUNT(*):统计表中元组个数

COUNT([DISTINCT] <列名>):统计本列列值个数

除COUNT(*)外,其他函数在计算过程中均忽略NULL值。

 

SELECT 聚合函数 FROM 表名

 1  --求成绩的总和
 2  SELECT SUM(Grade) AS 总成绩
 3  FROM SC
 4  ?
 5  --求成绩的平均值
 6  SELECT AVG(Grade) AS 平均成绩
 7  FROM SC
 8  ?
 9  --最大值
10  SELECT MAX(Grade) AS 最高成绩
11  FROM SC
12  ?
13  --最小值
14  SELECT MIN(Grade) AS 最低成绩
15  FROM SC
16  ?
17  --统计学生的总人数
18  SELECT COUNT(*) AS 总人数
19  FROM Student
20  ?
21  --查询有成绩的学生个数
22  SELECT COUNT(DISTINCT Sno)
23  FROM SC

 

4.数据分组

GROUP BY 语句用于聚合函数,根据一个或多个列对结果集进行分组。

 

SELECT 列名, 聚合函数(列名) FROM 表名

GROUP BY 列名

1 --对系分组,查询每个系的学生人数
2 SELECT Sdept,COUNT(Sdept) AS 系数量
3 FROM Student
4 GROUP BY Sdept
5 
6 --查询每个系学生的最大年龄和最小年龄
7 SELECT Sdept,MAX(Sage) AS 最大年龄,MIN(Sage) AS 最小年龄
8 FROM Student
9 GROUP BY Sdept

 

HAVING通常与GROUP BY子句一起使用。相当于一个用于组的WHERE子句,制定组的搜索条件。HAVING子句可以包含聚合函数,但WHERE不可以。

1 --查询总成绩小于400分的学号
2 SELECT Sno,SUM(Grade) AS 总成绩
3 FROM SC
4 GROUP BY Sno
5 HAVING SUM(Grade)<400

 

5.数据排序

使用ORDER BY 语句对结果集排序

默认升序,降序可以使用DESC关键字

1 --查看学生表,按年龄升序
2 SELECT *
3 FROM Student
4 ORDER BY Sage
5 
6 --查看学生表,按年龄降序
7 SELECT *
8 FROM Student
9 ORDER BY Sage DESC

 

6.子查询

子查询在其他查询结果的基础上提供了一种有效的方式来表示WHERE子句的条件。

子查询用圆括号括起来。

嵌套子查询

 1 --查询计算机科学系学生选修了哪些课程
 2 SELECT *
 3 FROM SC
 4 WHERE Sno IN
 5 (SELECT Sno
 6 FROM Student
 7 WHERE Sdept=CS
 8 )
 9 
10 --查询修了‘2’号课程
11 --且成绩高于此课程平均分的学生的学号和成绩
12 SELECT Sno,Grade
13 FROM SC
14 WHERE Cno=2
15 AND Grade>
16 (SELECT AVG(Grade)
17 FROM SC
18 WHERE Cno=2
19 )

 

WHERE子句后的条件要什么,子查询就查什么。

相关子查询

也叫单值子查询。只返回一个值,然后将一列值与查询返回的值进行比较。

1 --查询和李勇一个系的学生
2 SELECT Sname
3 FROM Student
4 WHERE Sdept=(SELECT Sdept
5 FROM Student
6 WHERE Sname=李勇
7 )

 

7.表连接

在实际查询应用中,用户所需要的数据并不全在一个表中,可能存在多个表中,这时就需使用多表查询。

在数据库应用中,经常需要从多个相关的表中查询数据,这就需要进行表连接。

内部连接

两种语法:

1.

SELECT select_list FROM 表名1,表名2

WHERE 表1.列=表2.列

2.

SELECT select_list FROM 表1 [INNER] JOIN 表2

ON 表1.列=表2.列

 1 --查询学生信息和成绩
 2 SELECT Student.Sno,Student.Sname,Student.Sdept,SC.Grade
 3 FROM Student,SC
 4 WHERE Student.Sno=SC.Sno
 5 
 6 --使用别名
 7 SELECT Stu.Sno,Stu.Sname,Stu.Sdept,SC.Grade
 8 FROM Student AS Stu,SC
 9 WHERE Stu.Sno=SC.Sno
10 
11 SELECT Student.Sno,Sname,Sdept, SC.Grade
12 FROM Student INNER JOIN SC
13 ON Student.Sno=SC.Sno

 只用匹配到的结果才会有输出

外部连接

返回FROM子句中提到的至少一个表或视图中的所有行

分为左外部连接、右外部连接、全外连接

(先写的是左表)

左外连接

使用LEFT OUTER JOIN关键字。左外部连接对连接条件中左边的表不加限制。如果左表的某行在右表中没有找到匹配的行,则结果集中的右表的相对应的位置为NULL。

1 --查询所有学生的学号,姓名,系名,成绩
2 SELECT Student.Sno,Student.Sname,Student.Sdept,SC.Grade
3 FROM Student LEFT OUTER JOIN SC
4 ON Student.Sno=SC.Sno
右外连接

使用RIGHT OUTER JOIN关键字。右外部连接对连接条件中右边的表不加限制。如果右表的某行在左表中没有找到匹配的行,则结果集中的左表的相对应的位置为NULL。

完全连接

使用FULL OUTER JOIN关键字。对两个表都不加限制,所有两个表中的行都会包括在结果集中。当某行在一个表中没有匹配的行时,则另一个表与之相对应列的值为NULL。

2.添加数据

1.使用INSERT和VALUES插入行

INSERT [INTO] 表名 [(列名)]

VALUES(data_values,...n)

 1 --往学生表添加学生信息
 2 INSERT INTO Student(Sno,Sname,Ssex,Sage,Sdept) VALUES(201215121,李勇,,20,CS)
 3 INSERT INTO Student VALUES(201215122,刘晨,,19,CS)
 4 INSERT INTO Student VALUES(201215123,王敏,,18,MA)
 5 INSERT INTO Student VALUES(201215125,张立,,19,IS)
 6 
 7 --往课程表添加课程信息
 8 INSERT INTO Course(Cno,Cname,Cpno,Ccredit) VALUES(1,数据库,5,4)
 9 INSERT INTO Course VALUES(2,数学,NULL,4)
10 INSERT INTO Course VALUES(3,信息系统,1,4)
11 INSERT INTO Course VALUES(4,操作系统,6,3)
12 INSERT INTO Course VALUES(5,数据结构,7,4)
13 INSERT INTO Course VALUES(6,数据处理,NULL,2)
14 INSERT INTO Course VALUES(7,PASCAL语言,6,4)
15 
16 --往学生-课程表添加信息
17 INSERT INTO SC(Sno,Cno,Grade) VALUES(201215121,1,92)
18 INSERT INTO SC VALUES(201215121,2,85),(201215121,3,88),
19 (201215121,2,90),(201215121,2,80)

 

2.使用INSERT和SELECT插入行

在INSERT语句中使用SELECT子句可以将一个或多个表或视图中的值添加到另一个表中。使用SELECT子句还可以同时插入多行。

INSERT [INTO] table_name [(column_list)]

SELECT select_list FROM table_name

1 --创建一个学号-姓名表
2 CREATE TABLE Sno_Sname
3 (
4 Sno VARCHAR(50),
5 Sname VARCHAR(50)
6 )
7 
8 INSERT INTO Sno_Sname
9 SELECT Sno,Sname FROM Student

 

3.修改数据

UPDATE 表名 SET 列名=表达式 [WHERE限定条件]

 1 --修改数学课程的学分
 2 UPDATE Course SET Ccredit=2 WHERE Cno=2
 3 
 4 --将计算机系全体学生成绩+5分
 5 --使用子查询
 6 UPDATE SC SET Grade=Grade+5
 7 WHERE Sno IN
 8 (SELECT Sno FROM Student
 9 WHERE Sdept=CS
10 )
11 --使用多表连接
12 UPDATE SC SET Grade=Grade+5
13 FROM SC JOIN Student ON SC.Sno=Student.Sno
14 WHERE Sdept=CS

 

4.删除数据

DELETE FROM 表名 WHERE 选择条件

--删除90分以上的学生
DELETE FROM SC
WHERE Grade>90

--删除前20%的学生成绩
DELETE TOP (20) PERCENT FROM SC
--删除前5行
DELETE TOP (5) FROM SC

 



SQL server (四)数据的增删改查

上一篇:《Linux From Scratch》第三部分:构建LFS系统 第七章:基本系统配置- 7.1. 简介


下一篇:Linux笔记 — 用户和用户组的配置文件介绍