澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站:知了堂学习心得,mysq

Mysql数据库知识点

数量约束

多少的各类束缚

如何是数量约束:

对用户操作表的数据进行约束

1.管理数据库语句:

运用数据库:

use test;

丰裕数据库:

create database 数据库名;

create database test;

改善数据库:

alter database 数据库名;

alter database test;

删去数据库:

drop database 数据库名;

drop database test;

翻开全数数据库:

show databases;

 

1.1 默认值

私下认可值约束

成效: 当客户对利用暗中认可值的字段不插入值的时候,就接纳暗中认可值。

注意:

1)对默许值字段插入null是足以的。

2)对私下认可值字段能够插入非null

-- 1.1 默认值

CREATE TABLE student(

id INT,

NAME VARCHAR(20),

address VARCHAHaval(20) DEFAULT '圣菲波哥伦比亚大学天河'  -- 暗许值

)

 

-- 当字段没有插入值的时候,mysql自动给该字段分配默许值

INSERT INTO student(id,NAME) VALUES(1,'张三');

 

-- 注意:默许值的字段允许为null

INSERT INTO student(id,NAME,address) VALUE(2,'李四',NULL);

-- 若是插入了值,暗中认可值就不出示了

INSERT INTO student(id,NAME,address) VALUE(3,'王五','布宜诺斯艾Liss幽州');

2.管制表语句:

加多数据表:

create table 表名(

  列名 数据类型 数据约束,

  列名 数据类型 数据限制

);

create table student(

  name varchar(20) not null,

  age int(4)

)

修正数据表:

alter table 表名;

1)在表中追加新字段

alter table student add colunm name varchar(20);

2)删除表中的字段

alter table student drop name;

3)更改表中字段的品类

alter table student modify name varchar(10);

删去数据表:

drop table 表名;

drop table student;

翻开全部表:

show tables;

 

CREATE TABLE student(

非空限定

意义: 节制字段必得赋值

注意:

1)非空字符必需赋值

2)非空字符无法赋null

-- 1.2 非空

-- 须求: gender字段必得有值(不为null)

CREATE TABLE student(

id INT,

NAME VARCHAR(20),

gender VARCHAR(2) NOT NULL -- 非空

)

 

-- 非空字段必需赋值,

INSERT INTO student(id,NAME) VALUES(1,'李四');

-- 非空字符无法插入null

INSERT INTO student(id,NAME,gender) VALUES(1,'李四',NULL);

 

3.管理数据他们说话:

安排数据:

insert into 表名 (列1,列2...)  values (值1,值2...);

insert into student (name,age) values ('张三',20);

更新数据:

update 表名 set 列=修改值 where 条件;

update student set  name='李四' where name='张三';

删去数据:

delete from 表名 where 条件;

delete from student where name='李四';

查询数据:

selete *  from 表名 where 条件;

selete * from student where name='张三';

 

         id INT,

唯生机勃勃约束

效果: 对字段的值无法重新

注意:

1)独一字段能够插入null

2)唯一字段能够插入两个null

-- 1.3 唯一

CREATE TABLE student(

id INT UNIQUE, -- 唯一

NAME VARCHAR(20)

)

 

INSERT INTO student(id,NAME) VALUES(1,'zs');

INSERT INTO student(id,NAME) VALUES(1,'lisi'); -- ERROR 1062 (23000): Duplicate entry '1' for key 'id'

 

INSERT INTO student(id,NAME) VALUES(2,'lisi');

4.种种查询语句:

询问时钦定外号:

1) selete id AS '编号',name AS '姓名' from student;

2) selete id '编号',name '姓名' from student;(AS能够简轻松单)

询问时合併列:

需要:查询各样学员的总分

selete name AS '姓名',(servlet mysql) AS '总成绩' from student;

小心:合併列的字段必需是数值类型的字段

查询时去除重复(distinct):

须求:查询有怎么样地点的上学的小孩子

selete DISTINCT address from student;

另生龙活虎种语法

selete DISTINCT(address) from student;

         NAME VARCHAR(20),

主键限定

作用: 非空 唯一

注意:

1)经常状态下,每张表都会安装八个主键字段。用于标识表中的每条记下的唯生机勃勃性。

2)建议实际不是筛选表的带有业务含义的字段作为主键,提出给每张表独立设计八个非业务含义的id字段。

CREATE TABLE student(

id INT PRIMARY KEY, -- 主键

NAME VARCHAR(20)

)

 

INSERT INTO student(id,NAME) VALUES(1,'张三');

INSERT INTO student(id,NAME) VALUES(2,'张三');

-- INSERT INTO student(id,NAME) VALUES(1,'李四'); -- 违反唯意气风发限定: Duplicate entry '1' for key 'P奥迪Q7IMAKugaY'

 

-- insert into student(name) value('李四'); -- 违反非空约束: ECRUISERROR 1048 (23000): Column 'id' cannot be null

基准查询

逻辑条件: and  or

须求:查询学生的id为1,且姓名字为张三的上学的儿童

selete * from student where id=1 and name='张三';(交集)

须求:查询学子的id为2,或姓名称为张三的学子

selete * from student where id=2 or name='张三';(并集)

正如基准: >  <  >=  <=  =  <>  (between and--在...之间 包前包后)

须求:查询servlet分数大于80分的学员

selete * from student where servlet>80;

必要:查询mysql分数小于或等于85分的学习者

selete * from student where mysql<=85;

急需:查询servlet分数大于或等于80分,且小于或等于85分的上学的儿童

selete * from student where servlet>=80 AND servlet<=85;

代替上面语句的语法

selete * from student where servlet BETWEEN 80 AND 85;

必要:查询岁数不等于30的学习者

selete * from student where age<>30;

判空条件: is null,   is not null,   =’’,   <>’’

Null:表示尚无多少

空字符:表示有多少

要求:查询未有性别数据的上学的小孩子(数据‘男’或‘女’)

selete* from student where gender IS NULL OR gender='';

急需:查询有性别数据的学子

selete * from student where gender IS NOT NULL AND gender<>'';

模糊条件: like

模糊取代符号:

%:替代猖獗个字符

_:代替一个字符

需求:查询姓“李”的学生

SELECT * FROM student WHERE NAME LIKE '李%';

必要:查询姓名中富含‘四’字的学童

SELECT * FROM student WHERE NAME LIKE '%四%';

供给:查询姓‘李’,全名独有五个字的学生

SELECT * FROM student WHERE NAME LIKE '李_';

聚合函数查询(用于计算结果)

马克斯()取最大值  min()取最小值  avg()取平均值  count()总结标的笔录数据 sum()求和

供给:查询servlet的参天分

SELECT MAX(servlet) FROM student;

必要:查询mysql的最低分

SELECT MIN(mysql) FROM student;

必要:查询servlet的平分分

SELECT AVG(servlet) FROM student;

要求:查询当前有多少个学子

SELECT COUNT(*) FROM student;

必要:查询servlet战绩的总量

SELETE SUM(servlet) from student;

分页查询(limit)

Limit初阶行数,查询的行数

开端行数从0在此从前

需求:查询第1,2条数据

SELECT * FROM student LIMIT 0,2;

分页查询需精通:当前页码,每页显示条数

结论分页查询当前页数据:select * from student limit (当前页码-1)*每页显示条数,每页展现条数;

急需:学子共20条数据,每页展现5条,共4页

询问第3页(第11到15条)的上学的小孩子数量:select * from student limit 10,5;

查询后排序(order by)

DESC:降序。数值从大到小,字母z-a

ASC:升序。数值从小到大,字母a-z

默许意况下,依照插入的次第排序

须要:依据id的升序排序

select * from student order by id asc;

须要:遵照servlet战绩降序排序

select * from student order by servlet desc;

多少个排序条件的图景:先根据前边的法规排序,当现身重复记录,再根据前面的标准排序

必要:依据age升序,再依照servlet成绩升序排序

select * from student order by age asc,servlet asc;

分组查询(group by)

急需:查询各个地区有稍许人

SELECT address,COUNT(*) FROM student GROUP BY address;

急需:总括男女的人头

只顾:where条件必得放在group by 分组之前

SELECT gender,COUNT(*) FROM student WHERE gender IS NOT NULL AND gender<>'' GROUP BY gender;

分组后筛选(having)

必要:查询哪些地区的总人口是超乎2个的所在

查询哪些地点某个人 2)筛选人数超越2的地带

细心:having使用在group by分组之后,对分组后的规范化实行筛选

SELECT address,COUNT(*) FROM student GROUP BY address HAVING COUNT(*)>2;

 

         address VARCHAR(20) DEFAULT '圣菲波哥伦比亚大学天河'  -- 暗中认可值

自增加

成效: 自动依次增加

-- 1.5 自增长

CREATE TABLE student(

id INT(4) ZEROFILL PRIMARY KEY AUTO_INCREMENT, -- 自增长,从0开始  ZEROFILL 零填充

NAME VARCHAR(20)

)

 

-- 自增加字段能够不赋值,自动依次增加

INSERT INTO student(NAME) VALUES('张三');

INSERT INTO student(NAME) VALUES('李四');

INSERT INTO student(NAME) VALUES('王五');

 澳门新浦京娱乐场网站 1

 

-- 不可能影响自拉长度大约束,删除的数额后,在增多数量的时候,会在本来的底蕴上增多上去

DELETE FROM student;

-- 能够影响自拉长度大概束  ,删除数据的时候,增多数码时,会再也开头增加,id重0起头算起

TRUNCATE TABLE student;

 

5.多少约束(给表增添数据约束,进而限制客商操作表数据的作为)

1)暗中同意值约束(default)

create table test(

  name varchar(20),

  gender varchar(20) default ‘男’

)

急需:当不插入gender的时候,分配八个‘男’的默许值

潜心:1)当未有加塞儿gender字段的时候,分配多个默许值

2)非空节制(not null)

create table test(

  name varchar(20) not null,

  gender varchar(20)

)

必要;name字段必必要有值(不得不插入数据,不能够是null),那是给name增多非空限定

1)非空限制,一定要插入值

Insert into test(gender) values(‘男’);

2)非空节制,不可能插入null

Insert into test(name,gender) values(null,’男’);

3)唯一约束(unique)

create table test(

  Id int unique,

  name varchar(20)

)

要求:id的值不可能冒出重复。那时将在给id增多贰个唯少年老成约束

1)不可能插入重复的值

2)唯生龙活虎节制,能够插入八个null。所以唯大器晚成节制不可能自律null

Insert into test(id,name) values(1,’张三’);

4)主键约束(primary key)(唯风流倜傥 非空)

注意;

1)日常状态下,大家会给每张表都设置二个主键字段,用来标识记录的唯黄金年代性

2)但是不提出把作业含义字段作为主键,因为随着工作的变动,业务字段或然现身重复

3)提出给每张表都独立加多三个叫id的字段,把那几个id字段设置成主键,用来作为记录的唯后生可畏性

create table test(

  Id int primary key,

  name varchar(20)

)

1)唯一性

2)非空性

5)自拉长度节制(auto_increment)

create table test(

  Id int primary key auto_increment,

  name varchar(20)

)

自增加度大限定:早先值为0,每回依次增加1

行使truncate table 删除数据的时候,能够把自拉长的始发值置为0

6)外键限定

职员和工人表(副表:被其余表约束的表,外键设置在副表)

Create table employee(

  Id int primary key auto_increment,

  name varchar(20),

  deptId int,

  加多外键约束(foreign key)

  Constraint employee_dept_fk foreign key(deptId) references dept(id)

                 外键名                               外键字段                

)

机构表(主表:约束别人的表)

Create table dept(

  Id int primary key auto_increment,

  Name varchar(20)

)

外键节制在怎么样情状下会起效果?

插入数据:当往副表插入了主表中不设有的数码时,外键起效果

校正数据:当往副表中期维改过主表中不设有的数码时,外键起作用

去除数据:副表中有涉嫌主表数据的情事下,当删除主表数据时,外键起作用

当有了外键之后,应该怎么保管数据吧?

布署数据:先插入主表的数码,再插入副表数据

改善数据:先改正主表数据,再纠正副表数据

去除数据:先删除副表数据,再删除主表数据

);

外键节制

作用:约束两种表的数据,避免数据的冗余高问题

 

并未有外键的情形下:

-- 员工表

CREATE TABLE employee(

id INT PRIMARY KEY,

empName VARCHAR(20),

deptName VARCHA安德拉(20) -- 部门名称

)

 

INSERT INTO employee VALUES(1,'张三','软件开辟部');

INSERT INTO employee VALUES(2,'李四','软件开垦部');

INSERT INTO employee VALUES(3,'王五','应用维护部');

 

-- 增加工作者,部门名称的数量冗余高

INSERT INTO employee VALUES(4,'陈六','软件开辟部');

 

-- 解决数据冗余高的难题:给冗余的字段放到一张独立表中

-- 独立设计一张部门表

CREATE TABLE dept(

id INT PRIMARY KEY,

deptName VARCHAR(20)

)

 

难题应际而生:在插入职员和工人表数据的时候,工作者表的机关ID字段能够随意插入!!!!!

使用外键限制:节制插入职员和工人表的机构ID字段值

消释办法: 在职员和工人表的部门ID字段增多三个外键约束

-- 部门表(主表)

CREATE TABLE dept(

id INT PRIMARY KEY,

deptName VARCHAR(20)

)

 

-- 修正工作者表(副表/从表)

CREATE TABLE employee(

id INT PRIMARY KEY,

empName VARCHAR(20),

deptId INT,-- 把机构名称改为机构ID

-- 评释意气风发(Wissu)个外键约束

CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)

--           外键名称                  外键               参照他事他说加以考查表(参考字段)

)

 

依据先创制主表,然后建设构造副表,就足以创设员工表的外键约束了,构建后如图:

 澳门新浦京娱乐场网站 2

 

 

7)级联本事(cascade)

级联:当有了外键的时候,大家期望改良或删除数据的时候,改过或删除主表数据时,同不日常候能够影响副表的数据,那时候就能够使用级联

Create table employee(

  Id int primary key auto_increment,

  name varchar(20),

  deptId int,

  增多外键节制(foreign key)

  增多级联更正:on update cascade

  增多级联改善:on delete cascade

  Constraint employee_dept_fk foreign key(deptId) references dept(id) on update cascade on delete cascade

                 外键名                               外键字段 

);

单位表(主表:约束外人的表)

Create table dept(

Id int primary key auto_increment,

Name varchar(20)

);

 

 

外键增加数据,改良数据,删除数据

1)被约束的表称为副表,约束别人的表称为主表,外键设置在副表上的!!!

2)主表的参考字段通用为主键!

3)添加数据: 先添加主表,再添加副表

4)修改数据: 先修改副表,再修改主表

5)删除数据: 先删除副表,再删除主表

 

添加主表

INSERT INTO dept(id,deptName) VALUES(1,'软件开发部');

INSERT INTO dept(id,deptName) VALUES(2,'应用维护部');

INSERT INTO dept(id,deptName) VALUES(3,'秘书部');

 

添加副表

INSERT INTO employee VALUES(1,'张三',1);

INSERT INTO employee VALUES(2,'李四',1);

INSERT INTO employee VALUES(3,'王五',2);

INSERT INTO employee VALUES(4,'陈六',3);

 

累积数量的例证:

-- 问题: 该记录业务上不合法,员工插入了一个不存在的部门数据

INSERT INTO employee VALUES(5,'陈六',4); -- 违反外键约束: Cannot add or update a child row: a foreign key constraint fails

 

(`day16`.`employee`, CONSTRAINT `emlyee_dept_fk` FOREIGN KEY (`deptId`) REFERENCES `dept` (`id`))

 

6.数据库设计的三大范式

率先范式;必要表的各个字段必需独立的不可分割的单元

学生表: student name ---违反第大器晚成范式

               张三|狗娃

     王涵|张小涵

询问:现用名中满含‘张’的学子

Select * from student where name like ‘%张%’;

学生表: student name old_name  ---切合第大器晚成范式

                    张三    狗娃

       王涵             张小涵

其次范式:在率先范式的根底上,必要表的除主键以外的字段都和主键有依附关系

一张表只表明二个乐趣

员工表:employee

职工编号   工作者姓名   部门名称    订单名称   ---违反第二范式

 

员工表:employee

工作者编号   工作者姓名   部门名称     ---适合第二范式

            订单表:

            订单号码 订单名称

其三范式:在其次范式的底蕴上,必要表的除主键以外的字段都必须要和主键有直接调整的依附关系

员工表:employee

职工编号   工作者姓名  部门编号  部门名称 ---违反第三范式(现身数量冗余)

               1        张三       1        软件开荒部

               2        李四       1        软件开采部

员工表:employee

职工编号   工作者姓名  部门编号   ---切合第三范式

 1        张三       1

 2        李四       1

部门表:dept

部门编号   部门名称

1          软件开采部

 

DROP TABLE student;

级联操作

问题: 当有了外键约束的时候,必须先修改或删除副表中的所有关联数据,才能修改或删除主表!但是,我们希望直接修改或删除主表数据,从而影响副表数据。可以使用级联操作实现!!!

 

级联修改: ON UPDATE CASCADE

级联删除: ON DELETE CASCADE

 

CREATE TABLE employee(

id INT PRIMARY KEY,

empName VARCHAR(20),

deptId INT,-- 把部门名称改为部门ID

-- 声明一个外键约束

CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE  -- ON CASCADE UPDATE :级联修改

--           外键名称                  外键               参考表(参考字段)

)

注意: 级联操作必须在外键基础上使用

-- 级联修改(修改)

-- 直接修改部门

UPDATE dept SET id=5 WHERE id=4;

 

-- 级联删除

-- 直接删除部门

DELETE FROM dept WHERE id=1;

 

7.多表查询

1.时有时无连接查询(笛Carl乘积:4*3=12,爆发笛Carl积的因由是向来不丰盛的连天条件)(平日不要)

供给:查询工作者及其部门名称

SELECT employee.name,dept.name

FROM employee,dept;

2.内接连查询(使用最多)

多表查询的手续:1)明确询问哪些表

               2)明显询问哪些字段

               3)明确连接条件(法规:条件=表数量-1)

SELECT employee.name,dept.name

FROM employee,dept

WHERE employee.deptId=dept.id;

另意气风发种语法

SELECT e.name,d.name

FROM employee e

INNER JOIN dept d

ON e.deptId=d.id;

3.左外接连查询(左表数据总体来得,假如左侧不满足,则显示null)

要求:查询部门及其部门的职工

SELECT d.name,e.name

FROM dept d

LEFT OUTER JOIN employee e

ON d.id=e.deptId;

4.右外接连查询(右表数据总体展现,要是侧边不满意,则显得null)

SELECT d.name,e.name

FROM employee e

RIGHT OUTER JOIN dept d

ON e.deptId=d.id;

 

协和提醒:想要领悟越多学问,请前往知了堂读书社区

www.zhiliaotang.com

-- 当字段未有插入值的时候,mysql自动给该字段分配暗中认可值

数据库设计基准:尽量符合三大范式

    3.2 三大范式

设计原则: 建议设计的表尽量遵守三大范式。

第一范式: 要求表的每个字段必须是不可分割的独立单元

student     :   name              -- 违反第一范式

 张小名|狗娃

sutdent    : name    old_name    --符合第一范式

张小名    狗娃

 

第二范式: 在第一范式的基础上,要求每张表只表达一个意思。表的每个字段都和表的主键有依赖

employee(员工): 员工编号  员工姓名 部门名称   订单名称  --违反第二范式

员工表:员工编号  员工姓名 部门名称   

订单表:  订单编号  订单名称             -- 符合第二范式     

  

第三范式: 在第二范式基础,要求每张表的主键之外的其他字段都只能和主键有直接决定依赖关系。

员工表: 员工编号(主键) 员工姓名  部门编号  部门名 --符合第二范式,违反第三范式 (数据冗余高)

员工表:员工编号(主键) 员工姓名  部门编号    --符合第三范式(降低数据冗余)

部门表:部门编号  部门名

 

INSERT INTO student(id,NAME) VALUES(1,'张三');

波及查询(多表查询)

穿插查询(不推荐)

-- 需求:查询员工及其所在部门(显示员工姓名,部门名称)

-- 2.1 交叉连接查询(不推荐。产生笛卡尔乘积现象:4 * 3=12,有些是重复记录)

SELECT empName,deptName FROM employee,dept;

 

 

 

 

内连接查询(推荐应用)

-- 须求:查询职员和工人及其所在机关(展现员工姓名,部门名称)

-- 多表查询准则:1)分明询问哪些表   2)鲜明怎么样哪些字段   3)表与表之间三回九转条件 (规律:连接条件数量是表数据-1)

-- 2.2 内接连查询:独有满意条件的结果才交易会示(使用最频仍)

SELECT empName,deptName       -- 2)鲜明怎样哪些字段

FROM employee,dept    -- 1)明确询问哪些表

WHERE employee.deptId=dept.id  -- 3)表与表之直接连条件

 澳门新浦京娱乐场网站 3

 

-- 内连接的另大器晚成种语法

SELECT empName,deptName

FROM employee

INNER JOIN dept

ON employee.deptId=dept.id;

 

-- 使用外号

SELECT e.empName,d.deptName

FROM employee e

INNER JOIN dept d

ON e.deptId=d.id;

 

 

-- 只顾:暗中同意值的字段允许为null或其余非默许值的值

左连接查询

概念:

行使左边表的多寡去相称左边表的多寡,假设契合连接条件的结果则显得,若是不切合连接条件则显得null

 -- (注意: 左外连接:左表的多少一定会成功呈现!)

-- 须要: 查询每一种单位的职工

-- 预期结果:

 --  软件开垦部  张三

 --  软件开辟部  李四澳门新浦京娱乐场网站 4

 --  应用维护部  王五

 --  秘书部      陈六

 --  总经办      null

INSERT INTO dept VALUES(5,'总经办')

SELECT d.deptName,e.empName

FROM dept d

LEFT OUTER JOIN employee e

ON d.id=e.deptId;

 澳门新浦京娱乐场网站 5

 

 

INSERT INTO student(id,NAME,address) VALUE(2,'李四',NULL);

右连接查询

 

-右[外]连接查询: 使用右边表的数据去匹配左边表的数据,如果符合连接条件的结果则显示,如果不符合连接条件则显示null

 -- (注意: 右外连接:右表的数据一定会完成显示!)

SELECT d.deptName,e.empName

FROM employee e

RIGHT OUTER JOIN dept d

ON d.id=e.deptId;

 

 

INSERT INTO student(id,NAME,address) VALUE(3,'王五','华盛顿幽州');

MySQL权限难题

 -- mysql数据库权限问题:root :拥有所有权限(可以干任何事情)

 -- 权限账户,只拥有部分权限(CURD)例如,只能操作某个数据库的某张表

--  mysql数据库,用户配置 : user表

USE mysql;

 

SELECT * FROM USER;  --查看有多少用户

-- 修改密码:  需要重新启动服务才能生效

UPDATE USER SET PASSWORD=PASSWORD('123456') WHERE USER='root';

 

-- 分配权限账户:eric   密码:123456    权限是可以对employee表查询和删除的权限

GRANT SELECT ON day16.employee TO 'eric'@'localhost' IDENTIFIED BY '123456';

GRANT DELETE ON day16.employee TO 'eric'@'localhost' IDENTIFIED BY '123456';

 

1.2 非空

-- 必要: gender字段必需有值(不为null)

DROP TABLE student;

CREATE TABLE student(

         id INT,

         NAME VARCHAR(20),

         gender VARCHAR(2) NOT NULL -- 非空

);

 

-- 非空字段必得赋值(假诺使用mysql的话会将非空字段暗中同意赋值为一个空字符串)

INSERT INTO student(id,NAME) VALUES(1,'李四');

-- 非空字段不得以插入NULL;

INSERT INTO student(id,NAME,gender) VALUES(1,'李四',NULL);

 

1.3 唯一

功用: 对字段的值无法再一次

注意:

1)独一字段能够插入null                            

2)独一字段能够插入七个null

CREATE TABLE student(

         id INT UNIQUE, -- 唯一

         NAME VARCHAR(20)

);

 

INSERT INTO student(id,NAME) VALUES(1,'zs');

INSERT INTO student(id,NAME) VALUES(1,'lisi'); -- ERROR 1062 (23000): Duplicate entry '1' for key 'id'

INSERT INTO student(id,NAME) VALUES(2,'lisi');

 

1.4 主键(非空 唯一)

作用: 非空 唯一

注意:                     

1)常见状态下,每张表都会设置三个主键字段。用于标志表中的每条记下的唯后生可畏性。

2)建议实际不是筛选表的含有业务含义的字段作为主键,建议给每张表独立设计叁个非业务含义的  id字段。

DROP TABLE student;

CREATE TABLE student(

         id INT PRIMARY KEY, -- 主键

         NAME VARCHAR(20)

);

 

INSERT INTO student(id,NAME) VALUES(1,'张三');

INSERT INTO student(id,NAME) VALUES(2,'张三');

-- INSERT INTO student(id,NAME) VALUES(1,'李四'); -- 违反唯生机勃勃节制: Duplicate entry '1' for key 'PTiggoIMA逍客Y'

-- insert into student(name) value('李四'); -- 违反非空约束: EENVISIONRORAV4 1048 (23000): Column 'id' cannot be null

 

1.5 自增长

CREATE TABLE student(

         id INT(4) ZEROFILL PRIMARY KEY AUTO_INCREMENT, -- 自增加,从0开始; ZEROFILL将4位数补充0,如0001

         NAME VARCHAR(20)

);

-- 自增加字段能够不赋值,自动依次增加

INSERT INTO student(NAME) VALUES('张三');

INSERT INTO student(NAME) VALUES('李四');

INSERT INTO student(NAME) VALUES('王五');

 

SELECT * FROM student;

-- 不能够影响自增加度节制

DELETE FROM student;

-- 能够影响自拉长度大概束

TRUNCATE TABLE student;

 

1.6 外键约束

成效:节制二种表的数目

并发二种表的情事:

消灭净尽数据冗余高难题: 独立出一张表            

例如: 员工表  和  部门表

难点应际而生:

比方,今后机关表唯有八个机构,那么在插入职员和工人表数据的时候,工作者表的单位ID字段就不可能插入比部门表的数目多!!!!!      

动用外键约束:限定插入职员和工人表的部门ID字段值

解决办法: 在工作者表的机构ID字段增添三个外键限定

注意:

1)被束缚的表称为副表,节制外人的表称为主表,外键设置在副表上的!!!

2)主表的参照他事他说加以侦察字段通用为主键!

3)加多数据: 先增添主表,再增添副表

4)修改数据: 先订正职和副职表,再校订主表

5)删除数据: 先删除副表,再删除主表

当有了外键节制的时候,必得先修正或删除副表中的全数涉及数据,手艺改改或删除主表!不过,大家愿意直接校订或删除主表数据,进而影响副表数据。能够动用级联操作达成!!!

级联改进: ON UPDATE CASCADE

级联删除: ON DELETE CASCADE

 

规划规范: 提出兼备的表尽量固守三大范式。

首先范式: 要求表的各类字段必须是不可分割的独自单元

                    student     :   name              -- 违反第风流倜傥范式

                                          张小名|狗娃                                        

                     sutdent    : name    old_name    --相符第风度翩翩范式

                                          张小名    狗娃

其次范式: 在第意气风发范式的功底上,需求每张表只发挥一个野趣。表的每一个字段都和表的主键有依靠。

                   employee(工作者): 工作者编号  职员和工人姓名 部门名称   订单名称  --违反第二范式

      职员和工人表:工作者编号  职员和工人姓名 部门名称  

      订单表:  订单号码  订单名称             -- 相符第二范式

其三范式: 在第二范式基础,供给每张表的主键之外的任何字段都不能不和主键有一贯决定依赖关系。

       职员和工人表: 职员和工人编号(主键) 员工姓名  部门编号  部门名 --相符第二范式,违反第三范式      (数据冗余高)

       工作者表:职员和工人编号(主键) 职员和工人姓名  部门编号    --适合第三范式(减少数据冗余)

       部门表:部门编号  部门名

 


事关查询(多表查询)

数据库图谋:

create table `dept` (

         `id` double ,

         `deptName` varchar (60)

);

insert into `dept` (`id`, `deptName`) values('1','软件开荒部');

insert into `dept` (`id`, `deptName`) values('2','应用维护部');

insert into `dept` (`id`, `deptName`) values('3','秘书部');

insert into `dept` (`id`, `deptName`) values('4','总经办');

 澳门新浦京娱乐场网站 6

create table `employee` (

         `id` double ,

         `empName` varchar (60),

         `deptId` double

);

insert into `employee` (`id`, `empName`, `deptId`) values('1','张三','1');

insert into `employee` (`id`, `empName`, `deptId`) values('2','李四','1');

insert into `employee` (`id`, `empName`, `deptId`) values('3','王五','2');

insert into `employee` (`id`, `empName`, `deptId`) values('4','陈六','3');

 澳门新浦京娱乐场网站 7

**************二、关联合检查询(多表查询)****************-

必要:查询职员和工人及其所在部门(展现工作者姓名,部门名称)

2.1 接力连接查询(不引入。产生笛Carl乘积现象:4 * 4=16,有个别是重复记录)

SELECT empName,deptName FROM employee,dept;

--需求:查询工作者及其所在机构(展现工作者姓名,部门名称)

-- 多表查询准绳:1)鲜明询问哪些表   2)分明哪些哪些字段   3)表与表之间总是条件 (规律:连接条件数量是表数据-1)

 

2.2 内接连查询:独有满意条件的结果才交易会示(使用最频仍)

SELECT empName,deptName       -- 2)鲜明怎么着哪些字段

         FROM employee,dept            -- 1)明显询问哪些表

         WHERE employee.deptId=dept.id  -- 3)表与表之间连接条件

         --内一而再再而三的另风度翩翩种语法

SELECT empName,deptName

         FROM employee INNER JOIN dept

         ON employee.deptId=dept.id;

-- 使用外号

SELECT e.empName,d.deptName

         FROM employee e

         INNER JOIN dept d

         ON e.deptId=d.id;

结果:

 澳门新浦京娱乐场网站 8

 

需求: 查询各种机关的职工

 预期结果:

 --  软件开采部  张三

 --  软件开采部  李四

 --  应用维护部  王五

 --  秘书部      陈六

 --  总经办      null

 

2.2 左[外]一而再再而三查询: 行使左边表的多少去相称侧面表的多寡,假使适合连接条件的结果则突显,如若不相符连接条件则显得null

 -- (在乎:左外连接:左表的数额一定会做到彰显!

SELECT d.deptName,e.empName

         FROM dept d

         LEFT OUTER JOIN employee e

         ON d.id=e.deptId;

 

2.3 右[外]一而再查询: 使用右边表的数量去相称左侧表的数目,假若切合连接条件的结果则显得,假若不符合连接条件则展现null

 -- (留心:右外连接:右表的数据一定会完结展现!)

SELECT d.deptName,e.empName

         FROM employee e

         RIGHT OUTER JOIN dept d

         ON d.id=e.deptId;

结果:澳门新浦京娱乐场网站 9

 

 

2.4 自连接查询

-- 须求:查询工作者及其上司

-- 预期结果:      

         -- 张三    null

         -- 李四    张三

         -- 王五    李四

         -- 陈六    王五

SELECT e.empName,b.empName

         FROM employee e

         LEFT OUTER JOIN employee b

澳门新浦京娱乐场网站:知了堂学习心得,mysql数据库进阶。         ON e.bossId=b.id;

 


 

仓库储存进程

5.1 什么是积累进程

仓库储存进度,带有逻辑的sql语句

之前的sql未有法规推断,未有循环

储存进度带上流程序调控制语句(if  while)

5.2 存款和储蓄进程特征

1)奉行功用比超快!存款和储蓄进程是在数据库的服务器端施行的!!!

2)移植性相当差!差异数据库的储存进度是不能够移植。

5.3 存款和储蓄进程语法

-- 创造存款和储蓄进程

DELIMITE宝马X3 $       -- 注明存储进度的终结符

CREATE PROCEDURE pro_test()           --存款和储蓄进程名称(参数列表)

BEGIN             -- 开始

         -- 能够写七个sql语句;          -- sql语句 流程序调控制

         SELECT * FROM employee;

END $            -- 结束 结束符

 

-- 执行存款和储蓄进程

CALL pro_test();          -- CALL 存款和储蓄进度名称(参数);

 

参数:

IN:   表示输入参数,能够带领数量带存款和储蓄进程中

OUT: 表示输出参数,能够从存储进度中回到结果

INOUT: 表示输入输出参数,不只能够输入功用,也能够出口成效

 

-- **************三、存储进度*******************-

-- 证明截止符

-- 成立存款和储蓄进度

DELIMITER $

CREATE PROCEDURE pro_test()

BEGIN

         -- 能够写四个sql语句;

         SELECT * FROM employee;

END $

 

-- 实施存款和储蓄进程

CALL pro_test();

 

-- 3.1 带有输入参数的仓库储存进程

-- 须要:传入二个职员和工人的id,查询工作者音信

DELIMITER $

CREATE PROCEDURE pro_findById(IN eid INT)  -- IN: 输入参数

BEGIN

         SELECT * FROM employee WHERE id=eid;

END $

 

-- 调用

CALL pro_findById(4);

 

-- 3.2 带有输出参数的蕴藏进度

DELIMITER $

CREATE PROCEDURE pro_testOut(OUT str VARCHA大切诺基(20))  -- OUT:输出参数

BEGIN

        -- 给参数赋值

         SET str='helljava';

END $

 

-- 删除存款和储蓄进度

DROP PROCEDURE pro_testOut;


 

-- 调用

-- 怎样选择再次回到参数的值??

-- ***mysql的变量******

--  全局变量(内置变量):mysql数据库内置的变量 (全数连接都起作用)

        -- 查看全部全局变量: show variables

        -- 查看有些全局变量: select @@变量名

        -- 校勘全局变量: set 变量名=新值

        -- character_set_client: mysql服务器的接受数据的编码

        -- character_set_results:mysql服务器输出数据的编码

       

--  会话变量: 只设有于当下客户端与数据库服务器端的一遍三番四次当中。假设一而再再而三断开,那么会话变量全体错过!

        -- 定义会话变量: set @变量=值

        -- 查看会话变量: select @变量

       

-- 局地变量: 在蕴藏进度中选拔的变量就叫局部变量。只要存款和储蓄进程实行完结,局地变量就甩掉!!

-- 1)定义三个对话变量name, 2)使用name会话变量选用藏保存款和储蓄进度的重返值

CALL pro_testOut(@NAME);

-- 查看变量值

SELECT @NAME;

 

-- 3.3 带有输入输出参数的蕴藏进度

DELIMITER $

CREATE PROCEDURE pro_testInOut(INOUT n INT)  -- INOUT: 输入输出参数

BEGIN

   -- 查看变量

   SELECT n;

   SET n =500;

END $

 

-- 调用

SET @n=10;

 

CALL pro_testInOut(@n);

 

SELECT @n;

 

-- 3.4 带有条件决断的蕴藏进度

-- 须求:输入四个整数,假设1,则赶回“星期五”,即使2,重返“星期五”,假若3,重临“星期二”。别的数字,重回“错误输入”;

DELIMITER $

CREATE PROCEDURE pro_testIf(IN num INT,OUT str VARCHAR(20))

BEGIN

         IF num=1 THEN

                  SET str='星期一';

         ELSEIF num=2 THEN

                  SET str='星期二';

         ELSEIF num=3 THEN

                  SET str='星期三';

         ELSE

                  SET str='输入错误';

         END IF;

END $

 

CALL pro_testIf(4,@str);

SELECT @str;

 

-- 3.5 带有循环效率的存款和储蓄进程

-- 须要: 输入八个整数,求和。举例,输入100,总结1-100的和

DELIMITER $

CREATE PROCEDURE pro_testWhile(IN num INT,OUT result INT)

BEGIN

         -- 定义二个有些变量

         DECLARE i INT DEFAULT 1;

         DECLARE vsum INT DEFAULT 0;

         WHILE i<=num DO

               SET vsum = vsum i;

               SET i=i 1;

         END WHILE;

         SET result=vsum;

END $

DROP PROCEDURE pro_testWhile;

CALL pro_testWhile(100,@result);

SELECT @result;

USE day16;


 

6.1 触发器作用

当操作了某张表时,希望同不平日候触发一些动作/行为,可以利用触发器实现!!

 举个例子: 当向职工表插入一条记下时,希望同期以前志表插入数据

-- 需要: 当向职工表插入一条记下时,希望mysql自动相同的时候早前志表插入数据

-- 创造触发器(增加)

CREATE TRIGGER tri_empAdd AFTERAV4 INSERT ON employee FO悍马H2 EACH ROW    -- 当往职员和工人表插入一条记下时

     INSERT INTO test_log(content) VALUES('职员和工人表插入了一条记录');

-- 插入数据

INSERT INTO employee(id,empName,deptId) VALUES(7,'扎古斯',1);

INSERT INTO employee(id,empName,deptId) VALUES(8,'扎古斯2',1);

-- 成立触发器(改良)

CREATE TRIGGER tri_empUpd AFTEWrangler UPDATE ON employee FOEvoque EACH ROW    -- 当往职员和工人表修正一条记下时

INSERT INTO test_log(content) VALUES('职员和工人表改善了一条记录');

-- 修改

UPDATE employee SET empName='eric' WHERE id=7;

-- 成立触发器(删除)

CREATE TRIGGER tri_empDel AFTEEvoque DELETE ON employee FO路虎极光 EACH ROW    -- 当往工作者表删除一条记下时

INSERT INTO test_澳门新浦京娱乐场网站,log(content) VALUES('职员和工人表删除了一条记录');

-- 删除

DELETE FROM employee WHERE id=7;

 


 

7 mysql权力难点

-- ***********五、mysql权限难点****************

 -- mysql数据库权限难点:root :具备富有权力(能够干任何业务)

 -- 权限账户,只具有部分权力(CU途锐D)举例,只可以操作某个数据库的某张表

 -- 怎么样订正mysql的顾客密码?

 -- password: md5加密函数(单向加密)

 SELECT PASSWORD('root'); -- *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B

 

--  mysql数据库,顾客配置 : user表

USE mysql;

 

SELECT * FROM USER;

 

-- 改革密码

UPDATE USER SET PASSWORD=PASSWORD('123456') WHERE USER='root';

 

-- 分配权限账户

GRANT SELECT ON day16.employee TO 'eric'@'localhost' IDENTIFIED BY '123456';

GRANT DELETE ON day16.employee TO 'eric'@'localhost' IDENTIFIED BY '123456';

 

本文由澳门新浦京娱乐场网站发布于数据库,转载请注明出处:澳门新浦京娱乐场网站:知了堂学习心得,mysq