2019-08-21

-- 有些时候where后面会有多个条件(逻辑关系运算符 and or not)
-- and逻辑与 x and y 一定满足所有条件,最终结果为true
-- 查询在10号部门工作的员工并且薪资不低于2500的员工信息
SELECT * FROM emp
WHERE deptno = 10 AND sal >= 2500
SELECT * FROM emp
WHERE deptno = 10 OR deptno = 20
-- and 和 or 的优先级 and的优先级高于or
SELECT * FROM emp
WHERE (deptno = 10 OR sal < 2500) AND deptno = 20
-- 特殊的比较运算符
-- 1. Between and 表示在某个区间[A,B] 一般情况下;B应该大于A
-- 查询工资在[2000,2500]区间员工信息
SELECT * FROM emp
WHERE sal BETWEEN 2000 AND 2500
-- 查询在20号部门入职日期在1994年员工的信息
SELECT * FROM emp
WHERE hiredate BETWEEN '1994-01-01' AND '1994-12-31' AND deptno = 20

-- 2.like (模糊查询):只适用于文本查询 特殊符合(% )%代表任意多个字符 代表一个字符
-- 语法规则
-- ename like 'a'
-- 查询ename中含有a字母的 ename like '%a%' % 表示此处可能有[0,n]个字符
-- 查询ename中倒数第二个字符是a字母的 ename like %a
表示一个字符
select * from emp where ename not like '%o
'

-- 3.in (集合):相当于or的关系 注意:如果in中的数据有null,null值是不能被查询出来的
select * from emp where deptno in(10,20) and job='CLERK'

-- 查询员工SMITH 或者AMY的员工信息

-- 查询在某一个日期(1992-01-15,1994-12-22,1994-07-05)员工入职信息
select * from emp where ename='SMITH' or ename='AMY'
select * from emp where hiredate in('1992-01-15','1994-12-22','1994-07-05')

-- 4.专门针对空值进行筛选的 is NULL
-- 查询所有没有奖金的员工的信息
select * from emp where comm is null

-- 5.not 表示特殊比较运算符的逻辑取反
select * from emp where comm is not NULL
-- 排序(升序asc:由小到大 降序desc:由大到小)
-- 语法:select.......FROM......WHERE......order by
-- 也可以按照多列进行排序
-- order by 列1 排序方式, 列2 排序的方式...... 列n的排序方式
-- 规则:它是在列1基础之上,进行列2排列

-- 查询所有员工信息,按照部门的编号升序排序,按照工资降序排序

select * from emp order by deptno asc,sal DESC

-- 查询20号部门的员工的姓名,工资,奖金,月收入(工资+奖金)按照月收入降序排序
select ename,sal,comm,sal+ifnull(comm,0) income from emp where deptno=20 order by income desc

-- 查询所有员工信息,按照月工资进行升序排序
select * from emp order by sal
select * from emp order by sal desc

-- 查询语句的编写顺序和执行的顺序
-- 编写的顺序 SELECT......FROM.....where.....order BY
-- 执行顺序: FROM.....WHERE....SELECT....order by

-- 多表查询
select * from emp
select * from dept
select * from location

-- 查询员工表中的编号,姓名,职位,工资以及部门表中的编号以及部门的名称
-- A{a,b,c}
-- B{d,e,f,g}
-- A*B={ad,ae,af,ag,bd,be,bf,bg,cd,ce,cf,cg}

-- 两个表来链接查询的话,一定要加上加上两个表的关联条件(让两个表中的数据一一对应)
select * from emp,dept
-- 只会将符合条件的数据显示出来,因为emp表中有一个员工没有部门(不符合条件的数据,是不会显示的)
select * from emp,dept where emp.deptno=dept.deptno

select empno,ename,sal,e.deptno,dname from emp e,dept d where e.deptno=d.deptno

-- 连接查询
-- 1。 等值链接(链接条件使用=)
-- 查询月薪高于3000的员工的姓名,月工资,所在部门的名称
select * from emp
select ename,sal+ifnull(comm,0) ,dname from emp e,dept d where sal+ifnull(comm,0)>3000 and e.deptno=d.deptno

-- 2.内链接 inner join.....on(关联条件) 它是SQL99标准的规范写法,在任何关系型数据库都适用
select ename,sal+ifnull(comm,0) ,dname from emp e inner join dept d on e.deptno=d.deptno where sal>3000

-- 查询员工的姓名,部门名称和地址(adress)(三表链接,要找到两两表之间的关系)

select e.ename,d.dname,l.adress from emp e,dept d,location l where e.deptno=d.deptno and d.loc=l.locid

select ename,dname,adress from emp inner join dept on emp.deptno=dept.deptno inner join location on dept.loc=location.locid

-- 3.外连接
-- 左外连接 left outer join : 会将左表符合条件、不符合条件的数据都表现出来
-- 右外连接 right out join : 会将左表符合条件、不符合条件的数据都表现出来
-- 全外连接 full outer join: 会将所有表中符合条件、不符合条件的数据都表现出来
-- 查询所有员工的信息(员工的姓名和所在部门)包含没有部门的员工的信息
select e.ename,d.dname from emp e left outer join dept d on e.deptno=d.deptno

-- 4.自链接(把一张表当成两张表来看)要求数据有一定的规律
-- 查询员工的编号,姓名,经理的编号以及姓名
select e1.empno,e1.ename,e2.empno,e2.ename from emp e1 left join emp e2 on e1.mgr=e2.empno

你可能感兴趣的:(2019-08-21)