--排序:
order by
当我们写了一个逻辑,这个逻辑已经产生了数据,但是这个数据展示出来的前后关系不是我们想要的,于是需要排序。
排序是放在最后去做的
select d.dname,count(e.ename)
from emp e right join dept d
on e.deptno=d.deptno
group by d.dname;
1、升序(asc) 默认,工作中,一般都不写asc
select d.dname,count(e.ename)
from emp e right join dept d
on e.deptno=d.deptno
group by d.dname
order by count(e.ename) asc;
2、降序(desc)
select d.dname,count(e.ename)
from emp e right join dept d
on e.deptno=d.deptno
group by d.dname
order by count(e.ename) desc;
3、别名
select d.dname,count(e.ename) total
from emp e right join dept d
on e.deptno=d.deptno
group by d.dname
order by total;
4、位置(工作中没人用,可以忘记)
select d.dname,count(e.ename) total
from emp e right join dept d
on e.deptno=d.deptno
group by d.dname
order by 2;
--***********************
5、多字段排序
先按照第一个规则排序,如果在第一个规则下还有相同数据,就接着按照第二个规则排序
如果在第二个规则下又还有相同,就继续按第三个排序
select * from emp order by job,deptno desc,sal,comm desc,ename,empno;
--**请问下面的排序数据展示的效果是否一致
select * from emp order by empno,ename,sal desc,deptno;
select * from emp order by empno;
--增删改:
insert into、update、delete
执行完后,一定要手动commit或者rollback
insert into--插入数据
语法:
insert into 表(字段) values (值);
insert into dept(deptno,dname,loc) values (50,'测试部','深圳');
【补充】
1、如果你要插入是是所有字段,那么可以不写(字段)部分,只写表就行
注意:工作中几乎不用这个
请学会复制整列
insert into dept values (60,'研发部','北京');
insert into emp
(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values
();
2、可以用别的表的数据进行插入,运维的人喜欢用或以后你做数据准备等可以用
insert into dept(deptno,dname,loc)
select empno,ename,job
from emp
where deptno=10;
3、面试时,喜欢问你,如果我要批量插入100w数据
datafactory
--****************************************面试时,最喜欢问更新
update
语法:
update 表
set 字段=新值[,字段=新值][,..=...]
where 条件
update dept
set dname='凤姐',loc='岗厦'
where length(deptno)=4;
【补充】
1、玩update时特别小心,我的同事和我的学生就因为误操作导致丢了工作
2、如何规避?
1、先写select,从而确定数据和条件
select * from dept where deptno=60;
2、改写成update
update dept where deptno=60;
3、最后写set
update dept set dname='运维部',loc = null where deptno=60;
delete:
新人特别容易理解错误:delete是删除表中的数据,并不是去删除表
语法:
delete from 表 where 条件
delete from dept where deptno not in (10,20,30,40);
【补充】
1、删除时,先查询确认条件后再改写
select * from dept where deptno not in (10,20,30,40);
delete from dept where deptno not in (10,20,30,40);
2、删除数据,除delete外,还可以用truncate(截断)
truncate table 表;
truncate table student;
3、面试时常问你,truncate和delete的区别?
delete可以带where条件,可以删除部分数据,属于DML语法,需要提交后才能生效,不会释放表空间,删除数据慢
truncate不能带where,只能全部删除数据,不属于DML语法,不需要提交,会释放表空间,删除数据快
4、请举例说明你用truncate的例子?
日志、记录、备份后常作
【注意】数据库中:
DQL;数据查询语言 select
DML:数据操纵语言 insert、update、delete
DDL:数据定义语言 create、alter、drop
例子:create table mt_user(
id number,
username varchar2(30) not null,
sex number(1),
birthday date,
email varchar2(30),
remarks varchar2(30),
did number(4)
);
--唯一
alter table mt_user
add constraint uk_email unique(email);
--主键
alter table mt_user
add constraint pk_id primary key(id);
--外键
alter table mt_user
add constraint fk_did foreign key(id)
references dept(deptno);
--注意这里是说参考哪个表的哪个字段,这个字段一定是这个表的主键
--约束
--1、not null 非空
--2、unique 唯一
--3、primary key 主键 pk=not null+unique 表都要设定主键,一般是第一个字段设主键,都xxid或id
--4、foreign key 外键
--1、要在牵线表中新建一个字段,类型要和参考表一致
--2、你参考的表的键必须是主键
--3、写规则语句,主要和唯一以主键的区别写法
--oracle中的时间函数
oracle的日期默认格式为:yyyy-mm-dd hh24:mi:ss
mysql的日期默认格式为:Y-m-d H:i;s
sysdate--取服务器的系统时间
select sysdate from dual;
--例子
select sysdate-hiredate from emp;
**********************************
to_char --把时间转成字符串
当我们要取一个完整时间的某个部分时,采用这个函数
--例子
select hiredate,
to_char(hiredate, 'yyyy') 年,
to_char(hiredate, 'mm') 月,
to_char(hiredate, 'dd') 日
from emp
--求3号入职的员工
select ename from emp where to_char(hiredate, 'dd')='03';
--求1981-02入职的员工
select ename from emp where to_char(hiredate, 'yyyy-mm')='1981-02';
to_date --把字符串转成时间 字符串要“长得像”日期
--界面中是个字符串,表的类型却是一个日期时使用
【例子】
insert into emp(empno,hiredate) values (9999,to_date('2019-02-15','yyyy-mm-dd'));
insert into emp(empno,hiredate) values (8888,to_date('2019/03/05','yyyy/mm/dd'));
insert into emp(empno,hiredate) values (7777,to_date('03/05/2019','mm/dd/yyyy'));
insert into emp(empno,hiredate) values (6666,to_date('03/05/2019','dd/mm/yyyy'));
insert into emp(empno,hiredate) values (5555,to_date('!!!!!!','dd/mm/yyyy'));--长得不像,毫无办法
【补充】
日期还有N多玩法,下来自己百度学习,当然你也可以先不管,你工作需要了,再查
因为你面试时,没有人问你日期如何处理(你又不是开发)
星期x、公历、农历、时区、window/linux转化、时间戳--1514511419