Mysql
day01
1.什么是数据库?什么是数据库管理系统?什么是SQL?他们之间的关系是什么?
数据库:
英文单词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语句进行执行,最终来完成数据库的数据管理。
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:
不是王牌电视。
是事务控制语言
包括:
事务提交:commit;
事务回滚:rollback;
DCL:
是数据控制语言。
例如:授权grant、撤销权限revoke….
3.基本构成单元
数据库当中最基本的单元是表:table
任何一张表都有行和列:
行(row):被称为数据/记录。
列(column):被称为字段。
每一个字段都有:字段名、数据类型、约束等属性。
约束:约束也有很多,其中一个叫做唯一性约束,这种约束添加之后,该字段中的数据不能重复。
4.常用命令
登陆:
mysql -uroot -p
退出mysql :
exit
查看mysql中有哪些数据库?
show databases;
选择使用某个数据库:
use ***;
create database ***;
查看某个数据库下有哪些表?
show tables;
查看mysql数据库的版本号:
select version();
查看当前使用的是哪个数据库?
select database();
怎么将sql文件中的数据导入呢?
mysql> source D:\course\03-MySQL\document\bjpowernode.sql (不要有中文)
查看表中的数据:
select * from 表名;
不看表中的数据,只看表的结构,有一个命令:
desc 表名;
查询一个字段:
select 字段名1,字段名2 from 表名;(不区分大小写,字段可以使用数学表达式)(select后面可以跟某个表的字段名(可以等同看做变量名),也可以跟字面量/字面值(数据))
给查询的列起别名?
mysql> select deptno,dname as deptname from dept;(使用as关键字起别名。注意:只是将显示的查询结果列名显示为deptname,原表列名还是叫:dname记住:select语句是永远都不会进行修改操作的,因为只负责查询。如果别名有空格或者是中文的话要加单引号)
条件查询语法格式:
select字段1,字段2,字段3....from表名where条件;条件包括:=, <>, !=, <, <=, >, >=, between ⋯ and ⋯, is null, is not null, and, or, in, not in, like(注意:1.<>, !=等价 2.in不是一个区间。in后面跟的是具体的值。查询薪资是800和5000的员工信息?select ename,sal from emp where sal = 800 or sal = 5000;select ename,sal from emp where sal in(800, 5000); //这个不是表示800到5000都找出来。3.like称为模糊查询,支持%或下划线匹配,%匹配任意多个字符,下划线:任意一个字符。)
查询所有员工薪资,排序:
selectename,salfromemporder bysal; // 默认是升序!!!指定降序:selectename,salfromemporder bysal desc;
数据处理函数:
数据处理函数又被称为单行处理函数
单行处理函数的特点:一个输入对应一个输出。
和单行处理函数相对的是:多行处理函数。(多行处理函数特点:多个输入,对应1个输出!)
常见的单行处理函数:
lower 转换小写mysql> select lower(ename) as ename from emp;upper 转换大写mysql> select upper(name) as name from t_student;substr 取子串(substr( 被截取的字符串, 起始下标,截取的长度))select substr(ename, 1, 1) as ename from emp;concat函数进行字符串的拼接select concat(empno,ename) from emp;length 取长度select length(ename) enamelength from emp;trim 去空格mysql> select * from emp where ename = trim(' KING');round 四舍五入mysql> select round(1236.567, 0) as result from emp; //保留整数位。select round(1236.567, 1) as result from emp; //保留1个小数select round(1236.567, 2) as result from emp; //保留2个小数select round(1236.567, -1) as result from emp; // 保留到十位。rand() 生成随机数mysql> select round(rand()*100,0) from emp; // 100以内的随机数ifnull 可以将 null 转换成一个具体值,ifnull函数用法:ifnull(数据, 被当做哪个值)如果“数据”为NULL的时候,把这个数据结构当做哪个值。补助为NULL的时候,将补助当做0select ename, (sal + ifnull(comm, 0)) * 12 as yearsal from emp;
分组函数(多行处理函数):
5个:count 计数sum 求和avg 平均值max 最大值min 最小值注意:1.分组函数在使用的时候必须先进行分组,然后才能用。如果你没有对数据进行分组,整张表默认为一组。2.分组函数自动忽略NULL,你不需要提前对NULL进行处理。3.分组函数不能够直接使用在where子句中。找出比最低工资高的员工信息。select ename,sal from emp where sal > min(sal);//会报错,解释见分组查询
分组查询(非常重要):
关键字顺序:select...from...where...group by...order by...执行顺序:1. from2. where3. group by4. select5. order by为什么分组函数不能直接使用在where后面?select ename,sal from emp where sal > min(sal);//报错。因为分组函数在使用的时候必须先分组之后才能使用。where执行的时候,还没有分组。所以where后面不能出现分组函数。select sum(sal) from emp;这个没有分组,为啥sum()函数可以用呢?因为select在group by之后执行。在一条select语句当中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数。其它的一律不能跟。使用having可以对分完组之后的数据进一步过滤。having不能单独使用,having不能代替where,having必须和group by联合使用。selectdeptno,max(sal)fromempgroup bydeptnohavingmax(sal) > 3000;
注意:mysql是不见“;”不执行,“;”表示结束!
5.大总结
select...from...where...group by...having...order by...以上关键字只能按照这个顺序来,不能颠倒。执行顺序?1. from2. where3. group by4. having5. select6. order by从某张表中查询数据,先经过where条件筛选出有价值的数据。对这些有价值的数据进行分组。分组之后可以使用having继续筛选。select查询出来。最后排序输出!找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除MANAGER岗位之外,要求按照平均薪资降序排。selectjob, avg(sal) as avgsalfromempwherejob <> 'MANAGER'group byjobhavingavg(sal) > 1500order byavgsal desc;+-----------+-------------+| job | avgsal |+-----------+-------------+| PRESIDENT | 5000.000000 || ANALYST | 3000.000000 |+-----------+-------------+
day02
常用命令(续)
1、把查询结果去除重复记录【distinct】关键字
mysql> select distinct job from emp;// distinct只能出现在所有字段的最前方例:统计一下工作岗位的数量?select count(distinct job) from emp;
2、连接查询
2.1、什么是连接查询?
从一张表中单独查询,称为单表查询。
emp表和dept表联合起来查询数据,从emp表中取员工名字,从dept表中取部门名字。
这种跨表查询,多张表联合起来查询数据,被称为连接查询。
2.2、连接查询的分类?
内连接:
等值连接
非等值连接
自连接
外连接:
左外连接(左连接)
右外连接(右连接)
全连接(不讲)
2.3、当两张表进行连接查询时,没有任何条件的限制会发生什么现象?
select ename,dname from emp, dept;
当两张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是两张表条数的乘积,这种现象被称为:笛卡尔积现象。
如何避免?
连接时加条件,满足这个条件的记录被筛选出来!
selecte.ename,d.dnamefromemp e, dept d //表起别名wheree.deptno = d.deptno; //SQL92语法。
2.4、内连接——等值连接
例:查询每个员工所在部门名称,显示员工名和部门名?
SQL92语法:
selecte.ename,d.dnamefromemp e, dept dwheree.deptno = d.deptno;
sql92的缺点:结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面。
SQL99语法:
selecte.ename,d.dnamefromemp ejoindept done.deptno = d.deptno;
SQL99语法模板:
select...fromajoinbona和b的连接条件where筛选条件
2.5、内连接——非等值连接
例:找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级?
mysql> select * from emp; e+-------+--------+-----------+------+------------+---------+---------+--------+| 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 |....mysql> select * from salgrade; s+-------+-------+-------+| GRADE | LOSAL | HISAL |+-------+-------+-------+| 1 | 700 | 1200 || 2 | 1201 | 1400 || 3 | 1401 | 2000 || 4 | 2001 | 3000 || 5 | 3001 | 9999 |+-------+-------+-------+selecte.ename, e.sal, s.gradefromemp ejoinsalgrade sone.sal between s.losal and s.hisal; // 条件不是一个等量关系,称为非等值连接。+--------+---------+-------+| ename | sal | grade |+--------+---------+-------+| SMITH | 800.00 | 1 || ALLEN | 1600.00 | 3 || WARD | 1250.00 | 2 || JONES | 2975.00 | 4 || MARTIN | 1250.00 | 2 || BLAKE | 2850.00 | 4 || CLARK | 2450.00 | 4 || SCOTT | 3000.00 | 4 || KING | 5000.00 | 5 || TURNER | 1500.00 | 3 || ADAMS | 1100.00 | 1 || JAMES | 950.00 | 1 || FORD | 3000.00 | 4 || MILLER | 1300.00 | 2 |+--------+---------+-------+
2.6、内连接——自连接
例:查询员工的上级领导,要求显示员工名和对应的领导名?
技巧:一张表看做两张表。
selecta.ename as '员工名', b.ename as '领导名'fromemp ajoinemp bona.mgr = b.empno; //员工的领导编号 = 领导的员工编号
2.7、外连接
内连接:A和B连接,AB两张表没有主次关系。平等关系。
内连接的特点:完成能够匹配上这个条件的数据查询出来。
外连接(右外连接):
selecte.ename,d.dnamefromemp eright joindept done.deptno = d.deptno;
right代表将join关键字右边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表。在外连接当中,两张表连接,产生了主次关系。
带有right的是右外连接,又叫做右连接。带有left的是左外连接,又叫做左连接。
任何一个右连接都有左连接的写法。任何一个左连接都有右连接的写法。
2.9、三张表,四张表怎么连接?
语法:
select...fromajoinbona和b的连接条件joincona和c的连接条件right joindona和d的连接条件
一条SQL中内连接和外连接可以混合。都可以出现!
3、子查询?
3.1、什么是子查询?
select语句中嵌套select语句,被嵌套的select语句称为子查询。
3.2、子查询都可以出现在哪里呢?
select..(select).from..(select).where..(select).
4、union合并查询结果集
select ename,job from emp where job = 'MANAGER'unionselect ename,job from emp where job = 'SALESMAN';
注:union在进行结果集合并的时候,要求两个结果集的列数相同
5、limit(非常重要)
5.1、limit作用:将查询结果集的一部分取出来。通常使用在分页查询当中。
百度默认:一页显示10条记录。
5.2、limit怎么用呢?
完整用法:limit startIndex, length
startIndex是起始下标,length是长度。
起始下标从0开始。
缺省用法:limit 5; 这是取前5.
5.3、注意:mysql当中limit在order by之后执行!!
5.4、分页
public static void main(String[] args){// 用户提交过来一个页码,以及每页显示的记录条数int pageNo = 5; //第5页int pageSize = 10; //每页显示10条int startIndex = (pageNo - 1) * pageSize;String sql = "select ...limit " + startIndex + ", " + pageSize;}
6、关于DQL语句的大总结:
select...from...where...group by...having...order by...limit...
执行顺序?
1.from
2.where
3.group by
4.having
5.select
6.order by
7.limit..
7、表的创建(建表)
7.1、建表的语法格式:(建表属于DDL语句,DDL包括:create drop alter)
create table 表名(字段名1 数据类型, 字段名2 数据类型, 字段名3 数据类型);create table 表名(字段名1 数据类型,字段名2 数据类型,字段名3 数据类型);
表名:建议以t 或者 tbl开始,可读性强。见名知意。
字段名:见名知意。
表名和字段名都属于标识符。
7.2、关于mysql中的数据类型?
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:CLOBblob二进制大对象Binary Large OBject专门用来存储图片、声音、视频等流媒体数据。往BLOB类型的字段上插入数据的时候,例如插入一个图片、视频等,你需要使用IO流才行。
7.3、创建一个学生表?
学号、姓名、年龄、性别、邮箱地址
创建表:
create table t_student(no int,name varchar(32),sex char(1),age int(3),email varchar(255));
删除表:
drop table t_student; // 当这张表不存在的时候会报错!// 如果这张表存在的话,删除drop table if exists t_student;
7.4、插入数据insert (DML)
语法格式:
insert into 表名(字段名1,字段名2,字段名3...) values(值1,值2,值3);//一一对应
注意:数据库中的有一条命名规范:
所有的标识符都是全部小写,单词和单词之间使用下划线进行衔接。
7.5、date和datetime两个类型的区别?
date是短日期:只包括年月日信息。
datetime是长日期:包括年月日时分秒信息。
drop table if exists t_user;create table t_user(id int,name varchar(32),birth date,create_time datetime);
mysql短日期默认格式:%Y-%m-%d
mysql长日期默认格式:%Y-%m-%d %h:%i:%s
在mysql当中怎么获取系统当前时间?
now() 函数,并且获取的时间带有:时分秒信息!!!!是datetime类型的。
insert into t_user(id,name,birth,create_time) values(2,'lisi','1991-10-01',now());
7.6、修改update(DML)
语法格式:
update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3... where 条件;
例:
update t_user set name = 'jack', birth = '2000-10-11', create_time = now() where id = 2;
注意:没有条件限制会导致所有数据全部更新。
7.7、删除数据 delete (DML)
delete from 表名 where 条件;//语法格式注意:没有条件,整张表的数据会全部删除!delete from t_user where id = 2;insert into t_user(id) values(2);delete from t_user; // 删除所有!
day03
1.常用命令(DML语句)
1、insert语句插入多条记录
insert into t_user(id,name,birth,create_time) values(1,'zs','1980-10-11',now()),(2,'lisi','1981-10-11',now()),(3,'wangwu','1982-10-11',now());
2、快速创建表(表的复制,将一个查询结果当作一张表新建)
create table emp2 as select * from emp;create table mytable as select empno,ename from emp where job = 'MANAGER';//部分查询结果
3、快速删除表中数据(大表删除)
delete from dept_bak; //delete删除较慢,删除时空间不释放,可以支持回滚truncate table dept_bak;//快,物理删除,无法回滚
drop是把表删除,不是删除表中数据
4、表结构修改 较少(DDL语句)
实际开发中,需求确定后很少修改表结构,而且可以使用工具
2.约束
1、What is constraint?
创建表时对字段添加约束,以保证表中数据的完整性、有效性
约束包括
a) 非空约束, not null
b) 唯一约束, unique
c) 主键约束, primary key
d) 外键约束, foreign key
e) 自定义检查约束, check (不建议使用 在 mysql 中现在还不支持)
a) 非空约束,not null
drop table if exists t_vip;create table t_vip(id int,name varchar(255) not null);
b) 唯一约束, unique
create table t_vip(id int,name varchar(255) unique //name字段不能重复,列级约束email varchar(255) unique);
联合唯一:
drop table if exists t_vip;create table t_vip(id int,name varchar(255),email varchar(255),unique(name,email) // 表级约束);
注:not null和unique可以合起来使用,name varchar(255) not null unique
mysql中,该字段会变成主键
c) 主键约束, primary key
主键值是每一行记录的唯一标识,相当于身份证号
任何一张表都应该有主键
主键不能为空且不能重复
create table t_vip(id int,primary key(id), //表级约束//列级约束id int primary key,name varchar(255));
实际开发中不建议使用复合主键
建议使用定长数据类型作为主键值
d) 外键约束, foreign key
外键主要是维护表之间的关系的,主要是为了保证参照完整性,如果表中的某个字段为外键字段,那么该字段的值一般来源于参照的表的主键,至少要有unique约束。
create table t_class(classno int primary key,classname varchar(255));create table t_student(no int primary key auto_increment,name varchar(255),cno int,foreign key(cno) references t_class(classno));
测试:外键值可以为NULL
3.存储引擎
1.What is
存储引擎是表存储/组织数据的方式,数据库中的各表均被(在创建表时)指定的存储引擎来处理。
2.在建表时可以指定存储引擎:
CREATE TABLE `t_student` (`no` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`cno` int(11) DEFAULT NULL,PRIMARY KEY (`no`),KEY `cno` (`cno`),CONSTRAINT `t_student_ibfk_1` FOREIGN KEY (`cno`) REFERENCES `t_class` (`classno`)) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
在最后用ENGINE指定存储引擎,CHARSET指定字符编码方式。
3.mysql版本支持的存储引擎
mysql> select version();+-----------+| version() |+-----------+| 5.5.36 |+-----------+mysql> show engines \G*************************** 1. row ***************************Engine: FEDERATEDSupport: NOComment: Federated MySQL storage engineTransactions: NULLXA: NULLSavepoints: NULL*************************** 2. row ***************************Engine: MRG_MYISAMSupport: YESComment: Collection of identical MyISAM tablesTransactions: NOXA: NOSavepoints: NO*************************** 3. row ***************************Engine: MyISAMSupport: YESComment: MyISAM storage engineTransactions: NOXA: NOSavepoints: NO*************************** 4. row ***************************Engine: BLACKHOLESupport: YESComment: /dev/null storage engine (anything you write to it disappearsTransactions: NOXA: NOSavepoints: NO*************************** 5. row ***************************Engine: CSVSupport: YESComment: CSV storage engineTransactions: NOXA: NOSavepoints: NO*************************** 6. row ***************************Engine: MEMORYSupport: YESComment: Hash based, stored in memory, useful for temporary tablesTransactions: NOXA: NOSavepoints: NO*************************** 7. row ***************************Engine: ARCHIVESupport: YESComment: Archive storage engineTransactions: NOXA: NOSavepoints: NO*************************** 8. row ***************************Engine: InnoDBSupport: DEFAULTComment: Supports transactions, row-level locking, and foreign keysTransactions: YESXA: YESSavepoints: YES*************************** 9. row ***************************Engine: PERFORMANCE_SCHEMASupport: YESComment: Performance SchemaTransactions: NOXA: NOSavepoints: NO
1⃣️MyISAM 存储引擎
• MyISAM 存储引擎是 MySQL 最常用的引擎。
• 它管理的表具有以下特征:
– 使用三个文件表示每个表:
• 格式文件 存储表结构的定义( mytable.frm)
• 数据文件 存储表行的内容( mytable.MYD)
• 索引文件 存储表上索引( mytable.MYI)
– 灵活的 AUTO_INCRE MENT 字段处理
– 可被转换为压缩、只读表来节省空间
2⃣️InnoDB 存储引擎
默认,重量级存储引擎,支持事务,支持数据库崩溃后自动恢复机制
安全
3⃣️MEMORY 存储引擎
数据存储在内存中,且行的长度固定
优点:查询效率最高;缺点:不安全,关机后消失
4.事务
1.What is transaction
一个事物——一个完整的业务逻辑
2.只有DML语句才会有事务:insert, delete, update
3.用日志文件记录事务性活动,在提交事务后清空日志文件,将数据持久化到数据库表中。回滚事务标识将之前所有DML撤销,并清空日志文件。
4.提交 commit; 回滚 rollback;
mysql默认自动提交,每执行一个DML就提交,可以关闭:
start transaction;
5.特性(ACID)
原子性、一致性:同一个事务中所有操作必须同时成功或同时失败、隔离性:不同事务之间隔离、持久性
4个隔离级别:
1⃣️读未提交:read uncommitted
事务A可以读取到事务B未提交的数据(dirty read)
2⃣️读已提交:read committed
事务A可以读取到事务B已提交的数据
可以读到真实的数据,解决脏读,但不可重复读取数据
oracle数据库默认隔离级别
3⃣️可重复读:repeatable read
会出现幻影读,永远读取到的都是刚开启事务时的数据
mysql默认的隔离级别
4⃣️序列化:serializable
最高隔离级别,事务排队,不能并发
set global transaction isolation level read uncommitted;
day04
1.索引
- what is
索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制。
MySQL在查询方面主要就是两种方式:全表扫描第和根据索引检索。
索引是一个单独的对象,不同的存储引擎以不同的形式存在。
索引在mysql当中都是一个平衡二叉树的形式。 - 创建索引
创建索引:
mysql> create index emp_ename_index on emp(ename);给emp表的ename字段添加索引,起名:emp_ename_index
删除索引:
mysql> drop index emp_ename_index on emp;将emp表上的emp_ename_index索引对象删除。
- 怎么查看一个SQL语句是否使用了索引进行检索?
explain
mysql> create index emp_ename_index on emp(ename);mysql> explain select * from emp where ename = 'KING';+----+-------------+-------+------+-----------------+-----------------+---------+-------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-------+------+-----------------+-----------------+---------+-------+------+-------------+| 1 | SIMPLE | emp | ref | emp_ename_index | emp_ename_index | 33 | const | 1 | Using where |+----+-------------+-------+------+-----------------+-----------------+---------+-------+------+-------------+
- 索引失效的情况
1⃣️模糊匹配当中以“%”开头
2⃣️使用or的时候会失效,如果使用or那么要求or两边的条件字段都要有索引
3⃣️使用复合索引的时候,没有使用左侧的列查找,索引失效
create index emp_job_sal_index on emp(job,sal);explain select * from emp where job = 'MANAGER';//okexplain select * from emp where sal = 800;//失效
4⃣️在where当中索引列参加了运算,索引失效
5⃣️在where当中索引列使用了函数
2.视图(view)
- what is view
站在不同的角度去看待同一份数据 - 创建、删除视图
create view dept_view as select * from dept;//只有DQL语句才能以view的形式创建drop view dept_view;
注意:我们可以面向视图对象进行增删改查,对视图对象的增删改查,会导致原表被操作!
- 作用
方便,简化开发,利于维护
面向视图开发
视图不是在内存当中,视图对象也是存储在硬盘上的,不会消失。
3.DBA常用命令
数据导出(windows的dos命令窗口中):
mysqldump bjpowernode>D:\bjpowernode.sql -uroot -p123456mysqldump bjpowernode emp>D:\bjpowernode.sql -uroot -p123456//导出指定表emp
数据导入
登录到mysql数据库服务器
—> 创建数据库:create database bjpowernode;
—> 使用数据库:use bjpowernode
—> 初始化数据库:source D:\bjpowernode.sql
4.数据库设计三范式
第一范式:要求任何一张表必须有主键,每一个字段原子性不可再分。
第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键,不要产生部分依赖。
第三范式:建立在第二范式的基础之上,要求所有非主键字段直接依赖主键,不要产生传递依赖。
- 第一范式
最核心,最重要的范式,所有表的设计都需要满足。必须有主键,并且每一个字段都是原子性不可再分。 - 第二范式
学生编号+教师编号(pk) 学生姓名 教师姓名
1001 001 张三 王老师
1002 002 李四 赵老师
1003 001 王五 王老师
1001 002 张三 赵老师
不满足,“张三”依赖1001,“王老师”依赖001,显然产生了部分依赖。
多对多的关系(多个老师对应多个学生),建立三张表——学生表、教师表、学生教师关系表(关系表加两个外键) - 第三范式
学生编号(PK) 学生姓名 班级编号 班级名称
1001 张三 01 一年一班
1002 李四 02 一年二班
1003 王五 03 一年三班
1004 赵六 03 一年三班
一年一班依赖01,01依赖1001,产生了传递依赖。不符合第三范式的要求。产生了数据的冗余。
一对多关系(一个班级对多个学生),两张表——班级表、学生表,多的表加外键
4.表的设计总结
一对多:
一对多,两张表,多的表加外键
多对多:
多对多,三张表,关系表两个外键
一对一:
一对一,外键唯一
