简单复习Mysql(上)

简单复习Mysql

emp表

+-------+--------+-----------+------+------------+---------+---------+--------+
| EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
+-------+--------+-----------+------+------------+---------+---------+--------+

dept表

+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+

salgrade表

+-------+-------+-------+
| GRADE | LOSAL | HISAL |
+-------+-------+-------+
|     1 |   700 |  1200 |
|     2 |  1201 |  1400 |
|     3 |  1401 |  2000 |
|     4 |  2001 |  3000 |
|     5 |  3001 |  9999 |
+-------+-------+-------+
-- 分组函数/聚合函数/多行处理函数
-- 会自动忽略null
count() 计数
sum() 求和
avg()平均值
max()最大值
min()最小值
-- 不可以用在 where 后面  因为 group by 是在where执行之后才执行
-- 注意:分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因。
-- 并且任何一个分组函数((count sum avg max min)都是在group by语句执行结束之后才会执行的。

select  	5
from  	 	1
where   	2
group by	3
having		4
order by	6



ifnull(可能为null的数据,被当作什么处理)
select ename,(sal+ifnull(comm,0))*12 year from emp;

group by 和 having

搭档关系~

group by :按照某个字段或者某些字段进行分组。
having :是对分组之后的数据进行再次过滤。

-- 记住一个规则:当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段。


案例:找出每个工作岗位的最高薪资。
select job,max(sal) from emp group by job;


案例:找出每个部门不同工作岗位的最高薪资。
select deptno,job,max(sal) from emp group by deptno,job;


找出每个部门的最高薪资,要求显示薪资大于2900的数据。
-- 这种方式不好 效率低
select max(sal),deptno from emp group by deptno having max(sal) > 2900; 
-- 这种好
select max(sal),deptno from emp where sal > 2900 group by deptno; 

找出每个部门的平均薪资,要求显示薪资大于2900的数据。
select avg(sal),deptno from emp group by deptno having avg(sal) > 2000;

统计岗位的数量 distinct去重再统计
select count(distinct job) from emp;

连接查询

内连接:
-- 这种写法结构清晰  后面可以继续写where过滤条件

等值连接  条件是等量关系
案例:查询每个员工的部门名称,要求显示员工名和部门名。
select e.ename,d.dname
from emp e
inner join dept d   -- inner可以省略
on e.deptno = d.deptno


非等值连接  条件是非等量关系
案例:找出每个员工的工资等级,要求显示员工名、工资、工资等级。
select e.ename,e.sal,s.grade
from emp e
join salgrade s
on e.sal between s.losal and s.hisal;


自连接:一张表看做两张表。自己连接自己。
案例:找出每个员工的上级领导,要求显示员工名和对应的领导名。
select a.ename '员工名',b.ename '领导名'
from emp a
join emp b
on a.mgr = b.empno;
外连接

什么是外连接,和内连接有什么区别?
内连接:
假设a和B表进行连接,使用内连接的话,凡是A表和s表能够匹配上的记录查询出来,这就是内连接。AB两张表没有主副之分,两张表是平等的。
外连接:
假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。

外连接的分类?
左外连接(左连接):表示左边的这张表是主表。

右外连接(右连接):表示右边的这张表是主表。

案例:找出每个员工的上级领导,要求显示员工名和对应的领导名。(所有员工必须查询出来)
select a.ename '员工名',b.ename '领导名'
from emp a
left (outer) join emp b  -- outer可以省略
on a.mgr = b.empno;

案例:找出哪个部门没有员工
select d.*
from dept d
left join emp e
on d.deptno = e.deptno
where e.empno is null;

三张表连接

案例:找出每一个员工的部门名称以及工资等级h
select e.ename,d.dname,s.grade,e1.ename '领导'
from emp e
join dept d
on e.deptno = d.deptno
join salgrade s
on e.sal between s.losal and s.hisal
left join emp e1
on e.mgr = e1.empno

子查询

嵌套select语句

-- where后面
案例:找出高于平均薪资的员工信息。
select ename,sal from emp where sal > (select avg(sal) from emp);

-- from后面
案例:找出每个部门平均薪水的薪资等级。
select t.*,s.grade from (select deptno,avg(sal) avgsal from emp group by deptno) t 
join salgrade s 
on avgsal between s.losal and s.hisal;


案例:找出每个部门平均的薪水等级。
-- 活学活用
select e.deptno,avg(s.grade)
from emp e
join salgrade s
on e.sal between s.losal and s.hisal
group by e.deptno;

-- 笨比写法:
select d.dname,avg(t.grade) from 
(select e.ename,e.sal,e.deptno,s.grade 
from emp e
join salgrade s
on e.sal between s.losal and hisal) t
join dept d
on t.deptno = d.deptno
group by t.deptno;

-- select后面
案例:找出员工以及对应的部门
select e.ename,e.deptno,(select d.dname from dept d where e.deptno = d.deptno) dname
from emp e;

union

两张不相干的表数据 拼接在一起显示

-- 将结果合并起来  但是必须两个结果列数一致  表头是第一个查询的关键字 建议改名
select ename '结果' from emp 
union 
select dname from dept;  

+------------+
| 结果       |
+------------+
| SMITH      |
| ALLEN      |
| WARD       |
| JONES      |
| MARTIN     |
| BLAKE      |
| CLARK      |
| SCOTT      |
| KING       |
| TURNER     |
| ADAMS      |
| JAMES      |
| FORD       |
| MILLER     |
| ACCOUNTING |
| RESEARCH   |
| SALES      |
| OPERATIONS |
+------------+

limit

mysql特有的 取结果集的部分数据

语法: limit startIndex,length
		limit(起始位置,取几个)
		

案例:找出工资排名在第4到第9名的员工?
mysql> select ename,sal from emp order by sal limit 3,6;
+--------+---------+
| ename  | sal     |
+--------+---------+
| WARD   | 1250.00 |
| MARTIN | 1250.00 |
| MILLER | 1300.00 |
| TURNER | 1500.00 |
| ALLEN  | 1600.00 |
| CLARK  | 2450.00 |
+--------+---------+


通用的标准分页sql
每页3条记录
第一页 0,3
第二页 3,3
第三页 6,3
...

每页pageSize 第pageNum页
((pageNum-1)*pageSize,pageSize)

建表

create table 表名(
	字段,类型,约束,
    ...
);

表的复制语法:将查询结果当做表创建出来。
create table 表名 as select语句;

将查询结果插入到一张表中?
insert into 表名 select * from dept;

删表

删除所有记录?
delete from dept;

怎么删除大表中的数据?(重点)
truncate table emp ;

约束

在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。
常见的约束有哪些呢?

非空约束(not nul1):约束的字段不能为NULL
唯一约束(unique):约束的字段不能重复
主键约束(primary key):约束的字段既不能为NULL,也不能重复
外键约束(foreign key): …
检查约束(check):注意oracle数据库有check约束,但是mysq1没有,目前mysq1不支持该约束。

存储引擎

show ENGINES

MyISAM这种存储引擎不支持事务。
MyISAM是mysql最常用的存储引擎,但是这种引擎不是默认的。MyISAM采用三个文件组织一张表:
xxx.frm (存储格式的文件)
xxx.MYD (存储表中数据的文件)
xxx.MYI (存储表中索引的文件)
优点:可被压缩,节省存储空间。并且可以转换为只读表,提高检索效率。缺点:不支持事务。

优点:支持事务、行级锁、外键等。这种存储引擎数据的安全得到保障。
表的结构存储在xxx.frm文件中
数据存储在tablespace这样的表空间中(逻辑概念),无法被压缩,无法转换成只读。这种InnoDB存储引擎在MysQr数据库崩溃之后提供自动恢复机制。
InnoDB支持级联删除和级联更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值