关键字的书写顺序
Select...
From...
Where...
order by...
1、SQL的分类
数据查询语言(DQL)代表关键字:select
完整的数据查询语句
Select 字段
From 表名
Where ...(条件语句)
Group by ....(分组)
Having ...(过滤分组后的数据,不能离开Group by单独存在)
Order by ...(排序)
以上语句的执行顺序
首先执行where过滤原始的数据
再执行Group by进行数据的分组
再执行having对分组之后的数据再次进行过滤
再执行select进行数据的筛选
再执行order by进行数据的排序输出
数据操纵语言(DML)代表关键字:insert、delete、update(增删改)
数据定义语言(DDL) 代表关键字:create(新建)、drop(删除)、alter(更改)
事务控制语言(TCL) 代表关键字:commit(提交)、rollback(回滚)
数据控制语言(DCL) 代表关键字:grant(授予)、revoke(撤回)
- 查看表的结构不是内容:desc +表的名称
- 查看创建表的语句:show create table+表的名称
- 数据查询语言(DQL)代表关键字:select
查询一个表里面的某个字段:select+某个字段,某个字段,...+from+查询的字段对应的表
查询一个表的全部字段:select * +from+字段对应的表
建议以后写Java程序的时候将select *换成需要查询的全部字段
- 条件查询:where,要放到from后面。
条件查询支持运算符。
注意:between...and...是两个值之间;判断是否为空用is null;当and和or联合使用的时候注意and的优先级高于or;like是模糊查询,支持%匹配任意多个字符,_匹配任意一个字符。
- 数据排序:order by子句,order by后面可以跟上排序字段,排序字段可以放多个,采用逗号隔开,且默认升序。
降序用desc;升序用asc(默认)多个字段先按第一个字段,第一个字段无法比较就用第二个,中间用逗号隔开,每个字段后面指定排序方式,不指定默认升序。
- 数据处理函数/单行处理函数,用于处理某一个字段的数据。输入一行输出一行
注意:
substr(被截取的字符串,起始下标,截取的长度);
trim去空格;
Ifnull将null转换成一个具体的数值。
str_to_data将字符串转换成data类型
语法:str_to_data(字符串,匹配格式),将字符串转换成需要匹配的格式,再去对比查找,如果不用str_to_data就要用表格中有的日期的格式,要与数据库的格式严格匹配。
data_format:日期格式化,将日期格式化成年-月-日 时:分:秒
now()获取当前时间
select empno,ename,sal,date_format(now(),'%Y-%m%d %h:%i:%s')as"当前日期"from emp;
format(需要设置千分位的字段,保留的小数点之后的位数)
Round(需要四舍五入的字段)
Case...when...then...else...end
select *,case job when "manager"then sal*1.1 when "salesmen"then sal*1.5 else sal end as newsal from emp;
给一个表起别名:emp as e 或者emp e
Ifnull(需要判断是否为空的字段,将null替换成什么)
- 分组函数/聚合函数/多行处理函数
注意:分组函数不能用于where的后面,因为分组函数,顾名思义要先分组,再用函数,where语句在分组之前执行!
Count 取得记录数
Sum 求和
Avg 取平均
max/min 取最大最小值
分组函数会自动忽略空值(null),不需要手动添加where条件排除空值。
- count(需要记录次数的字段),distinct可以用于过滤重复的记录。
count(distinct需要记录次数的字段)
- sum(需要求和的字段),这个字段里面的null会被自动忽略。如果需要将字段里面的null替换成具体的数值,需要使用ifnull(字段,null替换成的数值)
select sum(sal+ifnull(COMM,0))from emp;
- 组合聚合函数:将所有的聚合函数全部放到select中。
select count(*),sum(sal),avg(sal),max(sal),min(sal)from emp;
- 分组查询:group by 和 having
group by+某个字段,按某个字段分组
技巧:group by后面的某个字段一定要同时放到select的后面。
如果用了order by 一定要放到group by的后面。
select job,deptno,sum(sal) from emp group by job,deptno;
Having,对分组之后的数据进行过滤。
select job,deptno,sum(sal) from emp group by job,deptno having sum(sal)>3000;
- 多表连接查询(关联多个表进行查询-----跨表查询)
内连接(inner join):取出两张表中匹配到的数据,匹配不到的不保留
外连接(outer join):取出连接表中匹配到的数据,匹配不到的也会保留,其值为null
自连接:取出一张表中需要匹配的字段,将一张表看成是两张表
1)SQL92语法:指定连接条件进行跨表查询
Select e.ename,d.dname
from emp e,dept d (给表起别名)
where(连接条件)
e.deptno=d.deptno;
自连接:把一张表看成两张表。
select
e.ename as "上级",e.empno,m.ename,m.mgr
from
emp e,emp m
where
e.empno=m.mgr;
2)SQL99语法
内连接:显示薪水大于2000的员工信息,并显示所属的部门名称
92语法:
select e.ename,e.sal,e.empno,d.dname
from emp e,dept d
where e.deptno=d.deptno and e.sal>2000;
99语法:
select e.ename,e.sal,e.empno,d.dname
from emp e (一张表)
Join dept d (连接的另外一张表)
On e.deptno=d.deptno (连接条件)
Where e.sal>2000; (查询条件)
外连接:
左外连接:左表为主表,将左表所有的都显示出来,右表与左表相同的内容才显示。
右外连接:右表为主表,将右表所有的都显示出来,左表与右表相同的内容才显示。
- 子查询:嵌套的select语句,子查询相当于一张表
- 在where里面加入嵌套的select语句
例如:查询员工信息,查询哪些人是管理者,要求显示出其员工编号和员工姓名
select empno, ename
from emp
where empno in(select mgr from emp where mgr is not null);
- 在from语句中使用子查询,可以将该子查询看做一张表
例如:查询员工信息,查询哪些人是管理者,要求显示出其员工编号和员工姓名
select e.empno, e.ename
from emp e
join (select distinct mgr from emp where mgr is not null) m
on e.empno=m.mgr;
- 在select语句中使用子查询
例如:查询员工信息,并显示出员工所属的部门名称
select e.ename, (select d.dname from dept d where e.deptno=d.deptno) as dname
from emp e;
- Union:用于合并集合(相加)类似于in
1)查询 job 包含 MANAGER 和包含 SALESMAN 的员工
Select * from emp where job in (‘MANAGER’,’SALESMAN’);
采用union来合并
Select * from emp where job =”MANAGER”
union
Select * from emp where job =”SALESMAN ”;
- limit的使用:主要用于提取前几条或者中间某几行数据。
select * from table limit m,n 其中 m 是指记录开始的 index,从 0 开始,表示第一条记录
n 是指从第 m+1 条开始,取 n 条。
select * from tablename limit 2,4 即取出第 3 条至第 6 条,4 条记录
取出薪水最高的前五名
select * from emp e order by e.sal desc limit 5;
- 表:数据定义语言(DDL) 代表关键字:create(新建)、drop(删除)、alter(更改)
创建表的时候,表中有字段,每一个字段有:
* 字段名
* 字段数据类型
* 字段长度限制
* 字段约束
1)创建表的语法
create table tableName(表名)(
columnName(字段名称) dataType(length),
………………..
columnName(字段名称) dataType(length)
);
set character_set_results='gbk';
show variables like '%char%';
MySQL常用的数据类型
BLOB可用于存放二进制大对象比如视频图片等
CLOB可用于存放字符大对象比如长文章
例子:建立学生信息表,字段包括:学号、姓名、性别、出生日期、email、班级标识
create table t_student(
student_id int(10),
student_name varchar(20),
sex char(2) default 'm'(默认为男),
birthday date,
email varchar(30),
classes_id int(3)
)
向表中加入数据
insert into t_student(student_id, student_name, sex, birthday, email, classes_id)
values(1001, 'zhangsan', 'm'(前面默认男这里就不加了), '1988-01-01', 'qqq@163.com', 10)
2)采用 alter table 来增加/删除/修改表结构,不影响表中的数据。
添加字段
alter table t_student
add contact_tel(需要添加的字段) varchar(40);
修改字段
alter table t_student
modify student_name(需要修改的字段) varchar(100) ;
修改字段的名称
alter table t_student
Change sex gender char(2);(将sex字段改成gender)
删除字段
alter table t_student
drop contact_tel(需要删除的字段名称);
3)对表中数据的添加、修改和删除主要包含的语句:insert、update、delete属于数据操纵语言(DML)
添加:Insert指定字段的插入
Insert语法格式
Insert into 表名(字段,。。。。)
values(值,………..)
例:
insert into emp
(empno,ename,job,mgr,hiredate,sal,comm,deptno)
values(9999,'zhangsan','MANAGER', null, null,3000, 500, 10);
插入日期:
第一种方法,插入的日期格式和显示的日期格式一致
insert into emp(empno, ename, job, mgr, hiredate, sal, comm, deptno)
values(9997,'zhangsan','MANAGER', null, '1981-06-12',3000, 500, 10);
第二种方法,采用 str_to_date
insert into emp(empno, ename, job, mgr, hiredate, sal, comm, deptno)
values(9995,'zhangsan','MANAGER',null,now() ,3000, 500, 10);
第三种方法,添加系统日期(now())
insert into emp(empno, ename, job, mgr, hiredate, sal, comm, deptno)
values(9995,'zhangsan','MANAGER',null,now() ,3000, 500, 10);
复制表:
create table emp_bak as select empno,ename,sal from emp;
自动创建一张新表,并将符合查询条件的数据自动复制到新表。
如何将查询的数据直接放到已经存在的表(emp_bak)中,可以使用条件
insert into emp_bak (empno,ename,sal)
select empno,ename,sal
from emp
where sal=3000;
修改:update可以修改数据,可以根据条件修改数据
语法格式:
update 表名 set字段名称 1=需要修改的值1,字段名称2=需要修改的值2 where …….(条件)
删除:delete 可以删除数据,可以根据条件删除数据(就是删除一行)谨慎
语法:Delete from 表名 where ...
例如:delete from emp where comm=500;
4)创建表加入约束(非常重要)
常见的约束
- 非空约束,not null
非空约束,针对某个字段设置其值不为空,如:学生的姓名不能为空
drop table if exists t_student;
create table t_student(
student_id int(10),
student_name varchar(20) not null, (学生姓名字段不能为空)
sex char(2) default 'm',
birthday date,
email varchar(30),
classes_id int(3)
)
insert into t_student(student_id, birthday, email, classes_id)
values
(1002, '1988-01-01', 'qqq@163.com', 10)//学生姓名字段没有插入值,会报错。
- 唯一约束,unique 是表级约束
唯一性约束,它可以使某个字段的值不能重复,如:email 不能重复:
drop table if exists t_student;
create table t_student(
student_id int(10),
student_name varchar(20) not null, (学生姓名字段不能为空)
sex char(2) default 'm',
birthday date,
email varchar(30) unique, (邮箱字段不能重复)
classes_id int(3)
)
insert into t_student(student_id, student_name , sex, birthday, email, classes_id)
values
(1001,'zhangsan','m', '1988-01-01', 'qqq@163.com', 10)
如何查看约束名称
mysql> use information_schema;
mysql> select * from table_constraints where table_name = 't_student';
- 主键约束,primary key 是列级约束,是表内约束
每个表都应该具有主键,主键可以标识记录的唯一性,主键分为单一主键和复合(联合)主键,单一主键是由一个字段构成的,复合(联合)主键是由多个字段构成的。
drop table if exists t_student;
create table t_student()
student_id int(10) primary key,/*列级约束*/
student_name varchar(20) not null,
sex char(2) default 'm',
birthday date,
email varchar(30) ,
classes_id int(3)
)
d) 外键约束,foreign key,是维护表之间的关系,是表间约束
外键主要是维护表之间的关系的,主要是为了保证参照完整性,如果表中的某个字段为外键字段,那么该字段的值必须来源于参照的表的主键,如:emp 中的 deptno 值必须来源于 dept 表中的 deptno 字段值。就相当于你填表的时候,选你是什么政治面貌,往往只有几个固定的选项,这个就是外键,另外一张表里面的政治面貌选项就是主键,要保证唯一性。
例如:建立学生和班级表之间的连接
1、首先建立班级表 t_classes
drop table if exists t_classes
create table t_classes(
classes_id int(3),
classes_name varchar(40),
constraint pk_classes_id primary key(classes_id) 为约束起个名称:约束类型为主键约束pk后面加添加约束的字段。
)
2、在 t_student 中加入外键约束
drop table if exists t_student;
create table t_student(
student_id int(10),
student_name varchar(20),
sex char(2),
birthday date,
email varchar(30),
classes_id int(3) not null,
constraint pk_student_id primary key(student_id),
constraint fk_classes_id foreign key(classes_id) references(引用) t_classes(classes_id)
就是指明了两张表之间的引用关系,施加外键约束t_student中的classes_id引用了t_classes表中的classes_id。
)
- 注意由于外键约束是表间约束,因此对于两张表的新建和删除提出了要求,存在外键的表就是子表,参照的表就是父表,所以存在一个父子关系,也就是主从关系,主表就是班级表,从表就是学生表,新建的时候要新建主表:班级表,删除的时候要先删除子表:学生表。同时为了不影响表格的完整性,要将子表中外键约束的字段设置为非空。
- 存储引擎:
1)MyISAM 表最适合于大量的数据读而少量数据更新的混合操作。MyISAM 表的另一种适用情形是使用压缩的只读表。
2)如果查询中包含较多的数据更新操作,应使用 InnoDB。其行级锁机制和多版本的支持为数据读取和更新的混合操作提供了良好的并发机制。
3)可使用 MEMORY 存储引擎来存储非永久需要的数据,或者是能够从基于磁盘的表中重新生成的数据。
16、事务:一个事务其实就是一个完整的业务逻辑。是一个最小的工作单元。不可再分。
ACID的特征;事务控制语言(TCL) 代表关键字:commit(提交)、rollback(回滚)
原子性(Atomicity) :整个事务中的所有操作,必须作为一个单元全部完成(或全部取消)不可分割。
一致性(Consistency):在事务开始之前与结束之后,数据库都保持一致状态。
隔离性(Isolation) :一个事务不会影响其他事务的运行。
持久性(Durability) 在事务完成以后,该事务对数据库所作的更改将持久地保存在数据库之中,并不会被回滚。
一些概念:
a) 事务(Transaction):一批操作(一组 DML)
b) 开启事务(Start Transaction)
c) 回滚事务(rollback)
d) 提交事务(commit)
e) SET AUTOCOMMIT:禁用或启用事务的自动提交模式
1)只有DML语句才会有事务这一说,其它语句和事务无关!!!Insert、delete、update
只有以上的三个语句和事务有关系,其它都没有关系。因为只有以上的三个语句是数据库表中数据进行增、删、改的。只要你的操作一旦涉及到数据的增、删、改,那么就一定要考虑安全问题。
数据安全第一位!!!
- 说到本质上,一个事务其实就是多条DML语句同时成功,或者同时失败!
3)事务是怎么做到多条DML语句同时成功和同时失败的呢?
InnoDB存储引擎:提供一组用来记录事务性活动的日志文件
事务开启了:
insert
insert
insert
delete
update
update
update
事务结束了!
在事务的执行过程中,每一条DML的操作都会记录到“事务性活动的日志文件”中。
在事务的执行过程中,我们可以提交事务,也可以回滚事务。
提交事务?
清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中。
提交事务标志着,事务的结束。并且是一种全部成功的结束。
回滚事务?
将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件
回滚事务标志着,事务的结束。并且是一种全部失败的结束。
回滚是回到上一次事件的提交点,不能回到执行一半的语句那里。
4)
怎么提交事务,怎么回滚事务?
提交事务:commit; 语句
回滚事务:rollback; 语句(回滚永远都是只能回滚到上一次的提交点!)
事务对应的英语单词是:transaction
测试一下,在mysql当中默认的事务行为是怎样的?
mysql默认情况下是支持自动提交事务的。(自动提交)
什么是自动提交?
每执行一条DML语句,则提交一次!这种自动提交实际上是不符合我们的开发习惯,因为一个业务通常是需要多条DML语句共同执行才能完成的,为了保证数据的安全,必须要求同时成功之后再提交,所以不能执行一条就提交一条。
怎么将mysql的自动提交机制关闭掉呢?
先执行这个命令:start transaction;
再执行Insert、delete、update等命令
如果回滚就是:rollback;
如果提交就是:commit;
5)事务的隔离性!!!
A教室和B教室中间有一道墙,这道墙可以很厚,也可以很薄。这就是事务的隔离级别。
这道墙越厚,表示隔离级别就越高。
事务和事务之间的隔离级别有哪些呢?4个级别
读未提交:read uncommitted(最低的隔离级别)《没有提交就读到了》
什么是读未提交?
事务A可以读取到事务B未提交的数据。
这种隔离级别存在的问题就是:
脏读现象!(Dirty Read)
我们称读到了脏数据。
这种隔离级别一般都是理论上的,大多数的数据库隔离级别都是二档起步!
读已提交:read committed《提交之后才能读到》
什么是读已提交?
事务A只能读取到事务B提交之后的数据。
这种隔离级别解决了什么问题?
解决了脏读的现象。
这种隔离级别存在什么问题?
不可重复读取数据。
什么是不可重复读取数据呢?
在事务开启之后,第一次读到的数据是3条,当前事务还没有
结束,可能第二次再读取的时候,读到的数据是4条,3不等于4
称为不可重复读取。
这种隔离级别是比较真实的数据,每一次读到的数据是绝对的真实。
oracle数据库默认的隔离级别是:read committed
可重复读:repeatable read《提交之后也读不到,永远读取的都是刚开启事务时的数据》
什么是可重复读取?
事务A开启之后,不管是多久,每一次在事务A中读取到的数据
都是一致的。即使事务B将数据已经修改,并且提交了,事务A
读取到的数据还是没有发生改变,这就是可重复读。
可重复读解决了什么问题?
解决了不可重复读取数据。
可重复读存在的问题是什么?
可以会出现幻影读。
每一次读取到的数据都是幻象。不够真实!
早晨9点开始开启了事务,只要事务不结束,到晚上9点,读到的数据还是那样!
读到的是假象。不够绝对的真实。
mysql中默认的事务隔离级别就是这个!!!!!!!!!!!
序列化/串行化:serializable(最高的隔离级别)
这是最高隔离级别,效率最低。解决了所有的问题。
这种隔离级别表示事务排队,不能并发!
synchronized,线程同步(事务同步)
每一次读取到的数据都是最真实的,并且效率是最低的。
17、索引
17.1 什么是索引
索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制。一张表的一个字段可以添加一个索引,当然,多个字段联合起来也可以添加索引。索引相当于一本书的目录,是为了缩小扫描范围而存在的一种机制。
在mysql数据库当中索引也是需要排序的,并且这个所以的排序和TreeSet数据结构相同。TreeSet(TreeMap)底层是一个自平衡的二叉树!在mysql当中索引是一个B-Tree数据结构。
遵循左小又大原则存放。采用中序遍历方式遍历取数据。
17.2索引的实现原理?
假设有一张用户表:t_user
id(PK) name 每一行记录在硬盘上都有物理存储编号
----------------------------------------------------------------------------------
100 zhangsan 0x1111
120 lisi 0x2222
99 wangwu 0x8888
88 zhaoliu 0x9999
101 jack 0x6666
55 lucy 0x5555
130 tom 0x7777
提醒1:在任何数据库当中主键上都会自动添加索引对象,id字段上自动有索引,因为id是PK。另外在mysql当中,一个字段上如果有unique约束的话,也会自动创建索引对象。
提醒2:在任何数据库当中,任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号。
提醒3:在mysql当中,索引是一个单独的对象,不同的存储引擎以不同的形式存在,在MyISAM存储引擎中,索引存储在一个.MYI文件中。在InnoDB存储引擎中索引存储在一个逻辑名称叫做tablespace的当中。在MEMORY存储引擎当中索引被存储在内存当中。不管索引存储在哪里,索引在mysql当中都是一个树的形式存在。(自平衡二叉树:B-Tree)
17.3什么条件下,我们会考虑给字段添加索引呢?
在mysql当中,主键上,以及unique字段上都会自动添加索引的!!!!
条件1:数据量庞大(到底有多么庞大算庞大,这个需要测试,因为每一个硬件环境不同)
条件2:该字段经常出现在where的后面,以条件的形式存在,也就是说这个字段总是被扫描。
条件3:该字段很少的DML(insert delete update)操作。(因为DML之后,索引需要重新排序。)
建议不要随意添加索引,因为索引也是需要维护的,太多的话反而会降低系统的性能。
建议通过主键查询,建议通过unique约束的字段进行查询,效率是比较高的.
17.4索引怎么创建?怎么删除?语法是什么?
创建索引:
mysql> create index emp_ename_index(索引名称,一般是添加索引的对象+index) on emp(添加索引的表名)(ename(添加索引的字段));
给emp表的ename字段添加索引,起名:emp_ename_index
删除索引:
mysql> drop index emp_ename_index on emp;
将emp表上的emp_ename_index索引对象删除。
17.5在mysql当中,怎么查看一个SQL语句是否使用了索引进行检索?
mysql> explain select * from emp where ename = 'KING'(判断ename是否添加了索引);
17.6索引有失效的时候,什么时候索引失效呢?
失效的第1种情况:select * from emp where ename like '%T';
ename上即使添加了索引,也不会走索引,为什么?
原因是因为模糊匹配当中以“%”开头了!尽量避免模糊查询的时候以“%”开始。这是一种优化的手段/策略。
失效的第2种情况:
使用or的时候会失效,如果使用or那么要求or两边的条件字段都要有索引,才会走索引,如果其中一边有一个字段没有索引,那么另一个字段上的索引也会实现。所以这就是为什么不建议使用or的原因。
失效的第3种情况:
使用复合索引的时候,没有使用左侧的列查找,索引失效。
什么是复合索引?两个字段,或者更多的字段联合起来添加一个索引,叫做复合索引。
Eg:
成功
create index emp_job_sal_index on emp(job,sal);
mysql> explain select * from emp where job = 'MANAGER';
失效
mysql> explain select * from emp where sal = 800;
失效的第4种情况:
在where当中索引列参加了运算,索引失效。
mysql> create index emp_sal_index on emp(sal);
mysql> explain select * from emp where sal+1 = 800;
失效的第5种情况:
在where当中索引列使用了函数
explain select * from emp where lower(ename) = 'smith';
17.7索引是各种数据库进行优化的重要手段。优化的时候优先考虑的因素就是索引。
索引在数据库当中分了很多类?
单一索引:一个字段上添加索引。
复合索引:两个字段或者更多的字段上添加索引。
主键索引:主键上添加索引。
唯一性索引:具有unique约束的字段上添加索引。
.....
注意:唯一性比较弱的字段上添加索引用处不大。
- 视图:view:站在不同的角度去看待同一份数据。
18.1 什么是视图:视图是一种根据查询(也就是 SELECT 表达式)定义的数据库对象,用于获取想要看到和使用的局部数据。视图有时也被成为“虚拟表”。视图可以被用来从常规表(称为“基表”)或其他视图中查询数据。相对于从基表中直接获取数据,视图有以下好处:
1)访问数据变得简单。
2)可被用来对不同用户显示不同的表的内容。
18.2怎么创建视图对象?怎么删除视图对象?将创建视图想象成创建表。
表复制:
create table dept2 as select * from dept;
创建视图对象:
create view dept2_view as select * from dept2;
删除视图对象:
drop view dept2_view;
注意:只有DQL语句才能以view的形式创建。
create view view_name as 这里的语句必须是数据查询语句select...from...where...
18.3用视图做什么?
我们可以面向视图对象进行增删改查,对视图对象的增删改查,会导致原表被操作!(视图的特点:通过对视图的操作,会影响到原表数据。
18.4视图对象在实际开发中到底有什么用?《方便,简化开发,利于维护》
create view
emp_dept_view
as
select
e.ename,e.sal,d.dname
from
emp e
join
dept d
on
e.deptno = d.deptno;
假设有一条非常复杂的SQL语句,而这条SQL语句需要在不同的位置上反复使用。每一次使用这个sql语句的时候都需要重新编写,很长,很麻烦,怎么办?
可以把这条复杂的SQL语句以视图对象的形式新建。在需要编写这条SQL语句的位置直接使用视图对象,可以大大简化开发。并且利于后期的维护,因为修改的时候也只需要修改一个位置就行,只需要修改视图对象所映射的SQL语句。
我们以后面向视图开发的时候,使用视图的时候可以像使用table一样。可以对视图进行增删改查等操作。视图不是在内存当中,视图对象也是存储在硬盘上的,不会消失。
再提醒一下:
视图对应的语句只能是DQL语句。但是视图对象创建完成之后,可以对视图进行增删改查等操作。
小插曲:
增删改查,又叫做:CRUD。
CRUD是在公司中程序员之间沟通的术语。一般我们很少说增删改查。一般都说CRUD。 C:Create(增)
R:Retrive(查:检索)
U:Update(改)
D:Delete(删)
- DBA常用命令
重点掌握:
数据的导入和导出(数据的备份)
其它命令了解一下即可。(这个培训日志文档留着,以后忘了,可以打开文档复制粘贴。)
数据导出?
注意:在windows的dos命令窗口中:
mysqldump bjpowernode>D:\bjpowernode.sql -uroot -p123456
可以导出指定的表吗?
mysqldump bjpowernode emp>D:\bjpowernode.sql -uroot -p123456
数据导入?
注意:需要先登录到mysql数据库服务器上。
然后创建数据库:create database bjpowernode;
使用数据库:use bjpowernode
然后初始化数据库:source D:\bjpowernode.sql
- 数据库设计三范式
20.1 什么是数据库设计范式?
数据库表的设计依据。教你怎么进行数据库表的设计。
20.2 数据库设计范式共有?3个。
第一范式:要求任何一张表必须有主键(标识记录的唯一性),每一个字段原子性不可再分。
第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键,不要产生部分依赖。
第三范式:建立在第二范式的基础之上,要求所有非主键字段直接依赖主键,不要产生传递依赖。
声明:三范式是面试官经常问的,所以一定要熟记在心!
设计数据库表的时候,按照以上的范式进行,可以避免表中数据的冗余,空间的浪费。
多对多怎么设计
多对多,三张表,关系表两个外键!!!!!!!!!!!!!!!
一对多:
一对多,两张表,多的表加外键!!!!!!!!!!!!
一对一需要拆分的大表格
口诀:一对一,外键唯一!!!!!!!!!!