Mysql约束和多表查询

数据完整性

  • 作用:保证用户输入的数据保存到数据库中是正确的
  • 确保数据的完整性:在创建表时给表中添加约束
  • 完整性的分类:
    • 实体完整性
    • 域完整性
    • 引用完整性
实体完整性约束
  • 实体:即表中的一行(一条记录)代表一个实体(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)
  • 特点:数据不能重复,可以为null
 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'
);
引用完整性约束
  • 外键约束:foreign key
  • 示例:
    • 第一种添加外键方式。推荐
	 #学生表(主表)
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);

多表查询

多表关系
  • 一对一
  • 一对多
  • 多对多
  • 注:具体事例有很多,以生活中来参考
多表查询
  • 合并结果集
    • UNION
    • UNION ALL
  • 连接查询
    • 内连接【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;
  • 查询用户id为1的所有订单详情
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 = '张三'
);
  • 查询出订单的价格大于800的所有用户信息
SELECT * 
FROM USER 
WHERE userId IN(
SELECT DISTINCT userId 
FROM 
orders 
WHERE totalprice>800
);
分页查询
  • 查询商品表第三页的信息,每页3条信息
SELECT * FROM products LIMIT 6,3;
简单介绍就到这里,感谢您的观看
发布了16 篇原创文章 · 获赞 15 · 访问量 2220

猜你喜欢

转载自blog.csdn.net/weixin_43688349/article/details/104206577