012.多表查询 013.多表连接
1.多表查询
语法:
select * from table1,table2;
使用这种语法可以查询出两个表中的记录的组合(列相加,行相乘,这就是笛卡尔乘积);
如果两个表中有重复的列名,可以通过 表名.列名进行区分
为了方便重复使用表名,可以为表设置一个别名
多个表进行连接查询;
select empno,e.deptno,dname,sal,gradeName from emp e,dept d,sal_grade s
where e.deptno=d.deptno and sal BETWEEN s.lowsal
and s.hignsal
2.内连接和外连接
内连接:完全满足连接条件;
外连接:就算不满足连接条件,其中一个表中的数据也一定会查到;
3.标准sql-99的多表查询语法
select * from t1 连接方式 t2
on 连接条件
select * from t1 inner join t2
on t1.xxx=t2.xxx;
外连接的语法
左外:left [outer] join
右外:right [outer] join
示例:
select * from emp left join dept
on emp.deptno=dept.deptno;
三表相联的示例
select * from emp e left join dept d
on e.deptno=d.deptno inner join sal_grade s
on sal BETWEEN s.lowsal and s.hignsal
自连接
表中的一个列的取值范围来源于当前的其它字段(主键)
思路:将一个表查两次(把一张表当成两个表来看待)
示例
select e1.empno,e1.ename,e2.ename leader from emp e1,emp e2
where e1.leader=e2.empno and e1.empno=7878
014.子查询
1.子查询
子查询就是在一个查询语句中同时包含了更外一个查询语句,这样的语名就是子查询;
一个子查询可以放在另外一个查询的三个位置,分别是
where 子句
having 子句
from 子句;
使用where或having时,子查询的结果可以返回单行记录,也可以返回多行记录;返回单行记录时可以使用> ,< ,=,!=等操作符,返回多行记录时,可以使用in,any,all操作符;
2.any,all的区别
any与all必须与>,< ,<=,<=一起结合着使用;
>any():大于any集合中任意一个,其实就是大于最小的那个
>all():大于all集合中所有的,其实就是大于最大的那个;
3.练习;
查询出比james的工资高的所有员工;
查询出比平均工资高的所有员工;
查询出james的同事
查询出比james工资高,并且与james职位相同的员工;
查询出平均工资高于20部门的平均工资的职位;并从高到低进行排序;
查询出没有员工的部门;
015.exists子句
1.exists语句
exists语法;
select * from 表名
where exists(sql语句)
2.说明:
exists中包含一条查询语句 ,如果查询语句有结果,那么这个表达式为true,如果子查询中没有结果,则表达式的值为false;
使用exists时,先执行外部查询,再执行子查询;在子查询中可以使用外部的查询表;
016.常用函数
常用函数
数值:
abs:绝对值
Truncate():截断
Round():四舍五入
RAND():随机数
POW():次方
字符:
length():字节数
char_length():字符数
trim():去除前后的空格
concat():连接字符串
upper():转成大写
lower():转成小写
substring():截取子串
日期:
now():当前日期和时间
current_date:当前日期
current_time:当前日期
select now()- INTERVAL 2 WEEK
时间 +,-操作符 INTERVAL 增量(1,2,4) 单位(DAY,YEAR,MONTH)
转换:
select DATE_FORMAT(now(),'%Y-%m-%d')
select STR_TO_DATE('2015-6-23','%Y-%m-%d')
case语句,可以做分支判断 ;(行变列时可以使用)
select ename,job,sal,
case
when sal>15000 then '高薪'
when sal>8000 then '中等'
else '低薪'
end salary
from emp;
select ename,job,sal,
case job
when 'manager' then '经理'
when 'programmer' then '攻城狮'
else '其他'
end job
from emp