sql查询(慕课网听课笔记)

select * from table_name where condition

DISTINCT用于去除重复的行。

select distinct ename from emp;

分组函数中的使用:

select count(distinct deptno) from emp;

 

select * from table_name where condition

设置表头为自己习惯看的形式
col username heading 用户名;

col column_name format dataformat(字符类型只能设置长度)
col username format a10;(a表示字符类型,后面跟位数)
col salary format 9999.9;(数值类型用一个9来表示数字)
col salary format $9999.9;(数据前方就多了一个美元符号)

column column_name clear;清除之前设置的格式
col username clear;
col salary clear;

查询表中的所有字段以及制定字段
查询表中所有字段:
select * from emp;

查询制定的字段
select username,salary from users;

给字段设置别名(这里和上面col的区别是这里查出来的时候显示这样的标题头文字)
select column_name as new_name from table_name
select id as 编号,username as 用户名,salary 工资 from users
去重:
select distinct username as 用户名 from users;

运算符和表达式
算术运算符(+-*/)
比较运算符用在where语句中(>,>=,<,<=,=,<>)
逻辑运算符(and,or,not)

在select中使用运算符
算术运算符:
只在查询结果中体现(),要真的修改表的数据需要使用update字段
select id,salary+200 from emp;
使用比较运算符(在where中使用)
select ename from emp where sal>2000;(找到工资大于2000的员工的姓名)
使用逻辑运算符
select ename from emp where sal>2000 and sal<>5000; 让这条表达式同时为真的数据才过滤数来

带条件的查询,在查询语句中加上where
单一条件查询:select sal from emp where ename='KING';
              select ename,sal from emp where empno='7782';
多条件查询:select * from emp where ename='KING' or sal<'2000'

运算符优先级:not>and>or
比较运算符优先级高于逻辑运算符

可以使用not 运算符
select * from emp where not(ename='KING');

模糊查询
(只知道部分内容是什么,不知道全部)
通配符的使用(_:只能代表一个字符,%:代表0到多个字符)

select * from emp where username like 'K%'(开头字符为K)
select * from emp where username like '_K%'(第二个字符为K)
select * from emp where username like '%K%'(含有K的字符)

范围查询
between……and
select * from emp where sal between 100 and 1000;
是一个闭合区间,两边取等于号
IN/NOT IN
select * from users where username in('aaa','bbb');  或运算符

排序:
order by
select * from users order by id  desc(降序)/asc(升序)
select * from users order by id desc ,sal asc;
当前面的字段相等的时候,排在后面的字段才起作用,前面字段相等了,sal才升序排列

case...when...then...else.. 语句
select ename,case ename when 'KING' then '老板'
      when 'ALLEN' then '经理' else '普通员工'
可以多个when...then...结合
加个标题end as 职位
要记得from 表一定要写,不会写入表里,而是显示出来

case when 另一种形式,更灵活
case when column_name = value1 then result1,...else[resule]end

host cls :清屏

高级查询
分组查询(求部门的平均工资统计数据)
多表查询(当我需要查询员工信息和员工对应的部门信息的时候)
子查询(一条查询语句可以嵌套另外一个查询语句)
综合实例

分组查询:
分组函数的概念、使用、group by子句数据分组、having子句过滤分组结果集
group by 子句的增强,sqlplus报表功能
分组函数作用于一组数据,并对一组数据返回一个值
avg:平均值
sum:求和
min:最小值
max:最大值
count:求个数
wm_concat:行转列:select deptno,wm_concat(ename) from emp group by deptno;
这个语句的功能是把同一个部门的人名都列到了同一行,
设置行长度?
set linesize 200;
分组函数和空值

select sum(sal)/count(*) 一,sum(sal)/count(sal) 二,avg(sal) 三 from emp;
select sum(comm)/count(*) 一,sum(comm)/count(comm) 二,avg(comm) 三 from emp;

分组函数会自动忽略空值,只有4个人有奖金,所以count(comm)为4

在分组函数中使用nvl函数忽略空值
nvl(comm,0):如果第一个参数的值为空,则返回第二个参数,如果第一个参数的值不为空,则返回第一个参数
以后究竟用不用统计非空的值需要根据具体业务需求

group by 子句
求每个部门的平均工资
select deptno,avg(sal) from emp group by deptno;

select a,b,c,组函数(x)group by a,b,c;
所有不包含在组函数的列一定要包含在group by语句中;
包含在组函数的列不一定写在group by 语句中;
group by可以包含多个列
先按照第一个列分组,如果第一个列相同,再按照第二个列分组
ora-00937:非法使用分组函数

过滤分组:分组函数也叫组函数,也叫多行函数
不能在where使用组函数,可以在having 使用组函数

where语句应该放在from的后面,在没有分组函数的情况下,尽量使用where
因为having先分组,在过滤
where是先过滤,再分组,使得分组记录数大大降低,提高效率

在分组查询中使用order by 进行排序

/表示执行上一条语句
 
可以按照 列、表达式(可以给表达式起个别名)、序号(序号不能大于表达式的数目)、
默认升序排列

---a命令 append 追加上一个语句,a命令后的空格要一个或一个以上,不然会直接黏上去的

分组函数的嵌套,部门平均工资的最大值


group by 语句的增强:用在报表中十分有用
在最后增加一个group by rollup(a,b)=group by a,b +group by a+group by null

select deptno,job,sum(sal)
from emp
group by deptno,job;
+
select deptno,sum(sal)
from emp
group by deptno;
+
select sum(sal)
from emp;
=
select deptno,job,sum(sal)
from emp
group by rollup(deptno,job);

break on deptno skip 2:相同的部门号只显示一次,不同的部门号之间差一行

报表还没看:


多表查询:
同时查询员工表和部门表
笛卡尔集:用乘号表示两个集合的笛卡尔集
笛卡尔集列数=两个表列数相加
行数=每张表的行数想乘

笛卡尔集里的每条记录不是都是对的
emp.deptno=dept.deptno   多表查询的连接条件,这样可以避免笛卡尔全集
在where中写链接条件,链接条件至少有n-1个,n为表的个数

多表查询的时候要给表起一个别名


等值链接:where中的是等号语句
不等值链接:链接条件不是等号 between   and  小值在前,大值在后

自连接:查询员工姓名和员工老板的姓名,假设有两张表,其实是一张表,看做乘两个表

外链接:部门号、部门名称、人数(存在40号的部门,不存在40号部门的员工)这时候使用等值记录是不可以的
        通过外链接,不成立的结果也可以包含在结果中,
        左外链接:当链接条件不成立时,等号左边的结果应该返回结果中,在等号的右边+()
        右外链接:当链接条件不成立是,等号右边的结果返回结果中,在等号左边写+()

自连接存在的问题解决办法:
不适合操作大表,相当于一个表的平方
解决办法:
层次查询,是一个单表查询,才不会产生笛卡尔集,某些情况下可以取代自连接
树有level,
connect by  上一层的员工号=这一层的老板号,要给出遍历的节点
satrt with



















posted @ 2017-03-06 19:28  孜然风味  阅读(255)  评论(0编辑  收藏  举报