一、sql语法
1 select */列名1,列名2... from 表名[连接查询 内连接/左连接 on条件] 必选的 2 3 where 条件 子查询/in/exists/between ... and .. 可选的 4 5 group by 分组列1,分组列2... 可选的 6 7 having 字句 可以对分组结果进行筛选 可选的 8 9 order by 排序列1,排序列2... 可选的
各个关键字的数据必须要保证
二、写sql语句的步骤
1、要先确定从哪个表中查询数据,是要从一个表查询,还是要从多个表查询,如果是多个表必须用连接查询。
2、确定是否需要分组查询
3、写where条件
4、写需要返回的列
三、连接查询
连接查询分两类,交叉连接和普通连接查询
1、交叉连接
交叉连接可以用逗号分隔多个表,也可以用关键字cross join ,交叉连接返回两个表数据的笛卡尔集。
2、连接查询
连接查询分内连接和外连接,外连接有分为左外连接,右外连接,全连接
最常用的是内连接和左外连接
内连接返回所有满足连接条件的记录
select * from 表1 [inner] join 表2 on 表1. 外键=表2.主键
1 --查询所有有部门的员工的信息 2 select * from emp e inner join dept d on e.deptno=d.deptno;
左外连接返回左表的所有数据+右表匹配到的数据,如果左表匹配不到右表的数据,显示为空
1 --查询所有员工信息,如果员工有部门信息,显示出来,否则不显示 2 select * from emp e left join dept d on e.deptno=d.deptno;
右外连接同左外连接
全连接返回左表的所有数据+ 右表的所有数据,如果匹配不到对方的数据,则显示为空
1 --查询所有员工和部门信息,如果匹配不到显示为空 2 select * from emp e full join dept d on e.deptno=d.deptno;
三、in
iin用在连接条件中,表示某个字段的值在in提供的列表之中。
1 select * from 表 where 列名 in (值1,值2...);
in后还可以是一个子查询,子查询一般会返回多个结果。
1 举例:查询部门编号在10,20,30之中的用户的信息 2 select * from emp where deptno in (10,20,30);
in 和=的区别,in后面可以跟多个值,=后面只能有一个值
1 举例:查询部门名称为BOSTON或者CHICAGO的员工的信息 2 select e.* from emp e inner join dept d on e.deptno=d.deptno where d.loc ='BOSTON' or d.loc='CHICAGO' 3 使用in: 4 select * from emp where deptno in (select deptno from dept where loc in ('BOSTON','CHICAGO'));
四、between ... and ...
一般也用在条件中,between开始值and结束值,开始值和结束值一般是数字,也可以是其他类型(字符串,日期)
字符串比较和字符串的长度无关,会从第一个字符开始向后比较,如果相同再比较下一个。
1 举例:查询基本工资在1500到2000之间的员工的信息 2 select * from emp where sal between 1500 and 2000;
1 查询 1981年到1998年之间雇佣的员工的信息 2 --把字符串转换为日期之后再比select * from emp e where e.hiredate between 3 to_date('1981-01-01','yyyy-mm-dd') and to_date('1998-12-31','yyyy-mm-dd'); 4 --把日期转换为字符串之后再比select * from emp e where to_char(e.hiredate,'yyyy-mm-dd') between 5 '1981-01-01' and '1998-12-31';
五、group by
group by 分组查询
select 结果列 from 表 where 条件 group by 列1,列2...
注意:结果列只能是两种形式:
1、要么是分组的列
2、如果要返回其他列,需要对其他列使用聚合函数
1 举例:统计各部门不同职位的人有多少个 2 select deptno,job,count(empno) from emp group by deptno,job 3 select dname,job,count(empno) from emp e inner join dept d on e.deptno=d.deptno 4 group by e.deptno,dname,job;
having 子句可以对分组查询的结果进行过滤
举例:统计各部门不同职位的人有多少个,只显示部门人数大于2的信息
1 select dname,job,count(empno) c from emp e inner join dept d on e.deptno=d.deptno 2 group by e.deptno,dname,job 3 having count(empno) >2 4 ;
六、order by
order by 排序,可以对多列排序order by 列1 升序/降序,列2 升序/降序 默认是升序asc.
例子:查询员工信息 按基本工资从大小排列
1 --先按员工基本工资倒序,再按奖金倒select * from emp order by sal desc,comm desc;