serversql数据库的查询操作

sql数据库

sql数据库的执行顺序

5. select       查看结果集中的哪个列,或列的计算结果 
1. from         需要从哪个数据表检索数据
2. where        过滤表中数据的条件
3. group by     如何将上面过滤的数据分组
4. having       对已分组的数据进行过滤的条件
6. order by     按照不同排序方式返回数据

下述查询中所用的数据表

  • 部门表dept数据
did dname dmgr
1 销售部 1001
2 研发部 1005
3 服务部 1008
  • 员工表emp数据
id name gender age salary dno mgrid
1001 赵伟 38 6000 1  
1002 李萍兰 26 3000 1 1001
1003 秦晓 30 4000 1 1001
1004 赵晓辉 32 4200   1001
1005 张岚 40 8000 2  
1006 李秋平 24 4000 2 1002
1007 顾世刚 30 6000 2 1002
1008 段大宇 36 5000 3  

sql联表

  • 内连接
    • 指返回数据完全满足连接条件
  • 外连接
    • 指返回数据除了包含完全满足连接条件的数据,还包括不满足连接条件的数据
    • 左外连接、右外连接、全连接
  • 自连接
    • 指连接的表是自身
  • 交叉连接
    • 表连接时没有连接条件,返回结果是两个表数据的笛卡尔积

内连接

  • 连接语法一

 

select  column_list 
from    table_name1,table_name2     #表之间通过逗号隔开
where   codition                    #表之间的连接条件
  • 连接语法二

 

select column_list
from table_name1
[inner] join table_name2        #表之间的连接通过 join实现
on condition;                   #表之间的连接条件
[...n]  

外连接

外连接: 指表连接时除了返回符合连接条件的数据外,同时返回不符合连接条件的数据

  • 左外连接:
    • 是以左侧表为主,除返回符合连接条件的数据外,还返回左侧表不符合连接条件的数据
  • 右外连接:
    • 是以右侧表为主,除返回符合连接条件的数据外,还返回右侧表不符合连接条件的数据
  • 全外连接:

    • 除返回符合连接条件的数据外,还同时返回所有不符合连接条件的数据
  • 语法:

 

select  column_list
from    table_name1
[left|right|full]   [outer] join table_name2    #表之间的连接条件通过 xx join 实现
on  condition                                   #表之间的连接条件
[...n]  

自连接

指对同一个表的连接,要执行一个内连接,必须使用不同的别名来区分

 

select e1.name 员工姓名,e2.name 上级主管
from emp e1,emp e2
where e1.mgrid=e2.id    

交叉连接

在多表查询时,如果没有连接条件,则一个表的所有行将会和另一个表的所有行都会进行连接,连接的结果称为笛卡尔积

  • 连接语法一:

 

select column_list
from table_name1,table_name2[...n]
  • 连接语法二:

 

select column_list
from table_name1
cross join table_name2[...n]

子查询

在前面使用的查询语句都是只包含一条select语句,而有些情况下依靠单条select语句无法完成查询要求

这时候需要在select语句中内部嵌入另外的select语句,这条嵌入的select语句称为子查询

子查询除了可以应用到select语句中,也可以应用到insert、update、delete语句中

  • 单行子查询
    • 只返回一行一列数据的子查询称为单行子查询
    • 外部查询可使用比较运算符: = 、> 、>= 、 < 、<= 、<> 操作符
  • 多行子查询
    • 返回多行单列数据的子查询称为多行子查询
    • 外部查询可使用:in、not in 、any、all操作符
  • 关联子查询
    • 子查询引用外部查询中包含的一列或多列,查询的执行依赖外部查询
    • 针对每行外部查询数据,都将执行一次子查询
    • 外部查询可使用 exists、not exists 操作符

单行子查询

单行子查询不向外部的SQL语句返回结果,或者只返回一行

单行子查询可应用于select语句的where字句、having字句中

  • 在where字句中使用
    • 子查询作为条件判断的一方,位于小括号中(...)

 

- 查询年龄最小的员工信息
    select * from emp
    where age=(select min(age) from emp)
    结果:查询到一条
- 查询大于最小年龄的员工信息
    select * from emp
    where age>(select min(age) from emp)
    结果:查询到多条信息
  • 在having字句中使用

 

- 查询部门员工平均年龄小于所有员工平均年龄的部门和该部门员工平均年龄
    select dno 部门编号,avg(age) 平均年龄 from emp
    group by dno
    having avg(age)<(select avg(age) from emp)

多行子查询

多行子查询通常返回一条或多条记录,多行子查询结果用于where语句时

判断可以使用in、any、all操作符

-查询负责管理其他员工的员工信息    --in
    select * from emp
    where id in (select mgrid from emp where mgrid is not null)
- 查询年龄大于所有部门最大年龄的员工信息   --all
    select * from emp
    where age > all(select max(age) from emp group by dno)
- 查询年龄大于任意部门最大年龄的员工信息   --any
    select * from emp
    where age > any(select max(age) from emp group by dno)

关联子查询

子查询中引用父查询信息,称为关联子查询

关联子查询对于外部查询中的每一行都会运行一次

-查询每个部门年龄最小员工
    select * from emp o
    where age=(select min(age) from emp i where i.dno=o.dno)
-查询负责管理其他员工的员工信息
    select * from emp e1
    where exists (select 1 from emp e2 where e2.mgrid=e1.id)
-查询不负责管理其他员工的员工信息
    select * from emp e1
    where not exists (select 1 from emp e2 where e2.mgrid=e1.id)

高级查询

操作符 说明
union all 并运算。返回各个查询检索出的所有行,包括重复行
union 并运算。返回各个查询检索出的所有行,不包括重复行
intersect 交运算。返回两个查询检索的共有行
except 差运算。从左查询中返回右查询没有找到的所有的所有非重复值

union all 操作

union all 操作只合并结果集,不去除重复数据

- 查询所有产品
    select * from prod1
    union all
    select * from prod2
    结果可能含有重复行

union操作

union操作合并结果集后去除重复数据

-查询所有产品
    select * from prod1
    union
    select * from prod2
    结果:无重复行

intersect操作

intersect操作返回结果集间的交集,也就是共有部分

-查询两个产品表的共有产品
    select * from prod1
    intersect
    select * from prod3
    结果:返回两表共有行

猜你喜欢

转载自www.cnblogs.com/tang-s/p/10123460.html