视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
SQL 查询语句(二)
2025-09-25 14:19:40 责编:小OO
文档
SQL 查询语句(二)

●多表查询

●嵌套查询(子查询)

●UNION查询

●INTO子句

●数据更新

一、多表查询 

    将一个查询同时涉及两个以上的表,称连接查询。 用来连接多个表的条件称连接条件。连接条件中的字段叫做连接字段。

1.自然连接查询

等值连接--连接运算中的运算符是=

非等值连接--连接运算中的运算符是<,>,>=,<=,!=

例:列出每个学生及其选修课程的详细清单

SELECT  *   FROM 学生表,成绩表  

WHERE 学生表.学号=成绩表.学号 

2.自身连接

   连接操作的不是两个不相同的表,而是自己和自己连接。

例:列出每一门课程的间接先修课。

   SELECT  C.课程号,K.先修课 ‘间接先修课 ‘

FROM  课程表 C,课程表 K  WHERE  C.先修课=K.课程号

3.复合条件连接

   在WHERE 子句中有多个连接条件

例:列出选修了“C801”课程并且成绩在85分以上的所有学生的学号,姓名,课程号和成绩

   SELECT  学生表.学号,姓名,课程号,成绩  FROM 学生表,成绩表  WHERE 学生表.学号=成绩表.学号 AND 课程号=’C801’ AND 成绩>85

二、嵌套查询(子查询)

一个SELECT-FROM-WHERE语句可以嵌套在另外一个查询块的WHERE子句中。这类子查询的执行过程是:首先执行子查询,子查询得到的结果不被显示出来,而是传递给外部查询,作为外部查询的条件,然后执行外部查询。

1.带有IN的子查询

例1:列出和“张成”同学在同一个系的所有学生的清单

SELECT  *  FROM  学生表  WHERE 所在院系 IN(SELECT  所在院系 FROM 学生表 WHERE  姓名=’张成’)  

本例先执行 SELECT  所在院系 FROM 学生表 WHERE  姓名=’张成’

    结果为“计算机”

再执行 SELECT  *  FROM  学生表  WHERE 所在院系 IN  (‘计算机’)

//in可换成“=”,因为查询结果为一个数据

例2:列出选修了“数据库”的学生的学号,姓名,所在院系

  方法1:SELECT  学生表.学号,姓名,所在院系

          FROM 学生表,课程表,成绩表

        WHERE 学生表.学号=成绩表.学号 

AND 课程表.课程号=成绩表.课程号

        AND 课程名=’数据库’

方法2:SELECT学生表.学号,姓名,所在院系

       FROM 学生表 WHERE 学号 IN 

         (SELECT 学号 FROM 成绩表 WHERE 课程号 IN

(SELECT 课程号 FROM 课程表 WHERE 课程名=’数据库’))

2.带有ANY或ALL的子查询

   ANY:表示子查询的某一个值       ALL:表示子查询的所有值    

例1:列出比计算机系某个学生年龄大的学生清单。(只要比一个学生的年龄大)

方法1:SELECT *  FROM 学生表  

WHERE 年龄>ANY(SELECT  年龄  FROM  学生表  

WHERE  所在院系=’计算机’) AND 所在院系!=’计算机’

方法2:SELECT *  FROM 学生表  

WHERE 年龄> (SELECT  MIN(年龄)  FROM  学生表  

WHERE  所在院系=’计算机’) AND 所在院系!=’计算机’

例2:查询所有大于学号“608013301”学生的成绩的学生。要求:列出学生的学号,姓名,性别,课程名和成绩

      SELECT A.学号, 姓名, 性别, 课程名, 成绩

        FROM 学生表 A, 成绩表 B, 课程表 C

        WHERE A.学号=B.学号  AND B.课程号=C.课程号 AND  成绩>ALL(SELECT 成绩 FROM 成绩表    WHERE  学号=’ 608013301’)

3.带有EXITS的子查询

   用EXISTS 和NOT EXISTS关键字用来确定数据是否在查询列表中存在。

相关子查询的处理过程:

取出外层查询中表的第1条记录,根据它与内层查询相关的字段值处理内层查询

若WHERE子句返回值为真,则取这条记录放入结果集中

再检查下一条记录

例1:查询所有选修了课程“C801”的学生的所有信息

方法1:使用复合查询

      SELECT 学生表.* FROM 学生表,成绩表 

WHERE 成绩表.学号=学生表.学号  AND  课程号=’C801’

方法2:使用EXISTS子句

SELECT * FROM 学生表 WHERE EXISTS (SELECT  *  FROM  成绩表  WHERE 学号=学生表.学号  AND 课程号=’C801’)

例2:列出没有选修课程“C801”的学生的所有信息

      SELECT * FROM 学生表 WHERE NOT  EXISTS(SELECT  *  FROM  成绩表  WHERE 学号=学生表.学号  AND 课程号=’C801’)

4.在WHERE子句中使用集合函数

例1:列出年龄最大的学生清单

SELECT  *  FROM  学生表  

WHERE  年龄=(SELECT  MAX(年龄)  FROM  学生表)

例2:按降序显示所有年龄超过平均值的学生名单

     SELECT *  FROM  学生表  WHERE 年龄>(SELECT AVG(年龄)  

FROM 学生表 )  ORDER  BY 年龄 DESC

三、UNION查询

合并两个或多个查询的结果,通过UNION关键字实现。组合的结果集必须满足条件:

字段个数必须相同

结果集中相应字段的数据类型必须兼容

使用UNION将结果表进行逻辑联合时,SQL SERVER会自动将重复的记录去掉。列名来自第一个SELECT语句。

例1:显示计算机系的学生以及性别为女的学生名单

SELECT * FROM 学生表 WHERE 所在院系=’计算机’  

UNION SELECT * FROM 学生表 WHERE 性别=’女’

例2:用UNION子句将学生表中学生的学号、姓名及TEACHER表中教师号、教师姓名组合在一个结果集中。

   CREATE  TABLE TEACHER

(教师号 char(6) not null primary key,

 教师姓名 varchar(8) null)

SELECT 学号 AS ID ,姓名 AS NAME FROM 学生表      ----用AS给字段指定别名

UNION SELECT 教师号,教师姓名 FROM TEACHER

四、INTO 子句

    语法格式:SELECT <字段> INTO <新建表名>

FROM <表名> WHERE <过滤条件表达式>

SELECT INTO的作用是,在查询的基础上创建新表。

说明:1) 这是常用的创建新表和临时表的方法,临时表在表名前加#(局部临时表)

或##(全局临时表)

2) 新表的行和列来自查询结果

例1:创建计算机系学生表

       SELECT *  INTO 计算机系学生  FROM 学生表 WHERE  所在院系=’计算机’

查看方法:1)在企业管理器下查看表计算机系学生;

          2)SELECT  *  FROM  计算机系学生

例2:新建一个表名为学生分类表,内容包括网061和网062的所有学生的名单

      SELECT * INTO  学生分类表 FROM 学生表 WHERE 班级名=’网061’  UNION SELECT * FROM 学生表 WHERE 班级名=’网062’

例3:创建一个临时表

     SELECT *  INTO  #新表  FROM  学生表  WHERE  性别=’女’

五、数据更新

 数据更新有3种操作:

插入记录(Insert)

删除记录(Delete)

修改记录(Update)

 

1.使用INSERT插入记录

(1)插入一条记录

例:往学生表中插入一条记录

insert into 学生表(学号,姓名) 

values(‘408013101’,’张成’)

(2)插入子查询的结果 

格式:INSERT [INTO] 数据表或视图 [<字段1,>…] 

SELECT [<字段A,>….]

      FROM <表名>

      WHERE <条件表达式>

例:创建一个新表<新学生表>,包括4个字段“学生学号,姓名,性别,所在院系”,然后将学生表中计算机系女学生的记录全部插入到新学生表中,最后显示插入的记录。

     CREATE  TABLE  新学生表

         (学生学号 char(10)  not  null  PRIMARY  KEY,

         姓名  varchar(8) null,

         性别 char(2) null,

         所在院系  varchar(30) null

)

INSERT  INTO  新学生表(学生学号,姓名,性别,所在院系)

     SELECT  学号,姓名,性别,所在院系

     From  学生表

     WHERE  所在院系=’计算机’  AND  性别=’女’

注意:

学生表的字段名可以和新学生表不同。但要求列数相同,对应列的类型一致。

2. 使用UPDATE修改记录

格式:UPDATE 更新的数据表或视图 

    SET 表达式 WHERE 检索条件

(1)修改一条记录

 例:将学号为“508013101“的学生的年龄改为20

Update 学生表

Set 年龄=20

Where 学号=’508013101’

(2)修改多条记录

例:将学生表中所有学生的所在院系改为‘计算机‘

Update 学生表

Set  所在院系=’计算机’

(3)带子查询的修改语句

例:将计算机全体学生的成绩加8分

方法一:

UPDATE 成绩表 

SET 成绩=成绩+8

WHERE 学号 IN(SELECT 学号  FROM  学生表 WHERE 所在院系=’计算机’)

方法二:

UPDATE 成绩表 

SET 成绩=成绩+8

WHERE  (SELECT  所在院系  FROM  学生表  

WHERE  学号=成绩表.学号)=‘计算机‘

说明:

  SET指定需要更新的字段,格式是“SET 变量名=新值表达式” 

  通过WHERE子句指定需要更新的行;

3. 使用DELETE删除数据行

格式: DELETE 

FROM 数据表或视图 

    WHERE 检索条件

(1)删除一条记录

例:将学号为“508013101“的学生删除

Delete from 学生表

Where 学号=’508013101’

(2)删除多条记录

例:将学生表中电子系的所有学生全部删除

Delete from 学生表

Where 所在院系=’电子’

(3)带子查询的删除语句

例:删除计应053所有学生的选修课程记录  

方法一:delete from 成绩表

where 学号 IN (select 学号 from 学生表 where 班级名='计应053')

方法二:delete from 成绩表

where '计应053'=(select 班级名 from 学生表 where  学号=成绩表.学号)

说明: WHERE子句指定需要删除的行;未指定将删除所有行;

   若删除表,使用 DROP TABLE语句下载本文

显示全文
专题