SQL server数据查询笔记

数据查询

一、单表查询

二、连接查询

三、嵌套查询

四、集合查询

五、基于派生表的查询


一、单表查询

1.列查询

select [all|distinct] <表达式> [别名] [,<表达式> [别名]]...
from <表名|视图名> [,<表名|视图名>]...|(<select语句>) [as] <别名>
[where <条件表达式>]
[group by <列名1> [having <条件表达式>]]
[order by <列名2> [asc|desc]];

注:默认情况下select all

2.元组查询

  • 限定all或distinct
  • 增加where限定条件

where子句常用字符

查询条件 谓词 比较 =,>,<,>=,<=,!= 确定范围 between and,not between and 确定集合 in,not in 字符匹配 like,not like 空值 is null,is not null 逻辑运算 and,or,not

1.比大小

2.确定范围

between and包括两端的值

3.确定集合

       

4.字符匹配

格式:

[not] like '<匹配串>' [escape '<换码字符>']

%代表任意长度字符串,_代表任意单个字符

  • 聚集函数

聚集函数

count(*) 元组个数 count([all|distict] <列名>) 该列值个数 sum([all|distict] <列名>) 该列值综合 avg([all|distict] <列名>) 该列平均值 max([all|distict] <列名>) 该列最大值 min([all|distict] <列名>) 该列最小值

注:聚集函数只能用于select子句和group by的having子句中,默认为all

  • group by子句

作用:细化聚集函数的作用范围

 

3.order by


2.连接查询

  • 等值连接与非等值连接

等值连接:连接运算符为=

非等值连接:连接运算符不为=

连接查询的两种形式:

[<表1>.]<列名1> <比较运算符> [<表2>.]<列名2>
[<表1>.]<列1> between [<表2>.]<列2> and [<表2>.]<列3>

注:连接字段必须可比

Ex:查询选修2号课程且成绩在90分上所有学生的学号和姓名

注:先输入其他条件再输入连接条件执行效率更高 

  • 自身连接

EX:查询每一门课的先修课的先修课

  • 外连接

EX:查询每个学生的选课信息时,默认情况下要是有学生没选课,那么这个学生的信息就不显示了,现在要求把没选课的学生也显示出来

  • 多表连接

3.嵌套查询

查询块:一个select-from-where语句块

嵌套查询:查询块嵌入到另一个查询块的where或having子句中的查询

相关查询:子查询的查询条件依赖于父查询

不相关查询:子查询的查询条件不依赖于父查询

EX:查询和刘晨在同一个系中学习的学生

  • 使用in来完成嵌套查询
select Sno,Sname,Sdept
from Student
where Sdept in
    (
        select Sdept
        from Student
        where Sname='刘晨'
    );
  • 使用比较运算符来完成嵌套查询(得确切知道内层查询只有一个值了
select Sno,Sname,Sdept
from Student
where Sdept=
    (
        select Sdept
        from Student
        where Sname='刘晨'
    );

 EX:找出每个学生超过他自己选修课程平均成绩的课程号

select Sno,Cno
from SC x
where Grade>=
    (
        select avg(Grade)
        from SC y
        where y.Sno=x.Sno
    );

注:这里为了区分子查询和父查询中的SC,分别对SC取不同的别名来指示。

  • 带有any(some)all谓词的子查询

注:用聚集函数实现子查询比直接用any或all查询效率要高。

  • 带有exists谓词的子查询

注:

1.由exists引出的子查询,其目标列表达式通常用*,因为带exists的子查询只返回真或假值,给出列名无实际意义。

2.SQL中没有全称量词,只能用exists/not exists来代替。

EX:查询选修了全部课程的学生姓名

select Sname
from Student
where not exists
    (
        select *
        from Course
        where not exists
            (
                select *
                from SC
                where Sno=Student.Sno and Cno=Course.Cno
            )
    )

注:按照SQL没有全称量词的尿性,只能用没有一门课程是他不选修的来代替。

4.集合查询

集合操作:并(union)、交(intersect)、差(except)

5.基于派生表的查询

子查询不仅可以在where和having子句,也插入在from子句中,以此生成一个派生表并成为主查询的查询对象

EX:查询所有选修了1号课程的学生姓名

select Sname
from Student, (select Sno from SC where Cno='1') as SC1
where Student.Sno=SC1.Sno;

注:这里的as可以省略,SC1就是个派生表,现在SC1就可以当个普通的表来查询了

发布了26 篇原创文章 · 获赞 6 · 访问量 1607

猜你喜欢

转载自blog.csdn.net/qq_40677317/article/details/102809152