表操作(day03)
回顾:
1.单行函数
2.表连接
oracle中的表连接
内连接
等值连接
select e.id,e.first_name,d.name
from s_emp e,s_dept d
where e.dept_id = d.id;
select d.id,d.name dname,r.name rname
from s_dept d,s_region r
where d.region_id = r.id;
select e.id,e.first_name,r.name
from s_emp e,s_dept d,s_region r
where e.dept_id=d.id and d.region_id = r.id;
非等值连接
select e.id,e.first_name,e.salary,g.grade
from s_emp e,salgrade g
where e.salary between g.losal and g.hisal;
自连接
select distinct m.id,m.first_name
from s_emp e,s_emp m
where e.manager_id = m.id;
外连接
等值连接
select e.id,e.first_name,d.name
from s_emp e,s_dept d
where e.dept_id = d.id(+);
select d.id,d.name dname,r.name rname
from s_dept d,s_region r
where d.region_id = r.id(+);
非等值连接
select e.id,e.first_name,e.salary,g.grade
from s_emp e,salgrade g
where e.salary between g.losal(+) and g.hisal(+);
自连接
select m.id,m.first_name
from s_emp e,s_emp m
where e.manager_id(+) = m.id
and e.id is null;
  select d.id,d.name
      from s_emp e,s_dept d
          where e.dept_id(+) = d.id
             and e.id is null;
1.sql99标准中的表连接
内连接:
select  字段列表
from 表1 [inner] join 表2
on 关联条件;
 select e.id,e.first_name,d.name
    from s_emp e inner join s_dept d
       on e.dept_id = d.id;
  三表连接:
  select 字段列表
    from 表1 join 表2 on 关联条件1
                   join 表3 on 关联条件2;
  select e.first_name,d.name,r.name
     from s_emp e join s_dept d on e.dept_id = d.id
          join s_region r on d.region_id = r.id;
外连接:
左外连接:内连接的结果集 + 左表匹配不上的数据
select  字段列表
from 左表 left [outer] join 右表
on 关联条件;
select e.id,e.first_name,d.name
from s_emp e left join s_dept d
on e.dept_id = d.id;
右外连接:内连接的结果集 + 右表匹配不上的数据
select  字段列表
from 左表 right [outer] join 右表
on 关联条件;
select e.id,e.first_name,d.name
from s_emp e right join s_dept d
on e.dept_id = d.id;
全外连接:内连接的结果集 + 两表匹配不上的数据
select  字段列表
from 左表 full [outer] join 右表
on 关联条件;
select e.id,e.first_name,d.name
from s_emp e full join s_dept d
on e.dept_id = d.id;
     select d.id,d.name
       from s_emp e right join s_dept d
          on e.dept_id = d.id
             where e.id is null;
2.集合运算(合并结果集)
union:     两个结果集取并集  并排重、排序
union all:两个结果集直接取并集
select id from s_emp union
select id from s_dept;
select id from s_emp union all
select id from s_dept;
intersect: 取两个结果集的交集
select id from s_emp intersect
select id from s_dept;
minus: 第一个结果集 - 第二个结果集
select id from s_emp minus
select id  from s_dept;
-- 两个结果集的字段列表的数量和数据类型必须匹配
select id,first_name from s_emp minus
select id,name from s_dept;
  select id,first_name from s_emp union
  select null,name from s_dept;
- 组函数和分组
3.1 组函数常用的组函数
count(par|) : 统计一组数据的行数
参数可以是任何类型 还可以是
-- 统计工资高于1500的员工数
select count(*) from s_emp where salary>1500;
max(par) : 统计一组数据中的最大值
min(par):统计一组数据中的最小值
参数可以是数字、字符串、日期类型
-- 列出最早和最晚入职的员工
select max(to_char(start_date,'yyyy-mm-dd')),
min(to_char(start_date,'yyyy-mm-dd'))
from s_emp;
sum(par) : 统计一组数据的和
avg(par) : 统计一组数据的平均值
参数是数字类型
-- 列出销售部的总工资和平均工资
select sum(salary),avg(salary)
from s_emp e,s_dept d
where e.dept_id = d.id and d.name='Sales';组函数对null的处理: 忽略
select count(commission_pct) from s_emp;组函数 可以排重
select sum(salary),sum(distinct salary) from s_emp;
select count(salary),count(distinct salary) from s_emp;
 
3.2 分组
3.2.1 语法
group by 分组标准
    .....
        where ....
           group by ...
             ...
               select
                 order by
  3.2.2 分组统计每个部门的人数
      select dept_id,count(*) cnt
         from s_emp
            group by dept_id;
      /* 分组语句中列出的字段必须是分组标准
          或者是组函数的参数*/
      select id,dept_id,count(*) cnt
         from s_emp
            group by dept_id;  -- 错误
  3.2.2 多列分组
     分组统计每个部门的人数,显式部门的名称和人数
     select e.dept_id,d.name,count(e.id) cnt
        from s_emp e join s_dept d on e.dept_id = d.id
            group by e.dept_id,d.name;
     分组统计每个部门的人数,列出人数超过2个的部门
     select dept_id,count(*) cnt
         from s_emp
            -- 错误:where子句中不能使用组函数
            -- where count(*)>2
              group by dept_id;
 3.2.3 having子句
    分组后,根据条件筛选出符合条件的组
    select dept_id,count(*) cnt
        from s_emp
           where 1=1
             group by dept_id
                having count(*)>2
                   order by cnt;
    -- 语法顺序
    select 字段列表
        from 表名
           where 条件   -- 从表中根据条件筛选符合条件的行
             group by 分组标准  -- 根据分组标准分成多个组
                having 条件  -- 从分组结果中根据条件筛选符合条件的组
                   order by 排序标准 排序方式; 
     -- 执行顺序
     from
       where
          group by
            having
              select
                 order by
-- 练习:列出平均工资大于1000 的部门的信息
select  dept_id,avg(salary) avgsal
from s_emp
group by dept_id
having avg(salary)>1000;
select d.id,d.name,avg(e.salary) avgsal
    from s_emp e,s_dept d
        where e.dept_id = d.id
            group by d.id,d.name
                having avg(e.salary)>1000
                    order by avgsal;
- 子查询
子查询指的是把一条select语句嵌入到另一条sql语句中
执行时,先执行嵌入的子查询,然后再执行外层的sql语句
4.1 where子句- 单行单列的子查询
-- 列出工资比'Ben'高的员工的信息
a. 列出'Ben'的工资
select salary from s_emp where first_name='Ben';
-- 1100
b. 列出工资高于'Ben'的员工的信息
select id,first_name,salary from s_emp
where salary>1100;
c. 合并
select id,first_name,salary from s_emp
where salary>(
select salary from s_emp where first_name='Ben'
); - 多行单列的结果集
子查询的结果集为多值时,不能使用比较运算符
需要使用处理多值的运算值,比如in、not in、any、all等
(any、all要和比较运算符配合使用:>any、<all)
-- 使用子查询列出所有的领导的信息
a) 列出领导的编号
select distinct manager_id from s_emp;
-- null,1,2,3,6,7,8,9,10
b) 根据编号,列出领导的信息
select id,first_name,title from s_emp
where id in(null,1,2,3,6,7,8,9,10);
c) 合并
select id,first_name,title from s_emp
where id in(
select distinct manager_id from s_emp);
-- 使用子查询列出普通员工的信息
select id,first_name,title from s_emp
where id not in(
select distinct manager_id from s_emp
where manager_id is not null); - 使用exists
-- 列出有员工的部门的信息
select * from s_dept d where exists(
select * from s_emp e where e.dept_id=d.id
); 
 - 单行单列的子查询
 
4.2 having子句
-- 列出平均工资高于公司平均工资的部门的信息
select dept_id,avg(salary) from s_emp
group by dept_id
having avg(salary)>(
select avg(salary) from s_emp
);
4.3 from子句
一个select语句产生的结果集,可以看成是一个内视图或者匿名视图,只能在当前语句使用
select id,name,yearsal from
(select id,first_name name,12*salary+1000 yearsal                        from s_emp) e
where yearsal>15000;
--  列出工资高于本部门平均工资的员工的信息
 a) 列出每个部门的编号及其平均工资
   select dept_id,avg(salary) avgsal from s_emp
        group by dept_id;
   -- 相当于包含dept_id和avgsal两个字段的一张表  s
 b) 使用表连接(s_emp、s) 实现功能
    s_emp: id,first_name,salary
    s: avgsal
    关联字段:  s_emp.dept_id和s.dept_id
    select e.id,e.first_name,e.salary,s.avgsal
      from s_emp e,(
          select dept_id,avg(salary) avgsal
             from s_emp
               group by dept_id) s
           where e.dept_id = s.dept_id
              and e.salary > s.avgsal;
4.4 select之后
外连接的另一种实现方式,并且更为灵活
-- 列出员工及其所在部门的信息
select id,first_name,salary,(
select name from s_dept d where e.dept_id=d.id
)  dname
from s_emp e;
-- 练习:列出所有和'Mark'在同一部门的员工的信息
select id,first_name,dept_id from s_emp
    where dept_id=
(select dept_id from s_emp where first_name='Mark');
对象名_姓名缩写_座位号
xxxx_zsm_00
5.表的操作
5.1 表的创建和删除
5.1.1 标识符的命名
1) 由a-z、A-Z、0-9、_、$、#构成
2)必须用字母开头
3) 不能和关键字重名
4) 不能和其他的数据库对象重名
5) 1-30位
5.1.2 创建表
-- 语法
create table 表名(
字段名 数据类型,
....
字段名 数据类型
);
create table testid_zsm_00(
id number,
name varchar2(20)
);
5.1.3 删除表
drop table 表名;
drop table testid_zsm_00;
5.2 数据操作语句(DML)
-- 创建一个测试表
三个字段:
编号   数字
名字   字符串
入职日期  日期
create table emp_zsm_00(
id number(7),
name varchar2(20),
start_date date
);
5.2.1 插入语句(insert)  -- 一次一整行
  1) 语法
   insert into 表名[(字段列表)] values(值列表);
   字段列表的数量和顺序和值列表的数量和顺序必须一致
  2) 不省略字段列表
   -- 写入全部字段
   insert into emp_zsm_00(id,name,start_date)
         values(1,'test1','13-OCT-17');
   commit;
   -- 写入部分字段 ( 没有给值的字段必须允许为null )
   insert into emp_zsm_00(id,name)
         values(2,'test2');
   commit;
 3) 省略字段列表(相当于给出了全部字段,并且顺序和表结构一致)
     -- 给全部字段提供值
     insert into emp_zsm_00 values(3,'test3',sysdate);
     commit;
      insert into emp_zsm_00 values(4,'test4',
           to_date('2017-10-13','yyyy-mm-dd'));
     commit;
     -- 给部分字段提供值
      insert into emp_zsm_00 values(5,'test5',null);
     commit;
5.2.2 更新语句(update)
1) 语法
update 表名 set 字段 = 新值[,字段 = 新值,...]
[where 条件];
2) -- 更新 把入职日期改为'2017-01-20'
update emp_zsm_00 set start_date='12-JAN-17';
  3) -- 把id=1的名字改为'Ben',入职日期改为当前日期
      update emp_zsm_00 set name='Ben',
          start_date=sysdate where id=1;
      commit;
5.2.3 删除语句(delete) -- 整行删除
  1) 语法
    delete [from] 表名 [where子句];
  2) 删除表中全部数据
     delete from emp_zsm_00;
     rollback; -- 撤销没有提交的操作
  3) 带where子句的删除
     delete from emp_zsm_00 where name like 'test%';
     commit;
5.3 事务控制语句 (TCL)
select: 和事务无关
ddl: 隐式提交的事务
dml: 默认需要显式提交
5.3.1 事务控制语句的含义
  commit;     确认事务(提交所有未提交的操作)
  savepoint 保存点;  定义保存点
  rollback;   回滚事务(撤销所有未提交的操作)
  rollback to 保存点; 回顾到保存点的位置
5.3.2 事务的四大特性(ACID)
  1) 原子性:事务中的语句是一个不可分割的整体
    转账:
    账户表:account
    字段:id   balance
    A账户---> B账户  2000
    update account set balance = balance - 2000
              where  id='A';
    a
    update account set balance = balance + 2000
              where  id='B';
    b
    if a&&b
      commit;
    else
       rollback;
    要么全部成功,要么全部失败
 2)一致性
   事务执行的结果必须是使数据库从一种一致性状态变为另一种一致性状态
 3) 隔离性
    一个事务对数据的改变,在提交之前,对于其他的事务是不可见的。
 4)  持久性
   事务一旦提交,对数据的改变就是永久的
5.3.3 部分成功 部分失败
-- 删除表中全部数据 属于ddl语句,不能撤销
truncate table emp_zsm_00;
   insert into emp_zsm_00(id,name) values(1,'test1');
   savepoint a;
   insert into emp_zsm_00(id,name) values(2,'test2');
   savepoint b;
   insert into emp_zsm_00(id,name) values(3,'test3');
   savepoint c;
   insert into emp_zsm_00(id,name) values(4,'test4');
   select * from emp_zsm_00;
   rollback to b;
   commit;
   select * from emp_zsm_00;
练习:
1.使用select语句建表:
drop table emp_zsm_00;
create table emp_zsm_00 as select * from s_emp;
2.给所有'Carmen'的下属涨工资
- 查询'Carmen'的编号
 - 根据'Carmen'的编号 查询其下属的编号
 - 根据员工编号 改工资
3.删除和'Ben'同部门的员工 
表操作(day03)的更多相关文章
- Mysql常用表操作 | 单表查询
		
160905 常用表操作 1. mysql -u root -p 回车 输入密码 2. 显示数据库列表 show databases 3. 进入某数据库 use database data ...
 - Sql Server系列:数据表操作
		
表是用来存储数据和操作数据的逻辑结构,用来组织和存储数据,关系数据库中的所有数据都表现为表的形式,数据表由行和列组成.SQL Server中的数据表分为临时表和永久表,临时表存储在tempdb系统数据 ...
 - 学习MySQL之单表操作(二)
		
##单表操作 ##创建表 CREATE TABLE t_employee( empno ), ename ), job ), MGR ), Hiredate DATE DEFAULT '0000-00 ...
 - python——Django(ORM连表操作)
		
千呼万唤始出来~~~当当当,终于系统讲了django的ORM操作啦!!!这里记录的是django操作数据库表一对多.多对多的表创建及操作.对于操作,我们只记录连表相关的内容,介绍增加数据和查找数据,因 ...
 - mysql数据表操作&库操作
		
首先登陆mysql:mysql -uroot -proot -P3306 -h127.0.0.1 查看所有的库:show databases; 进入一个库:use database; 显示所在的库:s ...
 - SQL server基础知识(表操作、数据约束、多表链接查询)
		
SQL server基础知识 一.基础知识 (1).存储结构:数据库->表->数据 (2).管理数据库 增加:create database 数据库名称 删除:drop database ...
 - Python之Django--ORM连表操作
		
一对多 class UserType(models.Model): caption = models.CharField(max_length=32) class UserInfo(models.Mo ...
 - spark使用Hive表操作
		
spark Hive表操作 之前很长一段时间是通过hiveServer操作Hive表的,一旦hiveServer宕掉就无法进行操作. 比如说一个修改表分区的操作 一.使用HiveServer的方式 v ...
 - [SAP ABAP开发技术总结]内表操作
		
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
 
随机推荐
- 猫猫学iOS之UILabel设置圆角不成功所做调控更改
			
原创文章.欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 如图问题 如图是我要做的效果 然而当我写好代码后,设置号label的layer圆角后 ...
 - ADS-B显示终端6.8
			
更新日志; 本次更新依旧主要注重是BUG修正. 1 改动鼠标移动时地图重绘的BUG 鼠标移动时地图即发生重绘,占用了CPU资源,修正后仅仅当鼠标点击选中对象或拖动对象时地图才会发生重绘.极大程度上节省 ...
 - 【特征匹配】SIFT原理之KD树+BBF算法解析
			
转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/47606159 继上一篇中已经介绍了SIFT原理与C源代码剖析,最后得到了一系列 ...
 - SpringMVC高速实现文件上传功能
			
SpringMVC为我们封装了上传文件的功能,如今就试用一下 须要的jar包 我用的是Maven项目,就不须要到处下载Jar包了 SpringMVC的搭建 首先要在applicationContext ...
 - 循环遍历Java字符串字符的规范方法——类似python for ch in string
			
比如我将string作为CNN 文本处理输入: float [] input = new float[maxLength]; // 1 sentence by maxLenWords // int[] ...
 - Python入门  老司机带你上路
			
Phthon安装 https://www.python.org/download/releases/2.7.5/ 安装结束还没完,我们还差最后一步:设置环境变量.这是什么东西我暂时先不解释,大家照着做 ...
 - SpringMVC中url映射到Controller
			
SpringMVC也是一种基于请求驱动的WEB框架,并且使用了前端控制器的设计模式.前端控制器就是DispatcherServlet控制器,只要满足web.xml文件中的[url-pattern]的规 ...
 - PCB Genesis加邮票孔(弧形连接位宽度校正)实现算法
			
采用弧形作为加接位,当两边距离较远时,会造成连接位变窄,由于之前算法是基于连接位间距做为半径画弧, 必然存在这个缺陷,这边做少许的改进解决此问题. 现将几个种增加孤形连接位的图形对比如下: 一.两边外 ...
 - PCB 线路板人生
			
由此开端,增加PCB人生分类栏,后续在此分享PCB 非工作方面所思所想,由于文笔不好,请指正.
 - Docker 探索安装WordPress+Mysql8.0
			
拉取MYSQL,注意默认是8.0版本,连接加密方式有变化 docker pull mysql 运行MYSQL docker run --name wordpress-mysql -p 3306:330 ...