ToB企服应用市场:ToB评测及商务社交产业平台

标题: mysql学习 [打印本页]

作者: 立聪堂德州十三局店    时间: 2023-10-4 09:46
标题: mysql学习
mysql

0.数据库常见概念

0.1概念

数据库:  英文单词DataBase,简称DB。按照一定格式存储数据的一些文件的组合。  顾名思义:存储数据的仓库,实际上就是一堆文件。这些文件中存储了  具有特定格式的数据。
数据库管理系统:  DataBaseManagement,简称DBMS。  数据库管理系统是专门用来管理数据库中数据的,数据库管理系统可以  对数据库当中的数据进行增删改查。
常见的数据库管理系统:  MySQL、Oracle、MS SqlServer、DB2、sybase等....
SQL:结构化查询语言  程序员需要学习SQL语句,程序员通过编写SQL语句,然后DBMS负责执行SQL  语句,最终来完成数据库中数据的增删改查操作。
SQL是一套标准,程序员主要学习的就是SQL语句,这个SQL在mysql中可以使用, 同时在Oracle中也可以使用,在DB2中也可以使用。
三者之间的关系?  DBMS--执行--> SQL --操作--> DB
先安装数据库管理系统MySQL,然后学习SQL语句怎么写,编写SQL语句之后,DBMS 对SQL语句进行执行,最终来完成数据库的数据管理。
0.2 SQL语句分类

DQL:
  数据查询语言(凡是带有select关键字的都是查询语句)
   select...
DML:
   数据操作语言(凡是对表当中的数据进行增删改的都是DML)
   insert delete update  insert 增  delete 删  update 改
   这个主要是操作表中的数据data。
DDL:
   数据定义语言
   凡是带有create、drop、alter的都是DDL。
   DDL主要操作的是表的结构。不是表中的数据。
   create: 新建,等同于增
   drop:删除
       alter:  修改
       这个增删改和DML不同,这个主要对表结构进行操作。
TCL:
       不是王牌电视。
    是事务控制语言
 
0.3MYSQL中的数据类型

varchar(最长255)  可变长度的字符串,比较智能,节省空间。会根据实际的数据长度动态分配空间。
优点:节省空间 ​ 缺点:需要动态分配空间,速度慢。
char(最长255)  定长字符串,不管实际的数据长度是多少,分配固定长度的空间去存储数据。  使用不恰当的时候,可能会导致空间的浪费。
优点:不需要动态分配空间,速度快。 ​ 缺点:使用不当可能会导致空间的浪费。
varchar和char我们应该怎么选择?
 性别字段你选什么?因为性别是固定长度的字符串,所以选择char。
​ 姓名字段你选什么?每一个人的名字长度不同,所以选择varchar。
int(最长11)
数字中的整数型。等同于java的int。
bigint  数字中的长整型。等同于java中的long。
float  单精度浮点型数据
double  双精度浮点型数据
date  短日期类型
datetime  长日期类型
clob  字符大对象  最多可以存储4G的字符串。  比如:存储一篇文章,存储一个说明。  超过255个字符的都要采用CLOB字符大对象来存储。  Character Large OBject:CLOB
blob  二进制大对象  Binary Large OBject  专门用来存储图片、声音、视频等流媒体数据。  往BLOB类型的字段上插入数据的时候,例如插入一个图片、视频等,  你需要使用IO流才行。
  1. t_movie 电影表(专门存储电影信息的)
  2. 编号no(bigint)    名字name(varchar)        故事情节history(clob)   
  3. 上映日期playtime(date)        时长time(double)        海报image(blob)
  4. 类型type(char)                           
复制代码
0.4SQL脚本的执行

xxxx.sql这种文件被称为sql脚本文件。
sql脚本文件中编写了大量的sql语句。
我们执行sql脚本文件的时候,该文件中所有的sql语句会全部执行!
批量的执行SQL语句,可以使用sql脚本文件。
    你在实际的工作中,第一天到了公司,项目经理会给你一个xxx.sql文件,你执行这个脚本文件,你电脑上的数据库数据就有了!
0.5数据库和表的导入导出
  1. 数据导出?
  2.     注意:在windows的dos命令窗口中:
  3.         mysqldump bjpowernode>D:\bjpowernode.sql -uroot -p123456
  4.     可以导出指定的表吗?
  5.         mysqldump bjpowernode emp>D:\bjpowernode.sql -uroot -p123456
  6. 数据导入?
  7.     注意:需要先登录到mysql数据库服务器上。
  8.     然后创建数据库:create database bjpowernode;
  9.     使用数据库:use bjpowernode
  10.     然后初始化数据库:source D:\bjpowernode.sql
复制代码
1.数据库操作

show databases;  查看mysql中有哪些数据库
use test; 表示正在使用一个名字叫做test的数据库。
create database db01; 创建数据库
show tables;  查看某个数据库下有哪些表
select version(); 查看mysql数据库的版本号
select database(); 查看当前使用的是哪个数据库
\c 用来终止一条命令的输入。
2.建表操作

2.1创建一个表create
  1. 学号、姓名、年龄、性别、邮箱地址
  2.     create table t_student(
  3.         no int,
  4.         name varchar(32),
  5.         sex char(1),
  6.         age int(3),
  7.         email varchar(255)
  8.     );
复制代码
2.2删除一个表drop
  1.     drop table t_student; // 当这张表不存在的时候会报错!
  2.     // 如果这张表存在的话,删除
  3.     drop table if exists t_student;
复制代码
2.3插入数据insert

insert into 表名(字段名1,字段名2,字段名3...) values(值1,值2,值3);
  1. insert into t_student(no,name,sex,age,email)
  2.     values(1,'zhangsan','m',20,'zhangsan@123.com');
  3. insert into t_student(email,name,sex,age,no)
  4.     values('lisi@123.com','lisi','f',20,2);
  5. insert into t_student(no) values(3);
  6. //省略字段名
  7. insert into t_student values(2, 'lisi', 'f', 20, 'lisi@123.com');
复制代码
 
一次插入多条数据
insert into t_user(字段名1,字段名2) values(),(),(),();
  1. insert into t_user(id,name,birth,create_time) values
  2.         (1,'zs','1980-10-11',now()),
  3.         (2,'lisi','1981-10-11',now()),
  4.         (3,'wangwu','1982-10-11',now());
复制代码
2.4修改数据update

没有条件限制会导致所有数据全部更新。
  1. update t_user set name = 'jack', birth = '2000-10-11' where id = 2;
  2. update t_user set name = 'jack', birth = '2000-10-11', create_time = now() where id = 2;
复制代码
 
2.5删除数据

delete语句删除数据的原理?(delete属于DML语句!!!)
truncate语句删除数据的原理?
2.5.1delete

2.5.2truncate

下列演示内容所用表
emp 员工表

 
salgarde 工资等级表

 
dept 部门表

3.基础增删改

 
3.单表查询

 
3.1基础条件查询

= 等于
  1. 查询薪资等于800的员工姓名和编号?
  2.         select empno,ename from emp where sal = 800;
  3.     查询SMITH的编号和薪资?
  4.         select empno,sal from emp where ename = 'SMITH'; //字符串使用单引号
复制代码
或!= 不等于
查询薪资不等于800的员工姓名和编号?
        select empno,ename from emp where sal != 800;
        select empno,ename from emp where sal  800; // 小于号和大于号组成的不等号
< 小于 <strong>=) 大于等于**
  1. 查询薪资小于等于3000的员工姓名和编号?
  2.         select empno,ename,sal from emp where sal <= 3000;
复制代码
and 并且 or 或者
  1. 查询薪资大于等于3000的员工姓名和编号?
  2. select empno,ename,sal from emp where sal >= 3000;
  3. between … and …. 两个值之间, 等同于 >= and <=
  4. 查询薪资在2450和3000之间的员工信息?包括2450和3000
  5.     第一种方式:>= and <= (and是并且的意思。)
  6.         select empno,ename,sal from emp where sal >= 2450 and sal <= 3000;   
复制代码
in 包含,相当于多个 or (not in 不在这个范围中)
  1. 查询哪些员工的津贴/补助为null?
  2.         mysql> select empno,ename,sal,comm from emp where comm = null;
  3. 查询哪些员工的津贴/补助不为null?
  4.         select empno,ename,sal,comm from emp where comm is not null;
复制代码
not 可以取非,主要用在 is 或 in 中
  1. select  * from emp where sal > 2500 and (deptno = 10 or deptno = 20);
  2. and和or同时出现,and优先级较高。如果想让or先执行,需要加“小括号”,以后在开发中,如果不确定优先级,就加小括号就行了。
复制代码
like
称为模糊查询,支持%或下划线匹配

3.2排序

查询所有员工薪资,排序?
指定降序:desc
3.3分页

按照薪资降序,取出排名在前5名的员工?
  1. 找出名字中含有O的?
  2.     mysql> select ename from emp where ename like '%O%';
  3. 找出名字中有“_”的?
  4.     select name from t_student where name like '%_%'; //这样不行。
  5.     mysql> select name from t_student where name like '%\_%'; // \转义字符。<strong>distinct</strong>
复制代码
取出工资排名在[3-5]名的员工?
  1. 查询员工名字和薪资,要求按照薪资升序,如果薪资一样的话,
  2.     再按照名字升序排列。
  3.     select
  4.         ename,sal
  5.     from
  6.         emp
  7.     order by
  8.         sal asc, ename asc; // sal在前,起主导,只有sal相等的时候,才会考虑启用ename排序。
复制代码
4.函数

4.1单行处理函数

  1. select
  2.         ename,sal
  3.     from
  4.         emp
  5.     order by
  6.         sal desc
  7.     limit 5; //取前5    limit 0,5;
  8. mysql当中limit在order by之后执行!!!!!!
复制代码
4.2分组函数

  1.     select
  2.         ename,sal
  3.     from
  4.         emp
  5.     order by
  6.         sal desc
  7.     limit
  8.         2, 3;
  9. 2表示起始位置从下标2开始,就是第三条记录。
  10. 3表示长度。
复制代码
分组函数在使用的时候需要注意哪些?
5.分组查询

5.1 group by

找出每个工作岗位的工资和?
  1. lower 转换小写
  2.     mysql> select lower(ename) as ename from emp;
  3. upper 转换大写
  4.         mysql> select * from t_student;
  5. substr 取子串(substr( 被截取的字符串, 起始下标,截取的长度))
  6.         select substr(ename, 1, 1) as ename from emp;
  7.         注意:起始下标从1开始,没有0.
  8.         找出员工名字第一个字母是A的员工信息?
  9.             第一种方式:模糊查询
  10.                 select ename from emp where ename like 'A%';
  11.             第二种方式:substr函数
  12.                 select
  13.                     ename
  14.                 from
  15.                     emp
  16.                 where
  17.                     substr(ename,1,1) = 'A';
  18. concat函数进行字符串的拼接
  19.         select concat(empno,ename) from emp;
  20. length 取长度
  21.         select length(ename) enamelength from emp;
  22. trim 去空格
  23.         mysql> select * from emp where ename = '  KING';
  24. str_to_date 将字符串转换成日期
  25. date_format 格式化日期
  26. format 设置千分位
  27. round 四舍五入
  28.         select 字段 from 表名;
  29.         select ename from emp;
  30.         select 'abc' from emp; // select后面直接跟“字面量/字面值”
  31.         mysql> select 'abc' as bieming from emp;
  32.         select round(1236.567, 1) as result from emp; //保留1个小数
  33.         select round(1236.567, 2) as result from emp; //保留2个小数
  34.         select round(1236.567, -1) as result from emp; // 保留到十位。
  35. rand() 生成随机数
  36.         mysql> select round(rand()*100,0) from emp; // 100以内的随机数
  37. ifnull 可以将 null 转换成一个具体值
  38.         ifnull是空处理函数。专门处理空的。
  39.         在所有数据库当中,只要有NULL参与的数学运算,最终结果就是NULL。
  40.         mysql> select ename, sal + comm as salcomm from emp;
复制代码
在一条select语句当中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数。其它的一律不能跟。
找出每个部门的最高薪资
  1. 找出最高工资?
  2.         mysql> select max(sal) from emp;
  3. 找出最低工资?
  4.         mysql> select min(sal) from emp;
  5. 计算工资和:
  6.         mysql> select sum(sal) from emp;
  7. 计算平均工资:
  8.         mysql> select avg(sal) from emp;
  9. 计算员工数量?
  10.         mysql> select count(ename) from emp;
复制代码
5.2 联合分组

找出“每个部门,不同工作岗位”的最高薪资?
  1.     实现思路:按照工作岗位分组,然后对工资求和。
  2.         select
  3.             job,sum(sal)
  4.         from
  5.             emp
  6.         group by
  7.             job;
  8. 以上这个语句的执行顺序?
  9. 先从emp表中查询数据。根据job字段进行分组。然后对每一组的数据进行sum(sal)
复制代码
5.3having

找出每个部门平均薪资,要求显示平均薪资高于2500的。
  1. 实现思路:按照部门编号分组,求每一组的最大值。
  2.     mysql> select deptno,max(sal) from emp group by deptno;
复制代码
where和having,优先选择where,where实在完成不了了,再选择having。
5.4总结sql执行顺序

执行顺序?  1. from --> where --> group by --> having --> select --> order by
6.连表查询

6.1内连接之等值连接

查询每个员工所在部门名称,显示员工名和部门名?
  1. select
  2.     deptno,avg(sal)
  3. from
  4.     emp
  5. group by
  6.     deptno
  7. having
  8.     avg(sal) > 2500;
复制代码
6.2内连接之非等值连接

找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级?
  1. 找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除MANAGER岗位之外,
  2. 要求按照平均薪资降序排。
  3.     select
  4.         job, avg(sal) as avgsal
  5.     from
  6.         emp
  7.     where
  8.         job <> 'MANAGER'
  9.     group by
  10.         job
  11.     having
  12.         avg(sal) > 1500
  13.     order by
  14.         avgsal desc;
复制代码
6.3内连接自己连接

查询员工的上级领导,要求显示员工名和对应的领导名?
  1. SQL92语法:
  2.     select
  3.         e.ename,d.dname
  4.     from
  5.         emp e, dept d
  6.     where
  7.         e.deptno = d.deptno;
  8.    
  9.     sql92的缺点:结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面。
  10.    
  11. SQL99语法:
  12.     //inner可以省略(带着inner可读性更好!!!一眼就能看出来是内连接)
  13.     select
  14.         e.ename,d.dname
  15.     from
  16.         emp e
  17.     inner join
  18.         dept d
  19.     on
  20.         e.deptno = d.deptno; // 条件是等量关系,所以被称为等值连接。
  21.     sql99优点:表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后继续添加where
复制代码
6.4外连接

  1. 技巧:一张表看成两张表。
  2. select
  3.     a.ename as '员工名', b.ename as '领导名'
  4. from
  5.     emp a
  6. join
  7.     emp b
  8. on
  9.     a.mgr = b.empno; //员工的领导编号 = 领导的员工编号
复制代码
6.5多表连接

三张表,四张表怎么连接?
  1. // outer是可以省略的,带着可读性强。
  2. select
  3.     e.ename,d.dname
  4. from
  5.     emp e
  6. right outer join
  7.     dept d
  8. on
  9.     e.deptno = d.deptno;
复制代码
找出每个员工的部门名称以及工资等级,要求显示员工名、部门名、薪资、薪资等级?
  1. select
  2.     e.ename,d.dname
  3. from
  4.     dept d
  5. left outer join
  6.     emp e
  7. on
  8.     e.deptno = d.deptno;
  9. 带有right的是右外连接,又叫做右连接。
  10. 带有left的是左外连接,又叫做左连接。
  11. 任何一个右连接都有左连接的写法。
  12. 任何一个左连接都有右连接的写法。
复制代码
找出每个员工的部门名称以及工资等级,还有上级领导,要求显示员工名、领导名、部门名、薪资、薪资等级?
  1.     语法:
  2.         select
  3.             ...
  4.         from
  5.             a
  6.         join
  7.             b
  8.         on
  9.             a和b的连接条件
  10.         join
  11.             c
  12.         on
  13.             a和c的连接条件
  14.         right join
  15.             d
  16.         on
  17.             a和d的连接条件
复制代码
7.子查询

7.1where子句中的子查询

找出比最低工资高的员工姓名和工资?
7.2from子句中的子查询

找出每个岗位的平均工资的薪资等级。
  1. select
  2.         e.ename,e.sal,d.dname,s.grade
  3.     from
  4.         emp e
  5.     join
  6.         dept d
  7.     on
  8.         e.deptno = d.deptno
  9.     join
  10.         salgrade s
  11.     on
  12.         e.sal between s.losal and s.hisal;
复制代码
8.约束

8.1约束类型

我们这里重点学习四个约束:not null,unique,primary key,foreign key。
8.2not null

  1. select
  2.     e.ename,e.sal,d.dname,s.grade,l.ename
  3. from
  4.     emp e
  5. join
  6.     dept d
  7. on
  8.     e.deptno = d.deptno
  9. join
  10.     salgrade s
  11. on
  12.     e.sal between s.losal and s.hisal
  13. left join
  14.     emp l
  15. on
  16.     e.mgr = l.empno;
复制代码
8.3unique

  1. select
  2.             t.*, s.grade
  3.         from
  4.             (select job,avg(sal) as avgsal from emp group by job) t
  5.         join
  6.             salgrade s
  7.         on
  8.             t.avgsal between s.losal and s.hisal;
复制代码
8.3.1联合唯一

  1. drop table if exists t_vip;
  2.     create table t_vip(
  3.         id int,
  4.         name varchar(255) not null  // not null只有列级约束,没有表级约束!
  5.     );
  6. insert into t_vip(id,name) values(1,'zhangsan');
  7. insert into t_vip(id) values(3);
  8.     ERROR 1364 (HY000): Field 'name' doesn't have a default value
复制代码
8.4primary key

  1.     drop table if exists t_vip;
  2.     create table t_vip(
  3.         id int,
  4.         name varchar(255) unique,
  5.         email varchar(255)
  6.     );
  7.     insert into t_vip(id,name,email) values(2,'lisi','lisi@123.com');
  8.     insert into t_vip(id,name,email) values(3,'wangwu','wangwu@123.com');
  9.     select * from t_vip;
  10.     insert into t_vip(id,name,email) values(4,'wangwu','wangwu@sina.com');
  11.     ERROR 1062 (23000): Duplicate entry 'wangwu' for key 'name'
  12.     insert into t_vip(id) values(4);
  13.     insert into t_vip(id) values(5);
  14.     +------+----------+------------------+
  15.     | id   | name     | email            |
  16.     +------+----------+------------------+
  17.     |    1 | zhangsan | zhangsan@123.com |
  18.     |    2 | lisi     | lisi@123.com     |
  19.     |    3 | wangwu   | wangwu@123.com   |
  20.     |    4 | NULL     | NULL             |
  21.     |    5 | NULL     | NULL             |
  22.     +------+----------+------------------+
  23.     name字段虽然被unique约束了,但是可以为NULL。
复制代码
8.4.1复合主键
  1. drop table if exists t_vip;
  2. create table t_vip(
  3.     id int,
  4.     name varchar(255),
  5.     email varchar(255),
  6.     unique(name,email) // 约束没有添加在列的后面,这种约束被称为表级约束。
  7. );
  8. insert into t_vip(id,name,email) values(1,'zhangsan','zhangsan@123.com');
  9. insert into t_vip(id,name,email) values(2,'zhangsan','zhangsan@sina.com');
  10.     name和email两个字段联合起来唯一!!!
  11.    
  12. insert into t_vip(id,name,email) values(3,'zhangsan','zhangsan@sina.com');
  13.     ERROR 1062 (23000): Duplicate entry 'zhangsan-zhangsan@sina.com' for key 'name'
复制代码
  1. drop table if exists t_vip;
  2.         // 1个字段做主键,叫做:单一主键
  3.         create table t_vip(
  4.             id int primary key,  //列级约束
  5.             name varchar(255),
  6.             primary key(id)  // 表级约束
  7.         );
  8.         insert into t_vip(id,name) values(1,'zhangsan');
  9.         insert into t_vip(id,name) values(2,'lisi');
  10.         //错误:不能重复
  11.         insert into t_vip(id,name) values(2,'wangwu');
  12.         ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
  13.         //错误:不能为NULL
  14.         insert into t_vip(name) values('zhaoliu');
  15.         ERROR 1364 (HY000): Field 'id' doesn't have a default value
复制代码
主键分类
8.4.2主键自增

8.5foreign key

  1. 一个表中主键约束能加两个吗?
  2.         drop table if exists t_vip;
  3.         create table t_vip(
  4.             id int primary key,
  5.             name varchar(255) primary key
  6.         );
  7.         ERROR 1068 (42000): Multiple primary key defined
复制代码
t_class是父表,t_student是子表
删除表的顺序? 先删子,再删父。
创建表的顺序? 先创建父,再创建子。
删除数据的顺序?先删子,再删父。
插入数据的顺序?先插入父,再插入子
9.存储引擎

  1. rop table if exists t_vip;
  2. create table t_vip(
  3.     id int primary key auto_increment, //auto_increment表示自增,从1开始,以1递增!
  4.     name varchar(255)
  5. );
  6.         insert into t_vip(name) values('zhangsan');
  7.         insert into t_vip(name) values('zhangsan');
  8.         insert into t_vip(name) values('zhangsan');
  9.         insert into t_vip(name) values('zhangsan');
  10.         insert into t_vip(name) values('zhangsan');
  11.         insert into t_vip(name) values('zhangsan');
  12.         
  13.         +----+----------+
  14.         | id | name     |
  15.         +----+----------+
  16.         |  1 | zhangsan |
  17.         |  2 | zhangsan |
  18.         |  3 | zhangsan |
  19.         |  4 | zhangsan |
  20.         |  5 | zhangsan |
复制代码
在建表的时候可以在最后小括号的")"的右边使用:
9.1mysql支持的存储引擎


9.2MyISAM存储引擎

9.3InnoDB存储引擎

9.4MEMORY存储引擎

10.事务

10.1InnoDB实现事务

  1. create table t_class(
  2.     classno int primary key,
  3.     classname varchar(255)
  4. );
  5. create table t_student(
  6.     no int primary key auto_increment,
  7.     name varchar(255),
  8.     cno int,
  9.     foreign key(cno) references t_class(classno)
  10. );
  11. insert into t_class(classno, classname) values(100, '北京市大兴区亦庄镇第二中学高三1班');
  12. insert into t_class(classno, classname) values(101, '北京市大兴区亦庄镇第二中学高三1班');
  13. insert into t_student(name,cno) values('jack', 100);
  14. insert into t_student(name,cno) values('lilei', 100);
  15. insert into t_student(name,cno) values('hanmeimei', 100);
  16. insert into t_student(name,cno) values('zhangsan', 101);
  17. insert into t_student(name,cno) values('lisi', 101);
复制代码
10.2事物的四个特性

A:原子性  说明事务是最小的工作单元。不可再分。
C:一致性  所有事务要求,在同一个事务当中,所有操作必须同时成功,或者同时失败,  以保证数据的一致性。
I:隔离性  A事务和B事务之间具有一定的隔离。  教室A和教室B之间有一道墙,这道墙就是隔离性。  A事务在操作一张表的时候,另一个事务B也操作这张表会那样???
D:持久性  事务最终结束的一个保障。事务提交,就相当于将没有保存到硬盘上的数据  保存到硬盘上!
10.3事务的隔离性

10.3.1事务和事务之间四个隔离级别

读未提交:read uncommitted(最低的隔离级别)《没有提交就读到了》
读已提交:read committed《提交之后才能读到》
可重复读:repeatable read《提交之后也读不到,永远读取的都是刚开启事务时的数据》
序列化/串行化:serializable(最高的隔离级别)
10.3.2验证各种隔离级别

验证:read uncommited
  1. show create table t_student;
  2. 可以在建表的时候给表指定存储引擎。
  3. CREATE TABLE `t_student` (
  4.   `no` int(11) NOT NULL AUTO_INCREMENT,
  5.   `name` varchar(255) DEFAULT NULL,
  6.   `cno` int(11) DEFAULT NULL,
  7.   PRIMARY KEY (`no`),
  8.   KEY `cno` (`cno`),
  9.   CONSTRAINT `t_student_ibfk_1` FOREIGN KEY (`cno`) REFERENCES `t_class` (`classno`)
  10. ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8
复制代码
验证:read commited
  1. 事务回滚
  2.     mysql> select * from dept_bak;
  3.         Empty set (0.00 sec)
  4.     mysql> start transaction;
  5.     Query OK, 0 rows affected (0.00 sec)
  6.     mysql> insert into dept_bak values(10,'abc', 'tj');
  7.     Query OK, 1 row affected (0.00 sec)
  8.     mysql> insert into dept_bak values(10,'abc', 'tj');
  9.     Query OK, 1 row affected (0.00 sec)
  10.     mysql> select * from dept_bak;
  11.     +--------+-------+------+
  12.     | DEPTNO | DNAME | LOC  |
  13.     +--------+-------+------+
  14.     |     10 | abc   | tj   |
  15.     |     10 | abc   | tj   |
  16.     +--------+-------+------+
  17.     2 rows in set (0.00 sec)
  18.     mysql> rollback;
  19.     Query OK, 0 rows affected (0.00 sec)
  20.     mysql> select * from dept_bak;
  21.     Empty set (0.00 sec)
复制代码
验证:repeatable read
  1. mysql> set global transaction isolation level read uncommitted;
  2. 事务A                                                    事务B
  3. --------------------------------------------------------------------------------
  4. use bjpowernode;
  5.                                                     use bjpowernode;
  6. start transaction;
  7. select * from t_user;
  8.                                                     start transaction;
  9.                                                     insert into t_user values('zhangsan');
  10. select * from t_user;
复制代码
验证:serializable
  1. mysql> set global transaction isolation level read committed;
  2. 事务A                                                    事务B
  3. --------------------------------------------------------------------------------
  4. use bjpowernode;
  5.                                                     use bjpowernode;
  6. start transaction;
  7.                                                     start transaction;
  8. select * from t_user;
  9.                                                     insert into t_user values('zhangsan');
  10. select * from t_user;
  11.                                                     commit;
  12. select * from t_user;
复制代码
11.索引

索引的实现原理?

什么条件下,我们会考虑给字段添加索引呢?

11.1索引的创建和删除
  1. mysql> set global transaction isolation level repeatable read;
  2. 事务A                                                    事务B
  3. --------------------------------------------------------------------------------
  4. use bjpowernode;
  5.                                                     use bjpowernode;
  6. start transaction;
  7.                                                     start transaction;
  8. select * from t_user;
  9.                                                     insert into t_user values('lisi');
  10.                                                     insert into t_user values('wangwu');
  11.                                                     commit;
  12. select * from t_user;
复制代码
12.视图

  1. mysql> set global transaction isolation level serializable;
  2. 事务A                                                    事务B
  3. --------------------------------------------------------------------------------
  4. use bjpowernode;
  5.                                                     use bjpowernode;
  6. start transaction;
  7.                                                     start transaction;
  8. select * from t_user;
  9. insert into t_user values('abc');
复制代码
12.1视图的作用

  1. 创建索引:
  2.     mysql> create index emp_ename_index on emp(ename);
  3.     给emp表的ename字段添加索引,起名:emp_ename_index
  4. 删除索引:
  5.     mysql> drop index emp_ename_index on emp;
  6.     将emp表上的emp_ename_index索引对象删除。
  7.    
  8.    
  9.     查看一个SQL语句是否使用了索引进行检索?
  10.     mysql> explain select * from emp where ename = 'KING';
  11.     +----+-------------+-------+------+---------------+------+---------+--
  12.     | id | select_type | table | type | possible_keys | key  | key_len |
  13.     +----+-------------+-------+------+---------------+------+---------+-
  14.     |  1 | SIMPLE      | emp   | ALL  | NULL          | NULL | NULL    |
  15.     +----+-------------+-------+------+---------------+------+---------+--
  16.     扫描14条记录:说明没有使用索引。type=ALL
  17.     mysql> create index emp_ename_index on emp(ename);
  18.     mysql> explain select * from emp where ename = 'KING';
  19.     +----+-------------+-------+------+-----------------+-----------------
  20.     | id | select_type | table | type | possible_keys   | key            
  21.     +----+-------------+-------+------+-----------------+-----------------
  22.     |  1 | SIMPLE      | emp   | ref  | emp_ename_index | emp_ename_index
  23.     +----+-------------+-------+------+-----------------+-----------------
复制代码
12.2视图在开发中的作用

13.数据库三范式

第一范式:要求任何一张表必须有主键,每一个字段原子性不可再分。
第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键, 不要产生部分依赖。
第三范式:建立在第二范式的基础之上,要求所有非主键字段直接依赖主键, 不要产生传递依赖。
设计数据库表的时候,按照以上的范式进行,可以避免表中数据的冗余,空间的浪费。
13.1第一范式
  1. 表复制:
  2.     mysql> create table dept2 as select * from dept;
  3. dept2表中的数据:
  4.     mysql> select * from dept2;
  5. +--------+------------+----------+
  6. | DEPTNO | DNAME      | LOC      |
  7. +--------+------------+----------+
  8. |     10 | ACCOUNTING | NEW YORK |
  9. |     20 | RESEARCH   | DALLAS   |
  10. |     30 | SALES      | CHICAGO  |
  11. |     40 | OPERATIONS | BOSTON   |
  12. +--------+------------+----------+
  13. 创建视图对象:
  14.     create view dept2_view as select * from dept2;
  15. 删除视图对象:
  16.     drop view dept2_view;
  17. 注意:只有DQL语句才能以view的形式创建。
  18.     create view view_name as 这里的语句必须是DQL语句;
复制代码
13.2第二范式
  1. //面向视图查询
  2. select * from dept2_view;
  3. // 面向视图插入
  4. insert into dept2_view(deptno,dname,loc) values(60,'SALES', 'BEIJING');
  5. // 查询原表数据
  6. mysql> select * from dept2;
  7. +--------+------------+----------+
  8. | DEPTNO | DNAME      | LOC      |
  9. +--------+------------+----------+
  10. |     10 | ACCOUNTING | NEW YORK |
  11. |     20 | RESEARCH   | DALLAS   |
  12. |     30 | SALES      | CHICAGO  |
  13. |     40 | OPERATIONS | BOSTON   |
  14. |     60 | SALES      | BEIJING  |
  15. +--------+------------+----------+
  16. // 面向视图删除
  17. mysql> delete from dept2_view;
  18. // 查询原表数据
  19. mysql> select * from dept2;
  20. Empty set (0.00 sec)
  21. // 创建视图对象
  22. create view
  23.     emp_dept_view
  24. as
  25.     select
  26.         e.ename,e.sal,d.dname
  27.     from
  28.         emp e
  29.     join
  30.         dept d
  31.     on
  32.         e.deptno = d.deptno;
  33. // 查询视图对象
  34. mysql> select * from emp_dept_view;
  35. +--------+---------+------------+
  36. | ename  | sal     | dname      |
  37. +--------+---------+------------+
  38. | CLARK  | 2450.00 | ACCOUNTING |
  39. | KING   | 5000.00 | ACCOUNTING |
  40. | MILLER | 1300.00 | ACCOUNTING |
  41. | SMITH  |  800.00 | RESEARCH   |
  42. | JONES  | 2975.00 | RESEARCH   |
  43. | SCOTT  | 3000.00 | RESEARCH   |
  44. | ADAMS  | 1100.00 | RESEARCH   |
  45. | FORD   | 3000.00 | RESEARCH   |
  46. | ALLEN  | 1600.00 | SALES      |
  47. | WARD   | 1250.00 | SALES      |
  48. | MARTIN | 1250.00 | SALES      |
  49. | BLAKE  | 2850.00 | SALES      |
  50. | TURNER | 1500.00 | SALES      |
  51. | JAMES  |  950.00 | SALES      |
  52. +--------+---------+------------+
  53. // 面向视图更新
  54. update emp_dept_view set sal = 1000 where dname = 'ACCOUNTING';
  55. // 原表数据被更新
  56. mysql> select * from emp;
  57. +-------+--------+-----------+------+------------+---------+---------+----
  58. | EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    |
  59. +-------+--------+-----------+------+------------+---------+---------+----
  60. |  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     
  61. |  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     
  62. |  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     
  63. |  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     
  64. |  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     
  65. |  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     
  66. |  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 1000.00 |    NULL |     
  67. |  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     
  68. |  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 1000.00 |    NULL |     
  69. |  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     
  70. |  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     
  71. |  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     
  72. |  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     
  73. |  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1000.00 |    NULL |     
  74. +-------+--------+-----------+------+------------+---------+---------+----
复制代码
多对多,三张表,关系表两个外键!!!!!!!!!!!!!!!
13.3第三范式
  1. 学生编号 学生姓名 联系方式
  2.     ------------------------------------------
  3.     1001        张三        zs@gmail.com,1359999999
  4.     1002        李四        ls@gmail.com,13699999999
  5.     1001        王五        ww@163.net,13488888888
  6.    
  7. 以上是学生表,满足第一范式吗?
  8.     不满足,第一:没有主键。第二:联系方式可以分为邮箱地址和电话
  9. 学生编号(pk) 学生姓名    邮箱地址            联系电话
  10. ----------------------------------------------------
  11. 1001                张三        zs@gmail.com    1359999999
  12. 1002                李四        ls@gmail.com    13699999999
  13. 1003                王五        ww@163.net        13488888888
复制代码
关于三范式的实际使用
数据库设计三范式是理论上的,实践和理论有的时候有偏差。
最终的目的都是为了满足客户的需求,有的时候会拿冗余换执行速度。
因为在sql当中,表和表之间连接次数越多,效率越低。(笛卡尔积)
有的时候可能会存在冗余,但是为了减少表的连接次数,这样做也是合理的,并且对于开发人员来说,sql语句的编写难度也会降低。
面试的时候把这句话说上:他就不会认为你是初级程序员了!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4