MySQL单表多表查询,SQL优化,三表连接,范式与视图(二)

接上篇 MySQL介绍、数据库、表等基本操作,表约束表关系 (一)

一、单表查询

【注意:能具体写就不要用*查询,速度慢,影响用户体验】

1、查询所有数据
select * from student;

2、查询部分字段
select s_name from student;

3、取别名(临时)
select s.s_name from student as s;
select s.s_name as sn from student as s;

4、模糊查询
select * from student where s_name like 'x%';	# x开头
select s_name from student where s_name like '%O%'; # beidou、moran(中间有O的)

5、指定条件查询
select * from student where age > 18;
select * from student where age > 18 and sex = '男';

二、多表查询

1、内连接

1、inner join
select * from department inner join student;
select * from department, student;
select * from department cross join student;
select * from department join student;

2、内连接的条件查询
select * from department inner join student on department.d_id = student.dept_id;
加别名:
select * from department as d inner join student as s on d.d_id = s.depr_id;

3、字段有选择的查询
select d.d_id,d_names,s.s_name from department as d inner join student as s on d.d_id = s.dept_id;

2、外连接

1、左连接(小表放左边做主表 left join)
select d.d_id,d.d_name,s.s_id,s.s_name from department as d left join student as s on d.d_id=s.dept_id;

2、右连接(小表放右边放主表   right  join)
select  d.d_id,d.d_name,s.s_id,s.s_name  from  department  as  d  right  join  student  as  s  on  d.d_id=s.dept_id;

3、全连接(去重——UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行)
select  d.d_id,d.d_name,s.s_id,s.s_name  from  department  as  d  left  join  student  as  s  on  d.d_id=s.dept_id union select  d.d_id,d.d_name,s.s_id,s.s_name  from  department  as  d  right  join  student  as  s  on  d.d_id=s.dept_id;

3、子表查询

# 子表当中最好不要用*
例1:select  *  from  department  left join ( 
    select  dept_id,s_name,s_age,s_sex  from  student right  join stu_detail on  student.s_id = stu_detail.stu_id) as e  on e.dept_id = department.d_id;

例2:select  *  from  department  where  d_id = (
    select  dept_id  from  students  inner  join  stu_detail  on  student.s_id = stu_detail.stu_id);

# 返回dept_id 传入 ( )
例3:select   *  from  students  where  dept_id  = (
    select  d_id  from  department  where  s_name = 'java');

4、排序 order by

asc:升序 (默认)	desc:降序 
1、select  *  from  mins  order  by  age  desc;
2、select  *  from  mins  order  by  age  asc;
3、select  *  from  mins  order  by  age  asc  limit  4;  #只要4行
4、select  *  from  mins  order  by  age  asc  limit  1, 4;  #从1开始

5、分组查询

1、select  d_id,d_name,count(*)  from  student  inner  join  department  on  student..dept_id  = department.d_id   group  by  d_name;

2、select  d_id,d_name,count(*)  from  student  inner  join  department  on  student..dept_id  = department.d_id   group  by  d_name  having  count(*) = 2;

6、处理空字典

select  s_name,ifnull(dept_id) from  student;

三、MySQL函数

abs、max、min、round、avg、sum

  select  min(age) from  student;

四、查询SQL优化

建议:
1.尽量避免整表扫描,如SELECT *
2.建立合适的索引
3.使用合适的存储引擎
4.在JOIN中,尽量用小表LEFT JOIN 大表(左连接)
5.除非十分必要,尽量不要使用ORDER BY,GROUP BY 和 DISTINCT(去重),尽量用索引来代替

添加索引:
alter  table  student  add  index(age);
去重:
select  distinct (name)  from  student;

五、三表连接

select  d.d_id,d.d_name,s.s_name,s.s_id,stu.s_age,stu.s_sex 
from department  as  d  
left  join student  as  s  
on  d.d_id = s.dept_id 
left  join  stu_detail  as  stu  
on  stu.stu_id = s.s_id;

六、范式与视图

1、范式

1、第一范式(1NF):符合1NF的关系中的每个属性都不可再分。1NF是所有关系型数据库的最基本要求

简单来说,就是不能出现多个表头

2、第二范式(2NF):2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖

简单来说,只能描述一个对象(主键),其它列名(副键)与对象之间相互完全依赖

3、第三范式(3NF):3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖

简单的说,所有的非主属性只在整个数据库里面出现一次,副键与副键之间,不能存在依赖关系

在这里插入图片描述

范式的作用是尽可能避免数据的冗余和插入/删除/更新的异常

2、事务

数据库事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。

简单来说:几个操作是绑定在一起的,要么都做完,要么一个都不做

3、视图

1、视图的作用

三范式让表查询变得复杂,对于常用的数据查询,反复写复杂的查询语句十分不方便,因此可以创建一个虚拟的表(不存数据),这个虚拟表的数据来源于数据库中存在的其他表,虚拟表的数据来源就在定义时给定

2、创建视图 view

create view stu_det as
select s.s_name, d.d_name, d.d_id from department as d left join student as s on s.dept_id = d.d_id;

3、查看视图

select * from stu_det;
insert into stu_det values ('sss', 1, 'c++');  # 会报错,因为它只能看不能用

4、删除视图

DROP VIEW view_name
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Taverry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值