数据完整性
- 作用:保证用户输入的数据保存到数据库中是正确的
- 确保数据的完整性:在创建表时给表中添加约束
- 完整性的分类:
实体完整性约束
- 实体:即表中的一行(一条记录)代表一个实体(entity)
- 实体完整性的作用:标识每一行数据不重复
- 约束类型:
- 主键约束(primary key)
- 唯一约束(unique)
- 自动增长列(auto_increment)
主键约束(primary key)
- 注:每个表中要有一个主键
- 特点:数据唯一,且不能为null
- 示例:
- 第一种添加方式:
CREATE TABLE student(
id INT PRIMARY KEY,
NAME VARCHAR(20)
);
CREATE TABLE student(
id INT,
NAME VARCHAR(20),
PRIMARY KEY(id)
);
#创建联合主键
CREATE TABLE student(
classid INT,
stuid INT,
NAME VARCHAR(20),
PRIMARY KEY(classid,stuid)
);
#不建议使用此种方式添加主键
CREATE TABLE student(
id INT,
NAME VARCHAR(20)
);
ALTER TABLE student ADD PRIMARY KEY(id);
唯一约束(unique)
CREATE TABLE student(
id INT PRIMARY KEY,
NAME VARCHAR(20) UNIQUE
);
自动增长列(auto_increment)
- sqlserver数据库(identity)Oracle数据库(sequence)
- 自动增长不能单独使用,一般需要和主键配合
- 注:给主键添加自动增长的数值,列只能是数值类型
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
域完整性约束
- 域完整性约束的作用:限制此单元格的数据正确,不对其它单元格起作用,域代表当前单元格
- 域完整性约束:数据类型、非空约束(not null)、默认值约束(default)、check约束(mysql5.5不支持)check(sex='男’or sex=‘女’)
- 数据类型在上一个博客提了一下,这里就不具体介绍
非空约束(not null)
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
sex VARCHAR(10)
);
默认约束(default)
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
sex VARCHAR(10) DEFAULT 'male'
);
引用完整性约束
#学生表(主表)
CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
sex VARCHAR(10) DEFAULT 'male'
);
#成绩表(从表)
CREATE TABLE score(
id INT,
score INT,
sid INT,
FOREIGN KEY(sid) REFERENCES student(sid)
);
ALTER TABLE score ADD CONSTRAINT fk_stu_score FOREIGN KEY(sid) REFERENCES student(sid);
多表查询
多表关系
- 一对一
- 一对多
- 多对多
- 注:具体事例有很多,以生活中来参考
多表查询
- 合并结果集
- 连接查询
- 内连接【INNER】JOIN ON
- 外连接OUTER JOIN ON
- 左外连接LEFT【OUTER】JOIN
- 右外连接RIGHT【OUTER】JOIN
- 子查询
合并结果集
- 作用:合并结果集就是把两个select语句的查询结果合并到一起
- 合并结果集有两种方式:
- UNION:去除重复记录
- UNION ALL:不去除重复记录
#UNION
SELECT * FROM student UNION SELECT * FROM score;
#UNION ALL
SELECT * FROM student UNION ALL SELECT * FROM score;
连接查询
- 连接查询就是求出多个表的乘积,列如:t1连接t2,那么查询出的结果就是t1*t2
- 连接查询会产生笛卡尔积
- 示例
SELECT stu.sid,stu.name,stu.sex,sc.score
FROM student stu,score sc
WHERE stu.sid=sc.sid;
SELECT *
FROM student
INNER JOIN score
ON student.sid=score.id;
- 外连接
- 左外连接
- 以左表为主表,右表时从表
- 左连接是先查询出左表(即以左表为主),然后查询右表,左表中满足条件和不满足条件都显示出来,右边不满足条件的显示null
SELECT *
FROM student stu
LEFT OUTER JOIN score sc
ON stu.sid=sc.sid;
- 右外连接(和右外连接相反)
- 以右表为主表,左表为从表
SELECT *
FROM student stu
RIGHT OUTER JOIN score sc
ON stu.sid=sc.sid;
- 连接查询总结:连接查询可以为多张表,不限于两张表,去除笛卡尔积通常以主外键关系去除
子查询
- 一个select语句中包含另一个完整的select语句
- 子查询就是嵌套查询,即select中包含select,如果一条语句中存在两个,或两个以上select,那么就是子查询语句了。里面的查询叫子查询,外面的查询叫父查询,一般情况下都是先执行子查询,再执行父查询
子查询出现的位置:
a.where,作为被查询的条件的一部分
b.from后,作为临时表
当子查询出现在where后作为条件时,还可以使用如下关键字
a.any
b.all
子查询结果集的常见形式
a.单行单列(用于条件)
b.多行单列(用于条件)
c.多行多列(用于表)
导出导入数据库
- 导出导入数据库有很多方法,者里就不介绍,可视化工具的导入导出方式,只介绍命令方式
- 导出数据库表
mysqldump -uroot -p 数据库名 > 导出路径/名字.sql
#先登录数据库
mysql -uroot -p
#然后选择数据库
use 数据库
#导入
source 路径名/名字.sql
综合练习
#创建用户表
CREATE TABLE USER(
userId INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL,
PASSWORD VARCHAR(18) NOT NULL,
address VARCHAR(100),
phone VARCHAR(11)
);
#一对多的实现
#创建分类表
CREATE TABLE category(
cid VARCHAR(32) PRIMARY KEY ,
cname VARCHAR(100) NOT NULL
#分类名称
);
# 商品表
CREATE TABLE `products` (
`pid` VARCHAR(32) PRIMARY KEY,
`name` VARCHAR(40) ,
`price` DOUBLE(7,2),
category_id VARCHAR(32),
CONSTRAINT FOREIGN KEY(category_id) REFERENCES category(cid)
);
#多对多的实现
#订单表
CREATE TABLE `orders`(
`oid` VARCHAR(32) PRIMARY KEY ,
`totalprice` DOUBLE(12,2),
#总计
`userId` INT,
CONSTRAINT FOREIGN KEY(userId) REFERENCES USER(userId)
#外键
);
#订单项表
CREATE TABLE orderitem(
oid VARCHAR(32),
#订单id
pid VARCHAR(32),
#商品id
num INT ,
#购买商品数量
PRIMARY KEY(oid,pid),
#主键
FOREIGN KEY(oid) REFERENCES orders(oid),
FOREIGN KEY(pid) REFERENCES products(pid)
);
#初始化数据
#用户表添加数据
INSERT INTO USER(username,PASSWORD,address,phone) VALUES('张三','123','北京昌平沙 河','13812345678');
INSERT INTO USER(username,PASSWORD,address,phone) VALUES('王五','5678','北京海 淀','13812345141');
INSERT INTO USER(username,PASSWORD,address,phone) VALUES('赵六','123','北京朝 阳','13812340987');
INSERT INTO USER(username,PASSWORD,address,phone) VALUES('田七','123','北京大 兴','13812345687');
#给分类表初始化数据
INSERT INTO category VALUES('c001','电器');
INSERT INTO category VALUES('c002','服饰');
INSERT INTO category VALUES('c003','化妆品');
INSERT INTO category VALUES('c004','书籍');
#给商品表初始化数据
INSERT INTO products(pid,NAME,price,category_id) VALUES('p001','联想',5000,'c001');
INSERT INTO products(pid,NAME,price,category_id) VALUES('p002','海尔',3000,'c001');
INSERT INTO products(pid,NAME,price,category_id) VALUES('p003','雷神',5000,'c001');
INSERT INTO products(pid,NAME,price,category_id) VALUES('p004','JACK JONES',800,'c002');
INSERT INTO products(pid,NAME,price,category_id) VALUES('p005','真维斯',200,'c002');
INSERT INTO products(pid,NAME,price,category_id) VALUES('p006','花花公子',440,'c002');
INSERT INTO products(pid,NAME,price,category_id) VALUES('p007','劲霸',2000,'c002');
INSERT INTO products(pid,NAME,price,category_id) VALUES('p008','香奈儿',800,'c003');
INSERT INTO products(pid,NAME,price,category_id) VALUES('p009','相宜本草',200,'c003');
INSERT INTO products(pid,NAME,price,category_id) VALUES('p010','梅明子',200,NULL);
#添加订单
INSERT INTO orders VALUES('o6100',18000.50,1);
INSERT INTO orders VALUES('o6101',7200.35,1);
INSERT INTO orders VALUES('o6102',600.00,2);
INSERT INTO orders VALUES('o6103',1300.26,4);
#订单详情表
INSERT INTO orderitem VALUES('o6100','p001',1),('o6100','p002',1),('o6101','p003',1);
多表查询
SELECT o.oid,o.totalprice,u.userId,u.username
FROM orders o
INNER JOIN
USER u
ON o.userId=u.userId;
SELECT o.oid,o.totalprice,o.userId,u.username,om.pid
FROM orders o
INNER JOIN USER u
ON o.userId=u.userId
INNER JOIN orderitem om
ON o.oid=om.oid
WHERE u.userId=1;
子查询
SELECT *
FROM orders
WHERE userId=(
SELECT userId
FROM USER
WHERE username = '张三'
);
SELECT *
FROM USER
WHERE userId IN(
SELECT DISTINCT userId
FROM
orders
WHERE totalprice>800
);
分页查询
SELECT * FROM products LIMIT 6,3;
简单介绍就到这里,感谢您的观看