Sql语句
DML数据操纵语言:查询(select)、插入(insert)、删除(delete)、修改(update)
DDL数据定义语言:创建(create)、修改(alter)、删除(drop)、清空(truncate)
DCL权限控制语言:赋予权限(grant)、回收权限(revoke)
TL事务控制语言:提交(commit)、回滚(rollback)
DML数据操纵语言:
1、查询(select):
1):种类
连接查询:
1、等值连接:利用一张表中某列的值和另一表中某列的值相等,把俩表连接起来
例如:查询员工的名字、部门编号、部门名字
select last_name,dept_id,name from s_emp,s_dept where s_emp.dept_id=s_dept.id;
为了语句表述清楚可以用别名
select se.last_name,se.dept_id,sd.id,sd.name from s_emp se,s_dept sd
where se.dpt_id=sd.id;
2、不等值连接:
例如:
salgrade():表示工资等级表 losal() :表示最低工资 hisal():表示最高工资
查询出员工名字、职位、工资、工资等级名称
select e.last_name,e.title,e.salary,s.gradeNmae
from s_emp e,salgrade s
where e.salray between s.losal and s.hisal
3、外连接:与内连接相比,即使没有匹配行,也会返回一个表的全集
重点:至少有一方保留全集,没有匹配行用null代替
左外连接:结果集保留左表的所有行,只保留第二个表与第一个表的行。第二个表相应的空行被放入NULL值。
例如:查询所有员工以及对应的部门的名字,没有部门的员工也要显示出来
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id=s_dept.id(+);
或者
select last_name,dept_id,name
from s_emp left [outer] join s_dept
on s_emp.dept_id=s_dept.id;
重点:+号要放在所查询数值较小的一方
2、右外连接:保留第二个表的所有行
例如:查询所有员工以及对应的部门的名字,没有任何员工的部门也要显示出来
例如:查询所有员工以及对应的部门名字,没有任何员工的部门也要显示出来,没有部门的员工也要显示出来
select last_name,dept_id,name
from s_emp full [outer] join s_dept
on s_emp.dept_id=s_dept.id
4、自连接:一张表,自己和自己连接
例如:查询每个员工的名字以及员工对应的管理者的名字
select s1.last_name,s2.last_name manager_naem
from s_emp s1,s_emp s2
where s1.manager_id=s2.id;
补充:对查询结果集的操作(对俩条SQL语句进行操作)
union 获得俩个结果集的并集
union all 把俩个结果集合在一起显示出来(会自动排序,比union多了排序效果)
minus 第一个结果集出去第二个结果集和它相同的部分
intersect 获得俩个结果集的交集
注意:前提条件,俩个结果集中[查询的列]要完全一致
例如:获得俩个结果集的并集(并集、去交集、交集)
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id=s_dept.id(+)
union[union all,minus,intersect]
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id(+)=s_dept.id
3、子查询:嵌套查询
1)、 单行子查询:子查询的结果集是一行
单行操作符对应单行子查询:> < >= <= = <>
例子 :谁的工资比Abel高?
/*
分析1:求出Abel的工资
分析2:筛选employees表,判断salary>Abel的工资
*/
条件1:
select salary from employees where last_name='Abel';
条件2:
select * from employees where salary > 条件1
结果:
select * from employees where salary >(
select salary from employees where last_name='Abel'
);
2)、多行子查询:子查询的结果集时多行
多行操作符:in(在...中)、any(任意一个)、all(所有的)、not in
例子 : 返回其他部门中比job_id为'IT_PROG'部门任一工资低的员工的员工号、姓名、job_id以及salary
分析1:先查询job_id为'IT_PROG'部门任一工资
分析2:查询员工号、姓名、job_id以及salary比分析1的任何员工工资低
select employee_id,last_name,job_id,salary from employees
where salary<any(
select salary from employees where job_id = 'IT_PROG'
);
总结:嵌套查询中已知条件是子查询,是在操作符右方的,要查询的内容是父查询,是放在左方的。