mysql三大范式
1. 第一范式 原子性 字段不可在分割
2. 第二范式 唯一性 字段必须依赖于主键
3. 第三范式 冗余性 避免数据量过大
连表联查
union:多个结果集进行合并(纵)
格式:select 字段 from 表名 union 表名;
注意:查询时多张表的字段数量保持一致
直接使用union时,相同的数据只显示一行
使用union all时,相同的数据都会显示
查询结果的列名以第一次sql语句的结果列为准
join
left join:左表为准 匹配右表的数据,左表中的数据匹配不到右表的数据就显示null,右边的数据和左表不匹配就不会显示
格式:select 字段 from 表名 left join 表名 on 连接条件;
right join:右表为准 匹配左表的数据,右表中的数据匹配不到左表的数据就显示null,右边的数据和左表不匹配就不会显示
格式:select 字段 from 表名 right join 表名 on 连接条件;
inner join:两张表的交集
格式:select 字段 from 表名 inner join 表名 on 连接条件;
逻辑判断:case when 判断条件 then 值 [when 判断条件 then]* [else 值] end
从其他表中加载数据
格式1:create table 表名 as 查询语句
例如:create table student1 as select * from student;
格式2:insert into 表名 查询语句
例如:insert into test select * from score;
视图:是一张虚拟表,数据都是存储在基础表中
创建视图
格式:create view 表名 as 查询语句;
例如:create view tmp as select * from student_info where age=25;
查看视图结构:
格式:desc 表名
例如:desc tmp;
格式:show create view/table 表名;
例如:show create table tmp;
删除视图:
格式:drop view 表名
例如:drop view tmp;
视图和基础表的关系是一对一:在视图中进行增删改查时,会在基础表上发生改变
视图和基础表的关系是一对多:视图中不能进行insert和delete
from--where--group by--having--select--order by
from:需要从哪个数据表检索数据
where:过滤表中数据的条件
group by:如何将上面过滤出的数据分组
having:对上面已经分组的数据进行过滤的条件
select:查看结果集中的哪个列,或列的计算结果
order by :按照什么样的顺序来查看返回的数据
索引:主键默认拥有一个索引
索引不是越多越好,因为索引也需要存储空间去存放,索引越多占的资源就越多
添加索引:
格式:alter table 表名 add index 索引名称(索引列);
例如:alter tabel student add index Index_name(name);
删除索引:
格式:alter table 表名 drop index 索引名称;
例如:alter table student drop index Index_name;
事务:一个操作下可以分为多个操作,事务决定了这多个小操作都实行完成,才认为这一个操作执行结束
执行事务之前关闭自动提交:set autocommit=0;
事务的操作:
begin:开始一个事务
rollback:事务出现问题进行回滚
commit:事务没有问题进行提交
例如:
BEGIN;
update person set money=5000-2000;
update bank set money=0+2000;
select * from person;
select * from bank;
commit;
注意:事务中所有的操作都是临时或虚拟的,在进行commit才会把这些操作才原数据上进行执行
Shell操作mysql
格式:#!/bin/sh
MYSQL="mysql -h192.168.154.110 -uroot -p123456 --default-character-set=utf8"
sql="select * from shujuku.student"
result="$($MYSQL -e "$sql")"
echo -e "$result"