课程回顾

day01

  1. 数据库相关sql
  2. 查询所有 show databases;
  3. 创建 create database db1 character set utf8/gbk;
  4. 查询详情 show create database db1;
  5. 删除 drop database db1;
  6. 使用 use db1;
  7. 表相关
  8. 创建表 create table t1(name varchar(10),age int);
  9. 查询所有 show tables;
  10. 查询表详情 show create table t1;
  11. 表字段 desc t1;
  12. 删除表 drop table t1;
  13. 修改表名 rename table t1 to t2;
  14. 添加字段 alter table t1 add age int first/after xxx;
  15. 修改引擎和字符集 alter table t1 engine=myisam/innodb charset=utf8/gbk;
  16. 删除字段 alter table t1 drop age;
  17. 修改字段名和类型 alter table t1 change 原名 新名 新类型;
  18. 修改类型和位置 alter table t1 modify 字段名 新类型 位置;
  19. 数据相关:
  20. 插入数据 insert into t1 (字段1,字段2) values(值1,值2),(值1,值2);
  21. 查询数据 select * from 表名;
  22. 修改 update t1 set age=10,name='xxx' where id=5;
  23. 删除 delete from t1 where age<20;

day02

  1. 主键约束+自增: primary key auto_increment
  2. 注释 comment
  3. `:用于修饰字段名和表名可以省略 '用于修饰字符串
  4. 冗余: 表设计不合理导致的大量重复数据,通过拆分表解决
  5. 事务:数据库中执行同一业务多条sql语句的工作单元,可以保证多条sql全部执行成功或全部执行失败
  6. 开启事务: begin
  7. 回滚:rollback
  8. 提交:commit
  9. 保存回滚点: savepoint xxx;
  10. 回滚到某个回滚点: rollback to xxx;
  11. sql分类:
  12. DDL数据定义语言: 包含create drop truncate alter 不支持事务
  13. DML数据操作语言: 包含insert update delete select(DQL) 支持事务
  14. DQL数据查询语言: 只包含select
  15. TCL事务控制语言
  16. DCL数据控制语言: 用于分配用户 权限相关的sql
  17. 数据类型
  18. 整数:int(m) bigint(m) m代表显示长度 结合zerofill使用
  19. 浮点数:double(m,d) m代表总长度 d代表小数长度 decimal(m,d)
  20. 字符串:char(m) 不可变长度 最大255 varchar(m)可变长度最大65535 超过255建议使用 text
  21. 日期:date 年月日 time 时分秒 datetime 最大9999-12-31 默认值null, timestamp 最大2038-1-19 默认值为当前系统时间
  22. 其它

day03

  1. is null 和 is not null
  2. 别名
  3. 去重 distinct
  4. 比较运算符 > < >= <= = !=和<>
  5. and和or
  6. in 和 not in
  7. between x and y 和 not between x and y
  8. like 模糊查询 _代表单个未知字符 %代表0或多个未知字符
  9. 排序 order by 字段名 asc/desc,字段名;
  10. 分页 limit 跳过的条数,每页的条数
  11. 数值计算 + - * / 7%2 mod(7,2)
  12. 日期相关: now() curdate() curtime() date(now()) time(now()) extract(year/month/day/hour/minute/second from now()); dateformat(时间,格式) %YymcdHhis strto_date(字符串时间,格式)
  13. ifnull(x,y) 如果x的值为null 则取y 不为null则取x
  14. 聚合函数 平均值avg 最大值max 最小 min 求和sum 计数count
  15. 字符串相关 concat() char_length() instr(str,substr) locate(substr,str); upper() lower() left() right() substring() trim() repeat() replace() reverse()

day04

  1. 数学相关函数: floor() round() truncate() rand()
  2. 分组查询 group by 字段名,字段名
  3. having后面写聚合函数的条件需要结合group by使用 where后面写普通字段的条件
  4. 子查询: 嵌套在sql语句中的 sql查询语句称为子查询,可以嵌套n层
  5. 可写在的位置:
    1. where和having后面当做查询条件的值
    2. 写在创建表的时候 把结果保存到新表中
    3. 写from后面当成虚拟表 必须有别名
  6. 关联查询
  7. 查询方式有三种:
    1. 等值连接 select * from A,B where A.x=B.x and A.age=18;
    2. 内连接 select * from A join B on A.x=B.x where A.age=18;
    3. 外链接 select * from A left/right join B on A.x=B.x where A.age=18;
  8. 如果查询两张表的交集数据使用,等值连接和内连接 建议使用内联
  9. 如果查询两张表中一张表的全部数据和另外一张表的交集数据则使用外连接

day05

  1. 关联关系
  2. 一对一: 在从表中添加外键指向主表的主键
  3. 一对多: 在多的表中添加外键指向主表的主键
  4. 多对多: 创建单独的关系表保存两个表的主键
  5. 权限管理案例: 三张主表:用户表 角色表 权限表 两张关系表:用户角色关系表 角色权限关系表

面试题

交易号 交易时间 交易金额 交易类型 姓名 性别 关系

流水表:交易号 交易时间 交易金额 交易类型 person_id

人物表:id 姓名 性别 关系 1. 创建表: create database db6 character set utf8; use db6; create table trade (id int primary key autoincrement,time datetime,money int,type varchar(10),personid int); create table person(id int primary key autoincrement,name varchar(10),gender varchar(5),rel varchar(10)); - 往人物表插入以下数据: 1 刘德华 男 亲戚 2 杨幂 女 亲戚 3 马云 男 同事 4 特朗普 男 朋友 5 貂蝉 女 朋友 insert into person values(null,'刘德华','男','亲戚'),(null,'杨幂','女','亲戚'),(null,'马云','男','同事'),(null,'特朗普','男','朋友'),(null,'貂蝉','女','朋友'); - 往流水表插入以下数据: 刘德华 微信 收1000 2018-03-20 杨幂 现金 收500 发50 2018-04-14 马云 支付宝 收20000 发5 2018-3-11 特朗普 微信 收2000 2018-5-18 貂蝉 微信 发20000 2018-7-22 insert into trade values(null,'2018-03-20',1000,'微信',1),(null,'2018-04-14',500,'现金',2), (null,'2018-04-14',-50,'现金',2),(null,'2018-3-11',20000,'支付宝',3), (null,'2018-3-11',-5,'支付宝',3), (null,'2018-5-18',2000,'微信',4), (null,'2018-03-20',-20000,'微信',5); 1. 统计2018年2月15号到现在的所有红包收益 select sum(money) from trade where time>=strtodate('2018年2月15号','%Y年%c月%d号'); 2. 查询2018年2月15号到现在金额大于100所有女性亲戚的名字和金额 select p.name,t.money from trade t join person p on t.personid=p.id where t.time>=strtodate('2018年2月15号','%Y年%c月%d号') and t.money not between -100 and 100 and p.gender='女' and p.rel='亲戚'; 3. 查询每个平台分别收入的红包金额 select type,sum(money) from trade where money>0 group by type;

视图

视图分类
  1. 简单视图:创建视图的子查询中不包含去重、分组查询、聚合函数、关联查询的视图称为简单视图,可以对视图中的数据进行增删改查操作
  2. 复杂视图:和简单视图相反,只能进行查询
  3. 创建显示每个部门工资总和,平均工资、最大工资、最小工资的复杂视图: create view vempinfo as (select deptno,sum(sal),avg(sal),max(sal),min(sal) from emp group by deptno);
对简单视图进行增删改操作,操作方式和table一样
  1. 插入数据 insert into vemp10(empno,ename) values(10011,'Tom'); insert into vemp10(empno,ename,deptno) values(10012,'Jerry',20);
  2. 如果插入一条数据在原表中显示但是在视图中不显示,则称为数据污染
  3. 数据污染可以通过 with check option 关键字解决 create view vemp20 as (select * from emp where deptno=20) with check option; -插入数据 insert into vemp20 (empno,ename,deptno) values(10013,'刘德华',30); //插入数据失败 insert into vemp20 (empno,ename,deptno) values(10013,'刘德华',20); //插入数据成功! -删除和修改数据 只能操作视图中存在的数据 delete from vemp20 where deptno=10; //没有数据被删除 update vemp20 set sal=666 where deptno=10;//没有数据被修改

修改视图

删除视图

视图别名

视图总结:

  1. 视图是数据库中的对象,代表一段sql语句,可以理解成是一张虚拟的表
  2. 作用:重用sql、隐藏敏感信息
  3. 分类:简单视图(不包含,去重、聚合函数、分组、关联查询 可以对数据进行增删改操作)和复杂视图(和简单视图相反,只能查询)
  4. 插入数据时可能会出现数据污染问题,通过with check option解决
  5. 删除和修改只能操作视图中存在的数据
  6. 起了别名后只能用别名

约束

主键约束 primary key

非空约束 not null

唯一约束 unique

默认约束 default

外键约束

索引

创建索引

查看索引

删除索引

复合索引

索引总结:

  1. 索引是数据库中用来提高查询效率的技术,类似于目录
  2. 因为索引会占用磁盘空间不是越多越好,只针对常用的查询字段创建索引
  3. 数据量小的表如果添加索引会降低查询效率,所以不是有索引就一定好

事务

group_concat() 组连接

面试题