数据库初步笔记
1:数据库概述:
1.1:数据库(DataBase)/DB
按照一定格式存储数据的一些文件组合,存储数据的仓库实际上是一堆文件存储了具有特定格式的数据。
1.2:数据库管理系统(DateBaseMangagement)/DBMS
专门管理数据库中数据,数据库管理系统可以对数据当中的数据进行增删改查。
1.3:结构数据化查询语言(SQL)
需学习sql并编写,之后DBMS负责执行sql,最终完成数据库增删改查。(主学sql语句,sql在mysql可用,同时Oracle也能用,DB也能用)
关系:DBMS--->SQL----->DB
2.1:退出mysql:exit。
查看mysql中有哪些数据库?
以分号结尾,分号是英文分号;
mysql > show databases;
怎么选择使用某个数据库?
mysql > user test;
Databases changed
z怎么创建一个数据库?
mysql > create database bjpoweernode;
3:SQL分类:(DQL,DML,DDL,TCL,DCL
DQL:数据查询语言凡是带有select关键字都是查询语言。
DML:数据操作语言(凡是对表中数据进行增删改查就是DML),
(insert ,delete,update)
DDL:数据定义语言
主要操作表结构,不是表数据(create ,drop,alter)。
TCL:事务控制语句
事务提交:commit ,事务回滚:rollback。
DCL:数据控制语言
授权:grant ,撤销权限:revoke。
6:导入演示数据
假设有个数据库表(mysql > source +一个没有中文的路径)。
7:怎么查看表中数据?
select * from 表名。
8:查看表数据
mysql:desc(descride) 表名
只看表结构(得到表数据结构(int double varchar))
9:mysql常用命令(不见;不执行)
select version();得到mysql版本号
查询当前使用数据库(select database();)
注意:\c用来终止命令输出。
10:简单查询
怎样查询一个字段?
select 字段名 from 表名;
select和from都为关键字,字段名和表名都为标识符。
强调:对SQL语句来说不区分大小写。
11:查询多个字段
使用逗号隔开“ , ”
例:select a,b,c, from dept;
怎么查询所以字段?
1:第一种方式用逗号的方式将所以字段写上。
2:select * from dept;都读取出来,效率低,可读性低。
12:给查询的类起名字
mysql > select deptno,donane as deptname from dept;
用as将dname改为deptname(as可以省略)
13:mysql > select deptno ,dname dept name from dept;
这里将会报错,可以加' '或者" "。
注:在所以数据库中,字符串统一使用单引号,单引号为标准,双引号oracle 数据库用不了但在mysql能用。
14:列参与数学的远算
mysql > select ename ,sal*12 from emp;
(字段名可以使用数学表达式)
mysql > select ename ,sal*12 as yearsal from emp;
将sal*12改为年薪
mysql > select ename ,sal*12 as '年薪' from emp;
将sal*12改为字段‘年薪’。
15:条件查询(不是将表所以数据都查出来,是查询出来符合条件的)
语法格式:select 字段名1,字段名2 where 条件;
1: = 等于:select empno,ename from emp where sal=800;
2:<>或!=:select empno,ename from emp where sal!=800;
3: <小于:select empno,ename from emp where sal<800;
4 :between....and...两个值之间,等同于>= and =<
select empno,ename ,sal from emp where sal>=80<=89;
select empno,ename from emp where sal between 8 and 9;
5 : is null为null(is not null 不为空)
注:数据中null不能使用等号进行衡量,需要is null
因为数据库中null代表什么都没有,不是一个值,不能使用等号衡量。
select empno,ename ,comm from emp where comm is not null ;
6: and并且
select empno,ename sal ,job
from
emp
where
job = 'M' and sal > 2500;
7: or或者
select empno,ename sal ,job
from
emp
where
job = 'M' or 'L';
注:and或者or同时出现优先级?
and和or的优先级and比or更高,如果想要or优先于and就加小括号()。
8: in 包含,相当于多个or(not in不在这个范围中)
select empon,ename,job form emp job = 'M'or'' job = 'L',
select empon,ename,job form emp job in('M','L'),
注:in不是一个区间,in查询的是一个具体值。
9:模糊查询
like :称为模糊查询,支持%或下划线匹配
%匹配任意多个字符,c%是一个特殊的符号,_也是一个特殊符号。
select ename from emp where ename like '%O%';
select ename from emp where ename like '%O';
select ename from emp where ename like '_ _O%';
想查表中带'_'的 like'%_%'加一个转义字符.
10:排序(order by:对查询结果进行排序)
select ename,sal from emp order by sal ase(不加ase默认升序),sal desc进行降序。
多行字段进行排序:直接在order by中进行(sal ase,ename ase)它会sal起主导作用,只有sal相等时,才会考虑ename。
11:单行处理函数(特点:一个输入对应一个输出)
多行处理函数(特点:多个输入对应一个输出)
单行处理函数有哪些?
(lower:输小写)(upper:输大写)
select lower(ename) as ename from emp;
select lupper(ename) as ename from emp;
(stbstr:取字符串)(被截取的字符串,起始下标,截取长度)
select stbstr(ename,1,1) as ename from emp;
conctat(函数进行字符串拼接)
select concat(ename,ename) as ename from emp;
trim(去空格)
select * from emp where ename = ' K';
round(四舍五入)
select round(1224.342,0) from emp;//保留整数位
select 'abc' from emp;//后面直接加“字面值”
可能会输出14个abc的值
结论:select后面可以跟某个字段名(可以等同看做变量名)
也可以跟字面量/字面值.
rand(获取随机数)
select round(rand()*100,0)from emp;
先生成100以内的随机数,在用rand()取整。
ifnull(可将null转换为一个具体的值)
注:ifnull为空处理函数,专门处理空,在所以数据库中只要有 null参与,结果就为null。
select ename,sal+comm as salcomm from emp;//结果为空
select ename,ifnull(sal+comm) as yearsal from emp;
将null转换为0。
case...when...then...when...then...else...and
当员工工作岗位是M时工作上调10%,当为D是工资上调20%
(注:不修改数据库,只是查询结果显示工资上调)
select ename,job,sal,case job when 'M' then sal*1when 'S'
then sal*2 else sal end from emp;
16:分组函数(多行处理函数)特点:输入多行,输出一行。
注:分组函数使用时,必须先进行分组,然后才能用,如果没有将数据进行分组,整张表默认为一组。
count(计数)(默认整张表被分为一组且省略)
mysql > select count(ename) from emp;
avg(平均)
mysql > select avg(sal) from emp;
sum(求和)
mysql > select sum(sql) from emp;
min(最小值)
mysql > select min(sal) from emp;
max(最大值)
mysql > select max(sal) from emp;
17:分组函数在使用的时候需要注意什么?
17.1:分组函数自动忽略null,不需要提前对null进行处理;
17.2 : count(具体字段)表示统计该字段下所有的不为null的元素的总数;
17.3:分组函数不能直接使用where语句中;(where执行还没分组)
17.4:所有函数可以组合使用。
18:分组查询重要(五星)**
应用中必须先分组,然后对每一组的数据进行操作。
select from group by
关于关键字的书写循序:select from where group by order by having。
关于关键字执行循序:from where group by select order by having。
求每一个工作岗位的工资和?
select job ,sum(sal) from emp group by job;
解析:在一条select语句中,如果group by语句的话,select后面只能跟:参加分组的字段(job),以及分组函数(sum(sal))。
找出部门的最高薪资?
select no,max(sal)from emp group by no;
按每一个部门,不同工作岗位的最高薪资?
select no ,job ,max(sal)from emp group by no,job;
找出每个部门最高薪资,要求显示最高薪资大于3000的?
select no max(sal)from emp group by no having max(sal) > 3000;
引出having对已分完组之后的数据进行过滤,having只能和group by联合使用。
select no,max(sal)from emp where sal>3000 group by no;
优化策略:where和having优先选择where,where实在不行就选h
当where没办法如下:(直接where并没有分组求平均)
找出部门平均薪资,显示平均薪资高于2500的?
select no,avg(sal) from emp group by no having avg(sal>2500);
19:单表查询总结:
先经过where条件筛选出有价值的数据对这些有价值数据进行分组,分组之后使用having继续筛选,select查询出来,最后进行排序输出。
找出每一个岗位的平均工资,要求显示平均薪资大于2500的除M岗位之外,要求按照平均薪资进行降序?
select job avg(sal)
from emp
where avg(sal)<>M
group by job
having avg(sal)>1500
order by desc;
20:distinct关键字:
查询结果去除重复记录,注:原表的数据不会改变,只是查询结果去重。
distinic出现在job,deptno两个字段之前,表示两个字联合起来去重(出现在所以字段最前面)。
21:连接查询概述(超级重要)
一张表查询叫单表查询,
两张表一起查询,从emp中得到名字,dept表中取部门名字
这种跨表查询,多张表联合查,连接查询。
连接查询又分为内连接和外连接,(关键字内:inner,外:left,right)
内连接:等值连接,非等值连接,自连接
外连接:左外连接,右外连接,全连接
笛卡尔积现象:(两表查询,无条件限制,结果为两张表乘积)
一个A表中有14条记录,B表中有4条记录,A表中数据会和B表中所
有数据进行匹配但是如果加条件限制查询数据显示会降为14条但是还是对比了56次。
内连接之等值连接:
查询查询员工所以部门名称,显示员工名和部门名?
select e.ename,d.dept from empe join dept d on e.deptno=d.deptno(这里的筛选条件相等,所以叫等值连接);
优点:表连接的条件是独立的,连接之后,连接之后如果需要进一步筛选在往回加where加条件。
内连接之非等值连接:
找出每个员工薪资等级,要求显示员工名,薪资,薪资等级?
select
e.ename,e.sal,s.salgade
from
emp e
join
salgade
on
e.sal between s.losal and s.hisal(条件并不相等所以叫非等值);
内连接之自连接:(技巧将一张表看成两张表)
查询员工的上级领导,要求显示员工名和对应的领导名?
select
e.ename,d.ename
from
emp e
join
emp d
on
e.mgr = b.empno(员工的领导编号=领导的员工编号);
外连接:(在内连接基础上加一个left或者right)(有主次)
想将匹配的查出,也想将不匹配的查出用外连接
如果想将数据都查询出来则emp做为主表。
select
e.ename,d.ename
from
emp e
right join(以右表作为主表,捎带查出左表)
dep d
on
e.mgr = b.empno(员工的领导编号=领导的员工编号);
外连接查询结果条数一定为 >= 内连接查询结果条数
三张表的连接:
语法:
select from a join b on a和b的条件 join c on a和c条件 join d on a和d的条件
案例:
找出每一个员工的部门名以及工资等级,要求显示员工名,部门名,薪资,薪资等级
select
e.ename,e.sal,s.salgrad,d.dname
from
emp e
join
dept d
on
e.eno= e.no
join
salgrad s
on
e.sal between 高 and 低
left join
e.mgr = b.empno.
22:子查询:(select中嵌套select,被嵌套的select叫子查询)
where中的子查询:(例:找出最低工资的员工的姓名和工资)
1:select min(sal) from emp;(先找出最低工资)
2:select ename,sal from emp where sal > 800;(员工工资大于800的)
3:select ename,sal from emp where select min(sal) from emp;
from中子查询:(找出每个岗位的平均工资的工资等级)
1:select job,avg(sal) from emp group by job;(分组并且找出平均工资)
2:select * from salgrade;(上面作为表t)
3:select
t.*,s.grade
from
(select job,avg(sal) from emp group by job) t
join
salgrade s
on
t.between s.losal and s.hisal;
23:union的用法(合并查询结果集)
select ename,job from emp where job='M' or job='S';(查区间)
select ename,job from emp where job in('M','S');(查准确的值)
select ename,job from emp where job = 'M'
union
select ename,job from emp where job = 'S';
union效率更高,对表来说每一次连接一张新表会造成笛卡尔现象,成倍翻,但union可以减少匹配次数,在减少匹配次数的同时,完成结果集的拼接。(不使用union时匹配乘法,加了就将成为加法)
注:进行结果集合并时,要求两个结果集列数相等和数据类型相等。
24:limit概述:(取一部分数据)
limit是将查询结果集的一部分取出来,通常使用在分页查询中,
作用:提升体验,全查,用户体验差。
完整用法:(limit startIndex (开始下标),length(长度))
分页:(limit(pageNO—1)*pagesize,pageSize);
25:表创建(建表)
create table 表名(
字段名1 数据类型
字段名2 数据类型
字段名3 数据类型
);
varchar(姓名):可变长度字符串,节省空间,根据长度分配空间
优:节省空间 ,缺:动态分配空间,速度慢
char(255)(性别):定长字符串,分配固定的长度
int(最长11):数字中的整数型
bigint:数字中长整型,等同于java中long
float:单精度浮点数据
double:双精度浮点数据
datetune:长日期类型
clob:字符大对象最多可以存储4G的字符串,(超过255的)
blob:二进制大对象,专门存储图片,声音,视频往BLOB插入后,需要使用IO流。
删除表:drop table t_student ;
判断这张表是否存在就删除:drop table if exists t_student;
insert(DML语句):
insert into 表名 (字段名1,字段名2.....)
values(1,2,3);
字段名一一对应,(数量要对应,数据类型要对应)
注:insert语句
但凡执行成功,那么必然会多一条记录没有给其他字段指定值的话就是null。
default:指定默认值
insert插入日期:(其实只要遵循%Y,%M,%D就不要使用这些)
数据格式化:format
str_to_date:将字符串varchar类型转换为date类型
date_format:将date类型的转换为具有一定格式的varchar字符串类型
mysql中now()函数,可获取当前系统时间。
update语句(改):
格式:update 表名 set 字段名=值1,字段名=值2...'where 条件';
注:如果你不加条件限制导致数据都更新。
delete(语句):
语法格式:delete from 表名 where 条件
注:如果没有条件限制将所以数据都删除。
快速创建表:(本质就是将表复制)
create table emp2 as select * from emp;
查询结果插入一张表:
insert into dept_bak select * from dept;
delete语句删除数据原理?(原理属于DML语句)
表中的数据被删除了,但是这个数据在硬盘的真实存储空间不会被释放
删除缺点:删除的效率比较低
删除优点:支持回滚,想找回数据可使用回滚。
truncate语句原理?(用法:truncate table dept)
效率高,表被一次截断,物理删除
缺点:不支持回滚
优点:快速
对表结构的增删改?
DDL:create(增) drop(删) alter(改)
(注:drop table 表名;//不是删表数据,就是把表删除了)。
26约束概述(constraint)保证数据有效:**
创建表时,可以给表中字段加上一些约束,来保证这个表中数据的完整性,有效性。
约束有哪些?(约束加后面叫:列级约束 约束加前面:表级约束)
not null(非空约束),unique(唯一性约束),primary key(主键约束简称pk),foreign key(外键约束简称fk),
not null:非空约束约束的字段不能为null。(只有列级约束才有表级约束)
unique(唯一性约束 给多个字段添加唯一性使用表级约束):唯一性约束的字段不能重复,但可为null
not null和unique联合使用!!(被同时使用自动变成主键字段)
create table t_vip(
id int;
name varchar(255)not null unique
);
错误:name不能重复,也不能为null。
27,主键的概述(primary key):
主键约束,主键字段,主键值
作用:一行记录的唯一标识,一行记录的身份证号。
注:任何一张表都应有主键,没有主键表无效!!!
主键特征:not+unique(主键值不能为null,同时也不能重复)
主键值建议:(int,bigint,char,等类型)
不建议使用:varchar来作为主键,主键一般为数字,一般为定长
自然主键:主键值是一个自然数,和业务无关!!
业务主键:主键与业务紧密联系,例如:银行卡账号作为主键值
(实际开发中自然主键多,主键只要不重复即可,不需要有意义一旦与业务挂钩当事务发生变动时,影响主键值!!)
anto_increment(自增)
drop table if exists t_vip;
create table t_vip(
id int primary auto_increment,//auto_increment表示自增
name varchar(255)
);
insert into t_vip(name) values('ylc');
insert into t_vip(name)values('ylc');
insert into t_vip (name) values('ylc');
28.外键约束(foreign key**重点):
classno classname(t_class)
101 平江
102 岳阳
no name (fk) con(t_student)
1 y 101
2 l 101
3 c 102
4 z 102
总结:当con字段没有任何约束时,可能导致数据无效,可能导致输错一个103,但103不存在,所以为保证con101,102,需要给con字段添加一个外键约束。(con为外键字段,con字段每一个值都为外键值)
代码实现:
create table t_class (
classno int primary key,
classname varchar(255),
);
create table t_student(
no int auto_increment;(自增)
name varchar(255)
foreign key(no) references t_class(classno)
(以class中classno为主,以student中con为外)
);
insert into t_class(classno,classname) t_class(101,'平江');
insert into t_student(no,name,con) t_student(102,'岳阳');
---------------------------------------------------------class中数据
insert into t_student(name,con) values('y',101);
insert into t_student (name,con) values ('l',101);
insert into t_student(name,con) values('c',102);
思考:子表当中的外键引用父表中某个字段时,被引用这个字段必为主键吗?
不一定,但一定具有唯一性(外键值可以为null)。
29.存储引擎:(show engines\G查询存储引擎)9
存储引擎是mysql中特有的术语,oracle中没有,实际上存储引擎就是一个表的存储方法。(可以在建表时给表指定存储引擎)。
结论:mysql默认存储引擎为INNODB;
默认字符编码方式:utf-8。
create table t_product(
id int primary key;
name varchar(255)
)engine = INNODB default charset = utf8;
常用的存储引擎?
(不支持事务,安全性低)
myISAM存储引擎特点:可转换为压缩,只读表来节省空间。
(支持事务,但效率低,不能压缩不能转换只读,不能节省空间)
INNODB存储引擎特点:安全,支持事务,上面的不能实现。
()
MEMORY特点:(之前叫HEAP引擎)
优点:查询效率是最高,不需要和硬盘交互。
缺点:不安全,关机之后数据丢失,因为数据和索引都在内存中。
30.事务(重点):
什么是事务?
一个事务就是一个完整的业务逻辑,最小的工作单位,不可再分。
什么是完整的业务逻辑?
假设转账,从A账户向B账户转1000
A账户的钱减去1000(upddate)语句
B账户的钱增加1000(update)语句
这就是一个完整的业务逻辑。
注:以上操作是一个最小的工作单位,要么同时成功,要么同时失败,不可在分这两个update语句要求必须同时成功或同时失效。
事务有关的DML语句(数据安全第一位):
insert ,update,delete只有这三个语句与事务有关。
因为以上的三个语句是数据库中数据进行增删改的要考虑安全。
怎么去理解事务?
假设所以事务,只有一条DML就完成,就没有必要存在事务机制正因为做某件事时,需要多条DML语句共同联合起来才能完成所以需要事务机制存在。如果任意一件复杂的事都能通过一条DML语句完成,则事务就没有存在的价值。
事务本质:一个事务就是多条DML语句同时成功或同时失败的
事务如何实现?
INNODB存储引擎:提供一组用来记录事务性活动的日志文件
事务开启:
insert
insert
update
update
事务结束。
在事务的执行中,每条DML的操作都会记录到事务性活动日志文件中在执行中提交事务,回滚事务。
提交事务:清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中,标准着事务的结束并且是一种全部成功的结束。
回滚事务:将之前所以DML操作全部撤销并且清空事务性活动的日志文件回滚事务标志着,事务结束,这是一种全部失败的结束。
怎么提交,怎么回滚?
提交事务:commit 语句
回滚事务:rollback;(回滚只能回滚到上一次提交点!)
事务对应的单词(transaction):
测:mysql中默认的事务行为是怎么样的?
mysql默认情况下支持自动提交事务的。
什么是自动提交?
每执行一条DML语句,就执行一次。
不符合开发,因为业务通常通过多条DML语句共同执行,为保证数据的安全,必须同时成功在提交,所以只执行一条。
怎么将mysql自动提交机制关闭掉?
start transaction
提交事务代码实现!!
select * from dept_bak
start transaction
insert into dept_bak values(30,'abc','bj');
insert into dept_bak values(30,'abc','bj');
commit;
select * from dept_back
rollback;
select * from dept_back;(一种有结果成功的结束)。
回滚事务代码实现!!!!!
select * from dept_back;
start transaction (关闭自动提交)
insert into dept_back values(10,'abc','bj');
insert into dept_back values(20,'abc',''bj);
select * from dept_back;
rollback;
select * from dept_back;(一种没有结果失败的结束)。
事务特征:A,C,D,I
A:原子性
说明事务是最小的工作单位不可再分。
C:一致性
所以事务要求,在同一事务中所以操作必同时成功或同时失败。
D:持久性
事务最终结束的一个保障,事务提交,将没有保存到硬盘上的数据保存到硬盘上,
I:隔离性
A事务和B事务之间有一定的间隔,房间与房间有墙,墙就是隔离性。
事务隔离级别:(读已提交,读未提交,可复读性,序列化)
-
读未提交:(read uncommitted)
脏读现象(Dity Read)脏数据
这种隔离一般为理论,大多数剧库以二级起步
事务A可以读取到事务B的未提交的数据。
2.读已提交:(read committed)读到的数据绝对真实
不可重复读取数据
事务开始后,第一次读为3条,当事务还没结束后,可能第二次读取时读到4条数据,3不等于4称为不可重复读。
事务A只能读取到事务B已提交的数据
3.可复读性(repeatable read)
提交了也读不到,永远读取的都是刚开启事务的数据。
可以解决不可重复读取,可能出现幻影读。
每一次读到的数据都为幻影不真实,早上9点只要事务不结束,读到晚上9点还是一样数据,假象不够真实。
序列化/串行化:(serialiable最高隔离级别)
这是最高的隔离级别,效率最低解决所以问题,表示事务排列,不能并发(与synchronized线程同步相似)事务同步。
31什么是索引?**
索引是在数据库表的字段上添加的,是一种为提高查询效率的一种机制一字段可添加一个索引,多个字段联合起来,相当于书目录,缩小扫描范围。
查询数据两种方式:1,全表扫描,2,索引检索
select * from t_user where name= 'jack';会去name上扫描因为查询结果为name= 'jack';
如果没有给name创建索引,mysql进行全扫描,会将数据全部比对一遍。
在mysql中数据库当中索引也需要排序,并且这个索引的排序和Treeset数据结构相同,Treeset(TreeMap)底层是一个自平衡的二叉树在mysql中是一个B-Tree数据结构。
(遵循左小右大原则存放,采用中序遍历方式遍历数据)
索引的实现原理!!!!!!!!!!!!
ID NAME (每一行记录在硬盘上都有一个物理编号)
100 Z OX1111
120 Y OX2222
99 W OX3333
88 Z OX4444
101 J OX5555
55 L OX6666
130 T OX7777
注:主键自动添加索引对象,id字段自动有索引,因为id是PK,另外mysql中,一个字段上有unique的话自动创建。
注:在任何数据库中,任何表的任何一条数据记录在硬盘存储都有一个硬盘的物理存储编号。
注:索引是一个单独的对象在myISAM存储引擎中,在MYI文件中在INNODB存储引擎在tablespace中,在MEMORY存储,引擎在mysql中都有一个树的形式存在(自自平衡二叉树:B-Tree)。
IDIndex(id字段的索引对象) !!!!!!!!!!!
select * from t_user where id=101;
mysql发现在id字段上有索引对象,会通过索引对象IdIndex查找。
通过idIndex索引对象定位到:101(缩小扫描范围,快速定位)
通过101物理编号:ox5555此时sql转换
select * from t-user where 物理编号 = ox5555.
mysql中主键上以及unique字段上自动添加索引!!
什么情况下考虑给字段添加索引???
1:数据庞大(每个硬件环境不同,具体问题具体分析);
2:该字段出现在where后面,以条件形式存在,也就是说字段总是被扫描;
3:该字段的DML(insert,delete,update)操作,因为DML之后索引需要重排,建议不要随意加索引,因为索引也要维护,太多会降低系统的性能,建议通过主键查询通过unique约束字段进行查询,效率比较高。
索引的创建,索引的删除???
创建索引!!
mysql>create index emp_ename_index on emp(name);
给emp表的ename字段添加索引起名emp_ename_index
删除索引!!
mysql>drop index emp_ename_index on emp;
将emp表中的emp_ename_index索引对象删除。
在mysql中,怎么查看一个SQL语句是否使用索引进行检索?
explain select * from emp where ename='KING';
rows会显示数字表达所否索引了(type = ALL)全扫
索引失效!!!!!
1:select * from emp where ename like'%T';
模糊匹配中以%开头,尽量避免模糊查询的时候以%开始(优化手段)
2:explain select * from emp where ename = 'KING'or'MA';
使用or是会失效,使用or要求两边都有索引,如果其中一个没有则另外一个也实现不了,所以不建议使用or。
3:使用复合索引时,没有使用左侧的列查找,索引失败
(左边的job可以但sal不行)
4:where当中索引列参加远算,索引失效
explain select * from emp where sal+1 = 800;
5:在where中索引使用函数
explain select * from emp where Lower(ename) = 'smieh';
索引的分类!!!!!!
单一索引:一个字段上添加索引。
复合索引:两个字段或更多字段添加索引
主键索引:主键上添加索引
唯一性索引:具有unique约束的字段上添加索引
注:唯一性越高,索引功能越大。
32.视图的概述(view)!!!!!!
view:站在不同角度看同一数据。
怎么创建视图对象,怎么删除视图对象?
create view_dept_view as select * from dept ;(创建)
drop view dept_view;(删除)
注:只有DQL语句才能view的形式创建
create view view_name as 必须为DQL语句
用视图做什么?
对视图对象增删改查会导致原表被操作,
特点:通过对视图的操作,会影响到原表数据。
一条复杂的sql语句反复使用,可以以视图的形式创建可直接使用视图对象,简化开发,利于后期维护,只需要修改视图对象所映射的SQL语句。使用视图可像table一样,可以对视图进行增删改查,视图不在内存中,也是存在内存中不会消失。
增删改查又叫CRUD.
DBA命令:
重点掌握:数据的导入和导出
数据导入?(window的命令dos命令窗口下)
mysql dump bjpowernod emp >一个路径
数据导出?
创建数据库:create datebase bjpowernode
使用数据库:use bjpowernode
初始化:source D:\bjpowernode.sql
33.数据库三范式:
数据库表的设计依据,教你怎么进行数据库表的设计。
1:要求任何一张表必须有主键,每一个字段原子性不可在分。
2:建立在第一范式的基础上,要求所以非主键字段完全依赖主键不要产生部分依赖。
3:建立在第二范式上,要求所有非主键字段直接依赖主键,不要产生传递依赖。
数据库第一范式:
最核心最重要的范式,所以设计都需要满足。
必须与主键,并且每一个字段都有原子性不可再分。
学生编号 学生姓名 邮箱地址 联系电话
101 zx zx@1234.com 2424213412
102 zy zy@1232.com 3224353425
103 zu zu@1224.com 34235235323
数据库第二范式(多对多,三张表,关系表两外键):
建立在第一范式的基础上
要求所有非主键字段必须完全依赖主键,不会产生部分依赖。
学生编号+加教师编号 学生姓名 教师姓名
101 001 zc 王
102 002 zx 赵
103 003 zf 王
104 004 zg 赵
zc依赖101 王依赖 001,产生部分依赖。
产生部分依赖缺点:数据冗余,空间浪费,zc和王都重复了。
学生编号(PK) 学生名字
1001 ZC
1002 ZX
1003 ZT
教师表
001 王
002 赵
学生关系表 (完成依赖主键)
ID(PK) 学生编号 教师编号
1 1001 001
2 1002 002
3 1003 001
第三范式:
建立在第二范式基础上,要求所有非字段主键必须直接依赖主键,不要产生传递依赖。
班级编号(PK) 班级名称
01 一年一班
02 一年二班
03 一年三班
学生编号(pk) 学生姓名 班级编号(fk)
1001 张 01
1002 李 02
1003 汉 03
1004 赵 04
三范式三大口诀:
1:一对一,外键唯一
2:多对多,三张表,关系表两外键
3:一对多,三张表,多的表加外键
总结三范式:数据库三范式是理论上的,实践和理论有偏差,最终目的都是为了满足客户需求为准,有时候会拿冗余换执行速度。
大总结:分组查询,连接查询,多表查询,约束,主外键,事务,数据库三范式比较重要的内容。
posted on 2021-05-02 11:42 只想做加法(ylc) 阅读(318) 评论(0) 编辑 收藏 举报