数据库
首页 > 数据库> > sql中的查询(模糊查询,子查询,联表查询)

sql中的查询(模糊查询,子查询,联表查询)

作者:互联网

sql中的查询(模糊查询,子查询,联表查询)

关键字的执行优先级

from -->on -->join -->where -->group by -->having -->select -->distinct -->union -->order by

模糊查询

like关键字:select * from table where u_name like ’中国‘

_:表示单个字符,匹配任意字符,比如:

select * from user where U_name like ’_ 三 _‘;只找出“唐三藏”这样的u_name三个字的,且第二个字是三的

[ ]:表示括号内所列字符中 的一个(类似正则表达式)。指定一个字符,字符串或范围,要求所匹配对象为他们中的任何一个。

比如:select * from user where u_name like ‘[张李王]三’ 将找出张三,李三,王三,(而不是“张李王三”)

[^]:表示不在括号所列之内的单个字符

子查询—(where中的子查询)

子查询:子查询就是指在一个完整的查询语句中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,

子查询可以返回的数据类型一共分为四种

单行单列:返回的是一个具体的内容,可以理解为一个单值数据

单行多列:返回一行数据中多个列的内容

多行多列:返回多行记录之中同一列的内容,相当于给出了一个操作范围

多行多列:查询返回的结果是一张临时表

在where子句中处理单行单列子查询,多行多列子查询,单行多列子查询

单行单列子查询:

1、查询公司之中工资最低的雇员的完整信息

select * from emp e where e.sal=(select min(sal) from emp);

2、查询出基本工资比allen低的全部雇员的信息

select * from emp e where e.sal <(select sal from emp where ename='allen')

3、查询出基本工资高于公司平均薪金的全部雇员信息

select * from emp e where e.sal>(select avg(sal) from emp);

单行多列子查询:

1、查询出于allen从事同一工作,并且基本工资高于雇员编号为7521的全部雇员信息

select * from emp e where e.job=(select job from emp where ename='allen') and e.sal>(select sal from emp where empno=7521)

2、查询与scott从事同一工作且工资相同的雇员信息

select * from emp e where (e.job,e.sal)=(select job,sal from emp where ename='scott') and ename<>'scott'

3、查询与雇员从事同一天工作且领导相同的全部雇员信息

select * from emp e where (e.job,e.mgr)=(select job,mgr from emp where empno=7566 

4、查询与allen从事同一年雇佣的全部雇员信息(包括allen)

select * from emp e where(e.job,to_char(e.hiredate,'yyyy') from emp where ename='allen');

多行单列子查询:主要使用三种操作符:IN ,ANY ,ALL

in查询是包含
any大多数所用和in类似,in(1,2,3)相当于=any(1,2,3),和some这个关键字一样
区别是any可以用大于小于,比如 列1>any(1,2,3)就是查询列1 只要大于1,2,3其中任何一个数字就行,相当于列1>1
all同理 不过any是或查询 all是与查询 列1>all(1,2,3),相当于>3

in操作:1、查出每个部门中最低工资相等的全部雇员信息

select * from emp e where e.sal in(select min (sal) from emp grop by deptno);

2、查出不与每个部门中最低工资相同的全部雇员信息

selct * from emp e where e.sal not in(select min(sal) from emp group by deptno);

ANY在使用中有如下三种使用形式:

=any:表示与子查询中的每个元素进行比较,功能与in类似 (然而<>any不等价于not in)

(>any):比子查询中返回结果的最小的 要大(还包含了>=any)

(<any):比子查询中返回结果的最大的要小(还包含了<=any)

1、查询出每个部门经理的工资

select * from emp where sal=any(select min (sal) from emp where job='manager' group by deptno);

2、查询出每个部门大于经理的工资

select * from emp where sal>any (select min (sal) from emp where job='manager' group by deptno);

3、查出每个部门大于经理的工资

select * from emp where sal>any(select min (sal) from emp where job='manager' group by deptno);

4、查询出每个部门小于经理的工资

select * from emp where sal<any(select min (sal) from emp where job='manager' group by deptno)

all操作符有以下三种用法

<>ALL:等价于NOT IN(但是=ALL并不等价于IN)
>ALL:比子查询中最大的值还要大(还包含了>=ALL)
<ALL:比子查询中最小的值还要小(还包含了<=ALL)

1、查出每个部门不等于经理的工资

select from emp where sal <>all(select min (sal) from emp where job='manager' group by deptno)

2

select * from emp where sal<all(select min (sal) from emp where job ='manager group by deptno');

3

select * from emp where sal>all(select min(sal) from emp where job='manager' group by deptno);

联表查询

左连接:left jion或 left outer jion 返回包括左表中所有记录和右表中联结字段相等的记录

右连接:right jion 返回包括右表中得到所有记录和左表中联结字段想等等的记录

内联接:inner jion (等值连接)只返回两个表中联结字段相等的行

举例如下:
--------------------------------------------
表A记录如下:
aID     aNum
1     a20050111
2     a20050112
3     a20050113
4     a20050114
5     a20050115

表B记录如下:
bID     bName
1     2006032401
2     2006032402
3     2006032403
4     2006032404
8     2006032408

--------------------------------------------

1.left join
sql语句如下:
select * from A
left join B
on A.aID = B.bID

结果如下:
aID     aNum     bID     bName
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404
5     a20050115    NULL     NULL

(所影响的行数为 5 行)
结果说明:
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
B表记录不足的地方均为NULL.
--------------------------------------------

2.right join
sql语句如下:
select * from A
right join B
on A.aID = B.bID

结果如下:
aID     aNum     bID     bName
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404
NULL     NULL     8     2006032408

(所影响的行数为 5 行)
结果说明:
仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.
--------------------------------------------
3.inner join
sql语句如下:
select * from A
innerjoin B
on A.aID = B.bID

结果如下:
aID     aNum     bID     bName
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404

结果说明:
很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.
--------------------------------------------
注:
LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。

语法:FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2

说明:table1, table2参数用于指定要将记录组合的表的名称。
field1, field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。
compopr参数指定关系比较运算符:"=", “<”, “>”, “<=”, “>=” 或 “<>”。
如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误

标签:sal,查询,job,emp,联表,sql,where,select
来源: https://blog.csdn.net/weixin_44823472/article/details/104767343