码迷,mamicode.com
首页 > 数据库 > 详细

sql 练习1

时间:2020-02-19 17:14:25      阅读:324      评论:0      收藏:0      [点我收藏+]

标签:数据   运算   时间   原因   rollback   ack   last   ike   ash   

0.以orcale练习sql,orcale的sqlplus的命令

set linesize 140;
set pagesize 140;
host cls;               清屏
select * from tab; tab是数据字典
desc dept;
rollback;        回滚事务        

1.select (查询所有列,查询部分列,列中取别名,重复列)

1.1 查询所有列

select * from emp;

1.2 查询部分列

SQL> select empno, ename from emp;

1.3 列中取别名

别名用双引号,字符串用单引号

SQL> select empno as "部门编号", ename as "名称" from emp;

1.4 查询重复列

SQL> select distinct deptno from emp;

 

2.null空值

1)任何表达式与空值运算都为空。

2)null不等于null。

3)where xx in (xx , null)

4)order by .... nulls last

2.1. 任何表达式与空值运算都为空 --- 查询员工年收入

SQL> select empno "员工编号", ename "姓名", (sal*12 + comm) "年收入" from emp;

2.2 滤空修正 --- 查询员工年收入

SQL> select empno "员工编号", ename "姓名", (sal*12 + nvl(comm,0)) "年收入" from emp;

2.3 查询奖金为空的员工 

SQL> select *    from emp where comm is null;

2.4 查询奖金不为空的员工

SQL> select *    from emp where comm is not null;

 

3.连接

3.1 select 返回结果可以来自命令行

SQL> select ‘11111‘ || ‘22222‘ "连接", ename  from emp;

3.2 虚表

SQL> select ‘1111111‘ || ‘222222222‘ "连接" from dual;

3.3 查系统时间

SQL> select sysdate from dual;

 

4.过滤

语法

select *
from table
where colname1 [=|>|<|..] 20
where cloname2 between A and B
where cloname3 in (1, 5)

4.1 查询工资在1000-2000之间的员工信息

SQL> select * from emp where sal >=1000 and sal <= 2000;
SQL> select * from emp where sal between 1000 and 2000;

between and是闭区间。

where子句就是, select * from table where [true | false] , true 则显示,false则跳过。

4.2 查询10 20 号部门的员工信息

SQL> select * from emp where deptno in (10, 20, null);
等价于
SQL> select * from emp where deptno = 10 or deptno = 20 or deptno is null;

查询不在10 20 号部门的员工信息

SQL> select * from emp where deptno not in (10, 20, null);
等价于
SQL> select * from emp where deptno != 10 or deptno != 20 or deptno is not null;   这里结果永远为false

所以 where colname not in (...) 不能与null 连用

 

5. 模糊查询

like:

  %代表0个或多个任意字符

  _代表一个字符

5.1 查询名字以S开头的员工信息 

SQL> select * from emp where ename like ‘S%‘;

5.2 查询名字含有4个字母的员工信息

SQL>    select * from emp where ename like ‘____‘;

5.3 查询名字含有下划线的员工信息

SQL>    select * from emp where ename like ‘%\_%‘ escape  ‘\‘;

5.4 查询薪水大于1000,并且名字含有M的员工信息

SQL> select * from emp where sal > 1000 and ename like ‘%M%‘;

 where condition1 and condition2

condition会按序检查,如果一个condition已经为假,就不会检查剩下的,可以优化性能。

 

6. 排序

6.1 按照薪水排列

SQL> select * from emp order by sal desc;
SQL> select * from emp order by sal asc;

6.2 order by [ 列名 | 表达式 | 别名 | 序号 ]

SQL> select sal*12 from emp order by sal*12;
SQL> select sal*12 "年薪" from emp order by 年薪;
SQL> select ename ,sal*12 "年薪" from emp order by 2;

6.3 按照部门从小到大排序,如果部门号一样,按照薪水从小到大排序

SQL> select * from emp order by deptno asc, sal asc;

 6.4 按照奖金从大到小排序 --- 排序遇null

SQL> select * from emp order by comm desc nulls last;

 

7. 多行处理

1) 多行函数就是将多行数据做参数给一个函数。

2) 分组数据 group by

select ..
from ..
[ where ..
group by ..
order by ...]
所有检索的结果必须在分组的结果之上,先分组,再检索
--right
select a, b, c
from table
group by a, b, c, d

--err
select a, b, c
from table
group by a, c, d

3) 分组过滤 having -- 先分组再过滤

        where  -- 先过滤再分组

    同样情况下,先过滤再分组更好

7.1 求最该工资,最低工资,平均工资,所有工资

SQL> select max(sal), min(sal), avg(sal), sum(sal) from emp;

7.2 组函数自动滤空

SQL> select count(comm), count(empno) from emp;

滤空修正

SQL> select count(nvl(comm, 0)), count(empno) from emp;

7.3 求员工表中各个部门的平均工资 -- group by

SQL> select deptno, avg(sal) from emp group by deptno;

 7.4 求每个部门的每个工种的平均工资

SQL> select deptno, job, avg(sal) from emp group by deptno, job order by deptno;

7.5 求平均工资大于2000的部门

SQL> select deptno, avg(sal) from emp group by deptno having avg(sal) >= 2000;

 7.6 求10号部门的平均工资——先过滤再分组好

SQL> select deptno, avg(sal) from emp where deptno=10 group by deptno;

 

8.多表查询

8.1 生成笛卡尔集

SQL> select * from emp, dept;

笛卡尔集中有错误的项,原因是没有等值连接条件

SQL> select * from emp e, dept d where e.deptno = d.deptno;

8.1 查询员工信息,显示,员工姓名,部门名称

SQL> select e.ename, d.dname from emp e, dept d where e.deptno=d.deptno;

8.2 查询员工信息,显示,员工姓名,薪水级别

SQL> select e.ename, s.grade from emp e, salgrade s where e.sal<=s.hisal and e.sal>=losal;

8.3 按照部门统计员工人数:部门号,部门名称,各部门人数

SQL> select d.deptno, d.dname, count(e.ename) from emp e, dept d where e.deptno(+)=d.deptno group by d.dname, d.deptno;

因为dept 中有40号部门,但是emp中没有40号部门的员工,所以

e.deptno = d.deptno (40) 永远不成立,要让他成立,就要修改 e.deptno,所以 e.deptno(+)

sql 练习1

标签:数据   运算   时间   原因   rollback   ack   last   ike   ash   

原文地址:https://www.cnblogs.com/yangxinrui/p/12326576.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!