广告位联系
返回顶部
分享到

SQL嵌套查询的具体使用

MsSql 来源:互联网 作者:佚名 发布时间:2023-01-28 22:15:53 人浏览
摘要

嵌套查询又称子查询,有select子查询,where子查询,from子查询,exists子查询。 插入数据 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 4

嵌套查询又称子查询,有select子查询,where子查询,from子查询,exists子查询。

插入数据 

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

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

#创建表及插入记录

CREATE TABLE class (

  cid int(11) NOT NULL AUTO_INCREMENT,

  caption varchar(32) NOT NULL,

  PRIMARY KEY (cid)

) ENGINE=InnoDB CHARSET=utf8;

  

INSERT INTO class VALUES

(1, '三年二班'),

(2, '三年三班'),

(3, '一年二班'),

(4, '二年九班');

  

CREATE TABLE course(

  cid int(11) NOT NULL AUTO_INCREMENT,

  cname varchar(32) NOT NULL,

  teacher_id int(11) NOT NULL,

  PRIMARY KEY (cid),

  KEY fk_course_teacher (teacher_id),

  CONSTRAINT fk_course_teacher FOREIGN KEY (teacher_id) REFERENCES teacher (tid)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  

INSERT INTO course VALUES

(1, '生物', 1),

(2, '物理', 2),

(3, '体育', 3),

(4, '美术', 2);

  

CREATE TABLE score (

  sid int(11) NOT NULL AUTO_INCREMENT,

  student_id int(11) NOT NULL,

  course_id int(11) NOT NULL,

  num int(11) NOT NULL,

  PRIMARY KEY (sid),

  KEY fk_score_student (student_id),

  KEY fk_score_course (course_id),

  CONSTRAINT fk_score_course FOREIGN KEY (course_id) REFERENCES course (cid),

  CONSTRAINT fk_score_student FOREIGN KEY (student_id) REFERENCES student(sid)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  

INSERT INTO score VALUES

(1, 1, 1, 10),

(2, 1, 2, 9),

(5, 1, 4, 66),

(6, 2, 1, 8),

(8, 2, 3, 68),

(9, 2, 4, 99),

(10, 3, 1, 77),

(11, 3, 2, 66),

(12, 3, 3, 87),

(13, 3, 4, 99),

(14, 4, 1, 79),

(15, 4, 2, 11),

(16, 4, 3, 67),

(17, 4, 4, 100),

(18, 5, 1, 79),

(19, 5, 2, 11),

(20, 5, 3, 67),

(21, 5, 4, 100),

(22, 6, 1, 9),

(23, 6, 2, 100),

(24, 6, 3, 67),

(25, 6, 4, 100),

(26, 7, 1, 9),

(27, 7, 2, 100),

(28, 7, 3, 67),

(29, 7, 4, 88),

(30, 8, 1, 9),

(31, 8, 2, 100),

(32, 8, 3, 67),

(33, 8, 4, 88),

(34, 9, 1, 91),

(35, 9, 2, 88),

(36, 9, 3, 67),

(37, 9, 4, 22),

(38, 10, 1, 90),

(39, 10, 2, 77),

(40, 10, 3, 43),

(41, 10, 4, 87),

(42, 11, 1, 90),

(43, 11, 2, 77),

(44, 11, 3, 43),

(45, 11, 4, 87),

(46, 12, 1, 90),

(47, 12, 2, 77),

(48, 12, 3, 43),

(49, 12, 4, 87),

(52, 13, 3, 87);

  

  

CREATE TABLE student(

  sid int(11) NOT NULL AUTO_INCREMENT,

  gender char(1) NOT NULL,

  class_id int(11) NOT NULL,

  sname varchar(32) NOT NULL,

  PRIMARY KEY (sid),

  KEY fk_class (class_id),

  CONSTRAINT fk_class FOREIGN KEY (class_id) REFERENCES class (cid)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  

INSERT INTO student VALUES

(1, '男', 1, '理解'),

(2, '女', 1, '钢蛋'),

(3, '男', 1, '张三'),

(4, '男', 1, '张一'),

(5, '女', 1, '张二'),

(6, '男', 1, '张四'),

(7, '女', 2, '铁锤'),

(8, '男', 2, '李三'),

(9, '男', 2, '李一'),

(10, '女', 2, '李二'),

(11, '男', 2, '李四'),

(12, '女', 3, '如花'),

(13, '男', 3, '刘三'),

(14, '男', 3, '刘一'),

(15, '女', 3, '刘二'),

(16, '男', 3, '刘四')

  

CREATE TABLE teacher(

  tid int(11) NOT NULL AUTO_INCREMENT,

  tname varchar(32) NOT NULL,

  PRIMARY KEY (tid)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  

INSERT INTO teacher VALUES

(1, '张磊老师'),

(2, '李平老师'),

(3, '刘海燕老师'),

(4, '朱云海老师'),

(5, '李杰老师');

 select子查询(外语句先执行,内语句后执行)

例1. 查询课程名并显示课程老师的名称

1

2

3

4

5

6

?

select * from course c where c.teacher_id='1';

select * from teacher t where t.tid='1';

  

??-- 最后拼接

select * ,(select tname from teacher t where t.tid=c.teacher_id)name from course c;

where 子查询(先执行子查询,再执行外查询)

例2.查询学习了体育的学生

1

2

3

4

5

6

7

-- 选择了体育学生的id

select sc.student_id from course co

left join score sc on co.cid=sc.course_id where cname='体育'

-- 通过学生表用学生id匹配学生姓名

select st.sname from student st where st.sid in(

select sc.student_id from course co

left join score sc on co.cid=sc.course_id where cname='体育')

部分结果: 

 from 子查询(先执行子查询,再执行外查询)

例3.列出三年二班学了体育的学生

1

2

3

4

5

select a.* from (select st.sname,cl.caption from score sc

left join course co on sc.course_id=co.cid

left join student st on st.sid=sc.student_id

left join class cl on cl.cid=st.class_id

where co.cname='体育')a where a.caption='三年二班';

  exists 子查询

(先执行外语句,再执行子查询,根据子查询返回结果判断是否保留外查询结果)

例4.查询学了课程di为1的学生的姓名

1

2

3

select * from student st where exists(

select *from score sc where course_id='1' and sc.student_id=st.sid

);

总结

sql查询本质就是对各种表进行裁剪和拼接,最后得到我们想要的数据。

所有的能通过子查询完成的查询都能用连接查询完成,如例1:查询课程名并显示课程老师的名称

1

2

select *from course co

left join teacher te on te.tid=co.teacher_id;

 所以要灵活运用查询方式,才能更高效的查询。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/qq_68860973/article/details/126321025
相关文章
  • 编写SQLMap的Tamper脚本过狗

    编写SQLMap的Tamper脚本过狗
    测试环境 最新版某狗 测试方法 安全狗其实是比较好绕的WAF,绕过方法很多,但这里我们就用一种:注释混淆 一招鲜吃遍天 注释混淆,其实
  • SQL嵌套查询的具体使用

    SQL嵌套查询的具体使用
    嵌套查询又称子查询,有select子查询,where子查询,from子查询,exists子查询。 插入数据 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
  • 关于SQL表中drop table和delete table的区别

    关于SQL表中drop table和delete table的区别
    问题:使用阿里云的maxcompute产品发现有中间表的产生,需要删除。 删表是一个比较危险的操作,这次给了个机会就想尝试下,记得在mysql表
  • 嵌入式SQL的详细介绍

    嵌入式SQL的详细介绍
    嵌入式SQL概述 嵌入式SQL(Embedded SQL) 是应用系统使用编程方式来访问和管理数据库中数据的主要方式之一。 SQL语言有两种使用方式:一种是作
  • sql IDENTITY_INSERT对标识列的作用和使用
    一般情况下,当数据表中,莫一列被设置成了标识列之后,是无法向标识列中手动的去插入标识列的显示值。但是,可以通过设置SET IDENTI
  • SQL多表联合查询时如何采用字段模糊匹配

    SQL多表联合查询时如何采用字段模糊匹配
    背景:由于业务或是其他不描述的原因的问题导致原有存储的数据发生变动,与现有数据有差别,但还是能勉强看明白数据内容。 要求:实
  • 清除SQL Server数据库日志(ldf文件)的方法

    清除SQL Server数据库日志(ldf文件)的方法
    清除SQL Server数据库日志(ldf文件)的几种方法 随着系统运行时间的推移,数据库日志文件会变得越来越大,这时我们需要对日志文件进行备份
  • if exists的用法及说明
    1 判断数据库是否存在 1 2 if exists (select * from sys.databases where name = 数据库名) drop database [数据库名] 2 判断表是否存在 1 2 if exists (select * from
  • SQL Server ISNULL 不生效原因及解决方法
    SQL Server ISNULL 不生效原因 数据库:SQL Server 2008 R2 原始SQL:historyval 字段没有数据显示为NULL,用ISNULL判断为NULL的时候替换为 0.0 1 2 3 4 5 6 SE
  • 恢复SQLSERVER的master系统库的方法

    恢复SQLSERVER的master系统库的方法
    一、问题描述 SQL Server 的master数据库不能像其他用户或 系统数据库一样恢复, 因为没有活动的master数据库 SQL Server 无法执行。虽然很少需要
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计