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