先给大家回顾一下基础篇我们讲的内容
mysql基础
1)mysql存储结构: 数据库 -> 表 -> 数据 sql语句
2)管理数据库:
增加: create database 数据库 defaultcharacter utf8;
删除: drop database 数据库;
修改: alter database 数据库 defaultcharacter gbk;
查询: show databases / show create database 数据库;
3) 管理表:
选择数据库:use 数据库;
增加: create table表(字段名1 字段类型,字段名2 字段类型......);
删除: drop table 表;
修改:
添加字段: alter table 表 add [column] 字段名字段类型;
删除字段: alter table 表 drop [column] 字段名;
修改字段类型: alter table 表 modify 字段名新的字段类型;
修改字段名称: alter table 表 change 旧字段名 新字段名 字段类型;
修改表名称: alter table 表 rename [to] 新表名;
查询:
showtables / desc student;
4) 管理数据:
增加: insert into 表(字段1,字段2,。。。) values(值1,值2.。。。。);
删除: delete from 表 where 条件;
修改: update 表 set 字段1=值1,字段2=值2...... where 条件;
查询:
4.1)所有字段: select * from 表;
4.2)指定字段: select 字段1,字段2.... from 表;
4.3)指定别名: select 字段1 as 别名 from 表;
4.4 )合并列: select (字段1+字段2) from 表;
4.5)去重: select distinct 字段 from 表;
4.6)条件查询:
a)逻辑条件:and(与) or(或)
select* from 表 where 条件1 and/or 条件2
b)比较条件: > < >= <= = <> between and(在。。。之间)
select* from 表 where servlet>=90;
c)判空条件:
判断null: is null / is not null
判断空字符串: ='' / <>''
d)模糊条件: like
%: 替换任意个字符
_: 替换一个字符
4.7分页查询:limit 起始行,查询行数
起始行从0开始
4.8排序: order by 字段 asc/desc
asc:正序,顺序
desc:反序,倒序
4.9分组查询:group by 字段
4.10:分组后筛选: having 条件
SQL语句的分类:
DDL:数据定义语言
create/ drop / alter
DML:数据操作语句
insert/ delete /update / truncate
DQL:数据查询语言:
select / show------ 数据约束
--- 什么是数据约束 (对用户操作表的数据进行约束)
1.默认值
作用: 当用户对使用默认值的字段不插入值的时候,就使用默认值。
注意:
1)对默认值字段插入null是可以的。
2)对默认值字段可以插入非null
例如我们将学生表的地址都设置为 北京
CREATE TABLE student(
idINT,
NAMEVARCHAR(20),
address VARCHAR(20) DEFAULT '北京' -- 默认值
)
-- 当字段没有插入值的时候,mysql自动给该字段分配默认值 看下图 我们在1处设置默认为北京 在 2处我们并没有添加 地址, MySQL 回自动给我们添加上默认的地址
-- 注意:默认值的字段允许为null
------非空
---- 作用:限制 字段必须赋值
----注意 : 非空字段必须赋值 非空字符不能赋null
我们没有向设置的非空字段添加数据时 就会出现警告
非空字符不能赋null 如果 赋值为null 就会报错
唯一
------ 作用: 对字段的值不能重复
-------注意: 唯一字断可以插入null, 唯一字段可以插入多个null
看下图 当我们设置 sid 为唯一字段时 在2处我们插入一条语句 但是当我们在2处添加第二条语句时 因为sid 同样为1 所以会报错
主键
作用: 非空+唯一
注意:
1)通常情况下,每张表都会设置一个主键字段。用于标记表中的每条记录的唯一性。
2)建议不要选择表的包含业务含义的字段作为主键,建议给每张表独立设计一个非业务含义的 id字段。
看下图 我们在1处用关键字 primary key 设置sid 为主键 然后在2处插入一条数据 然后在3处继续插入一条数据 然后就会发现报错了
自增长
作用: 自动递增
我们在 1处设置sid 为自增长 然后在2处插入数据 可以看到输出的结果是从0001自增到 0003
外键 (重点)
作用:约束两种表的数据
出现两种表的情况:
解决数据冗余高问题:独立出一张表
例如:员工表 和 部门表
问题出现:在插入员工表数据的时候,员工表的部门ID字段可以随便插入!!!!!
使用外键约束:约束插入员工表的部门ID字段值
解决办法: 在员工表的部门ID字段添加一个外键约束
-- 部门表(主表)
CREATE TABLE dept(
id INT PRIMARY KEY,
deptName VARCHAR(20)
)
-- 修改员工表(副表/从表)
CREATE TABLE employee(
idINT PRIMARY KEY,
empName VARCHAR(20),
deptId INT,-- 把部门名称改为部门ID
--声明一个外键约束
CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCESdept(id)
-- 外键名称 外键 参考表(参考字段)
)
注意:
1)被约束的表称为副表,约束别人的表称为主表,外键设置在副表上的!!!
2)主表的参考字段通用为主键!
3)添加数据:先添加主表,再添加副表
4)修改数据:先修改副表,再修改主表
5)删除数据:先删除副表,再删除主表
-----------外键约束
-- 员工表
CREATE TABLE employee(
idINT PRIMARY KEY,
empNameVARCHAR(20),
deptNameVARCHAR(20) -- 部门名称
)
INSERT INTO employee VALUES(1,'张三','软件开发部');
INSERT INTO employee VALUES(2,'李四','软件开发部');
INSERT INTO employee VALUES(3,'王五','应用维护部');
SELECT * FROM employee;
-- 添加员工,部门名称的数据冗余高
INSERT INTO employee VALUES(4,'陈六','软件开发部');
-- 解决数据冗余高的问题:给冗余的字段放到一张独立表中
-- 独立设计一张部门表
CREATE TABLE dept(
idINT PRIMARY KEY,
deptNameVARCHAR(20)
)
-- 修改员工表
CREATE TABLE employee(
idINT PRIMARY KEY,
empNameVARCHAR(20),
deptIdINT,-- 把部门名称改为部门ID
--声明一个外键约束
CONSTRAINTemlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ONDELETE CASCADE -- ON CASCADE UPDATE :级联修改
-- 外键名称 外键 参考表(参考字段)
)
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); -- 违反外键约束: Cannotadd or update a child row: a foreign key constraint fails (`day16`.`employee`,CONSTRAINT `emlyee_dept_fk` FOREIGN KEY (`deptId`) REFERENCES `dept` (`id`))
-- 1)当有了外键约束,添加数据的顺序:先添加主表,再添加副表数据
-- 2)当有了外键约束,修改数据的顺序:先修改副表,再修改主表数据
-- 3)当有了外键约束,删除数据的顺序:先删除副表,再删除主表数据
-- 修改部门(不能直接修改主表)
UPDATE dept SET id=4 WHERE id=3;
-- 先修改员工表
UPDATE employee SET deptId=2 WHERE id=4;
-- 删除部门
DELETE FROM dept WHERE id=2;
-- 先删除员工表
DELETE FROM employee WHERE deptId=2;
SELECT * FROM dept;
SELECT * FROM employee;
----------------级联操作
问题: 当有了外键约束的时候,必须先修改或删除副表中的所有关联数据,才能修改或删除主表!但是,我们希望直接修改或删除主表数据,从而影响副表数据。可以使用级联操作实现!!!
级联修改: ON UPDATE CASCADE
级联删除: ON DELETE CASCADE
CREATE TABLE employee(
idINT PRIMARY KEY,
empNameVARCHAR(20),
deptIdINT,-- 把部门名称改为部门ID
--声明一个外键约束
CONSTRAINTemlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ONUPDATE CASCADE ON DELETE CASCADE -- ON CASCADE UPDATE :级联修改
-- 外键名称 外键 参考表(参考字段)
)
注意:级联操作必须在外键基础上使用
-- 级联修改(修改)
-- 直接修改部门
UPDATE dept SET id=5 WHERE id=4;
-- 级联删除
-- 直接删除部门
DELETE FROM dept WHERE id=1;
--------- 下一篇讲解数据库的设计