sql 练习1
Posted yangxinrui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 练习1相关的知识,希望对你有一定的参考价值。
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的主要内容,如果未能解决你的问题,请参考以下文章
Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)(代码片段