闫平平
写代码也要酷酷的!

导航

 

一、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 * fromwhere 列名 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;

 

posted on 2019-05-13 22:32  写代码也要酷酷的  阅读(3295)  评论(0编辑  收藏  举报