-->

sql查询

2020-01-25 00:22发布

sql语法

select * 列名1,列名2... from 表名  【连接查询 内连接/左链接 on条件】 
where 条件 子查询/in/exists/between...and... 
group by分组列1,分组列2...
having 字句  可以对分组结果进行筛选
order by 拍序列1,拍序列2...

写sql语句的步骤

1、先确定从哪个表查询数据,是要从一个表查询还是从多个表查询,如果是多个表必须使用连接查询

2、确定是否需要分组查询

3、写where条件

4、写需要返回的列

连接查询

连接查询分内连接和外连接,外连接又分左外连接,右外连接,全连接

内连接 返回所有满足连接条件的记录

select * from 表1 inner join 表2 on 表1.外键=表2.主键

--查询所有有部门的员工的信息
select * from emp e inner join dept d on e.deptno=d.deptno;

左外连接返回左表的所有数据+右表匹配到的数据,如果左表匹配不到右表的数据,显示为null

--查询所有员工信息,如果员工有部门信息,显示出来,否则不显示
select * from emp e left join dept d on e.deptno=d.deptno;

右外连接同左外连接

全连接返回左表的所有数据+右表的所有数据 如果匹配不到对方的数据,都显示为null

--查询所有员工和部门信息,如果匹配不到显示为空
select * from emp e full join dept d on e.deptno=d.deptno;

in用在连接条件中,表示某个字段的值在in提供的列表之中

select * from 表 where 列名 in(值1,值2...)

in后还可以是一个子查询,子查询一般会返回多个结果

in和等号的区别,in后面可以跟多个值,=后面只能有一个值

beteween...and...

一般也用在条件中,between开始值 and结束值,开始值和结束值一般是数字,也可以是其他类型(字符串,日期)

字符串比较和字符串长度无关,会从第一个字符开始向后比较,如果相同再比较下一个

--举例:查询基本工资在1500到2000之间的员工的信息
select * from emp where sal between 1500 and 2000;

--查询 1981年到1998年之间雇佣的员工的信息
--把字符串转换为日期之后再比较
select * from emp e where e.hiredate between
to_date('1981-01-01','yyyy-mm-dd') and to_date('1998-12-31','yyyy-mm-dd');
--把日期转换为字符串之后再比较
select * from emp e where to_char(e.hiredate,'yyyy-mm-dd') between
'1981-01-01' and '1998-12-31';

group by

分组查询

select 结果列 from 表 where 条件 group by 列1,列2...

列只能是两种形式:要么是分组的列;如果要返回其他列,需要对其他列使用聚合函数

--举例:统计各部门不同职位的人有多少个
select deptno,job,count(empno) from emp group by deptno,job
select dname,job,count(empno) from emp e inner join dept d on e.deptno=d.deptno
group by e.deptno,dname,job;

having字句可以对分组查询的结果进行过滤

--举例:统计各部门不同职位的人有多少个,只显示部门人数大于2的信息
select dname,job,count(empno) c from emp e inner join dept d on e.deptno=d.deptno
group by e.deptno,dname,job
having count(empno) >2;

order by

order by 排序,可以对多列排序order by 列1 升序/降序 ,列2 升序/降序  默认是升序asc

--例子:查询员工信息 按基本工资从大小排列
--先按员工基本工资倒序,再按奖金倒select * from emp order by sal desc,comm desc;

 

标签: