0mysql的表连接_从零学习数据库mysql--表的操作

数据库的完整性

什么是数据的完整性

保证用户输入的数据保存到数据库中是正确的。

如何添加数据完整性

在创建表时给表中添加约束

完整性分类

实体完整性

域完整性

参照完整性

实体完整性

什么是实体完整性

表中的一行(一条记录)代表一个实体(entity)

实体完整性的作用

标识每一行数据不重复。行级约束

约束类型

主键约束(primary key)

唯一约束(unique)

自动增长列(auto_increment)

主键约束

特点:

每个表中要有一个主键

数据唯一,且不能为null

添加主键约束的方式

CREATE TABLE 表名(字段名1 数据类型 primary key,字段2 数据类型);

CREATE TABLE 表名(字段1 数据类型, 字段2 数据类型,primary key(要设置主键的字段));

CREATE TABLE 表名(字段1 数据类型, 字段2 数据类型,primary key(主键1,主键2));

联合主键: 两个字段数据同时相同时,才违反联合主键约束。

1.先创建表

2.再去修改表,添加主键

ALTER TABLE student ADD CONSTRAINT PRIMARY KEY (id);

唯一约束:

特点:

指定列的数据不能重复

可以为空值

CREATE TABLE 表名(字段名1 数据类型 字段2 数据类型 UNIQUE);

自动增长列

特点:

指定列的数据自动增长

即使数据删除,还是从删除的序号继续往下

CREATE TABLE 表名(字段名1 数据类型 PRIMARY KEY AUTO_INCREMENT ,字段2 数据类型 UNIQUE);

域完整性

限制此单元格的数据正确,不对照此列的其它单元格比较

域代表当前单元格

域完整性约束:

数据类型 :

数值类型、日期类型、字符串类型

非空约束(not null)

CREATE TABLE 表名(字段名1 数据类型 PRIMARY KEY AUTO_INCREMENT ,字段2 数据类型 UNIQUE not null);

默认值约束(default)

CREATE TABLE 表名(字段名1 数据类型 PRIMARY KEY AUTO_INCREMENT ,字段2 数据类型 UNIQUE not null default '男');

​插入的时候,values当中的值直接给default

参照完整性

什么是参照完整性

是指表与表之间的一种对应关系

通常情况下可以通过设置两表之间的主键、外键关系,或者编写两表的触发器来实现。

有对应参照完整性的两张表格,在对他们进行数据插入、更新、删除的过程中,系统都会将被修改表格与另一张对应表格进行对照,从而阻止一些不正确的数据的操作。

数据库的主键和外键类型一定要一致;

两个表必须得要是InnoDB类型

设置参照完整性后 ,外键当中的内值,必须得是主键当中的内容

一个表设置当中的字段设置为主键,设置主键的为主表

CREATE TABLE student(sid int PRIMARY key,name varchar(50) not null,sex varchar(10) default '男');

创建表时,设置外键,设置外键的为子表

CREATE TABLE score(

sid INT,

score DOUBLE,

CONSTRAINT fk_stu_score_sid FOREIGN KEY(sid) REFERENCES student(id));

表之间关系

一对一

一夫一妻

一对多关系

一个人可以拥有多辆汽车,要求查询某个人拥有的所有车辆。

创建Person表

bd829c5615c885288442bd4f7b136f69.png

创建Car表

a8f388703d6fc6bf43d5065557805cbb.png

6a8282da9522ae948f57d616e122b8cf.png

多对多关系

学生选课,一个学生可以选修多门课程,每门课程可供多个学生选择。

一个学生可以有多个老师,而一个老师也可以有多个学生

创建老师表

1e9d43b9657cf0c8e1ec72740dd8195d.png

创建学生表

cef829c9a8b928bce04f540070ba01fa.png

创建学生与老师关系表

2222bdb44e800ba597595e7e62e38675.png

关系图

f867e9015185e86d2420093def9920e6.png

添加外键

0b58fc2c313bc51baf6718ea00fb6c11.png

e9b0e34a72f6f67dc0c988148202dba6.png

多表操作

合并结果集

什么是合并结果集

合并结果集就是把两个select语句的查询结果合并到一起

合并结果集的两种方式

UNION

合并时去除重复记录

UNION ALL

合并时不去除重复记录

格式:

UNION:

SELECT * FROM 表1 UNION SELECT * FROM 表2;

SELECT * FROM 表1 UNION ALL SELECT * FROM 表2;

创建表:

aa9bc6721cf86833f4f8081465bca42d.png

UNION:

ac530ea29218fd405199b226f17b1e8c.png

5839750610232f3dbe23c2101dd82fdb.png

UNION ALL:

b5553b9ac598bdc28bbd3326785fdf40.png

00c6d47fa9bfa6cc18b9296e38b62331.png

注意事项:被合并的两个结果:列数、列类型必须相同。

多表联查:

什么是连接查询

也可以叫跨表查询,需要关联多个表进行查询

什么是笛卡尔集

假设集合A={a,b},集合B={0,1,2},

则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。

可以扩展到多个集合的情况

同时查询两个表,出现的就是笛卡尔集结果

查询时给表起别名

18000a99499d7f5972d530fa3d5bb652.png

多表联查,如何保证数据正确

逐行判断,相等的留下,不相等的全不要

4490a98400c83f78a87599894264a15b.png

连接查询

1. 内连接

内连接

图示:

f87834cdecf8549b0ab1ecb612f1b56e.png

作用:查询两张表的共有部分

语句:

Select from tableA A Inner join tableB B on A.Key = B.Key

示例:

SELECT * from employee e INNER JOIN department d on e.depart_id = d.id;

多表连接:

建表:

3ed5e4ce153228bd848b04d498105653.png

使用99连接法:

3d3b34130c00a0546f6ed2a7c1b3da8d.png

使用内联查询

8ffe273279d140d9d433ba69c01f9fff.png

77a6449f63dc4fce07dae4950d158bdf.png

2. 左连接

图示

54c61281a7d02ffa59beaf19b1eef867.png

作用:把左边表的内容全部查出,右边表只查出满足条件的记录

语句:

Select from tableA A Left Join tableB B on A.Key = B.Key

示例

SELECT * from employee e LEFT JOIN department d on e.depart_id = d.id;

65a24ce943dd74711169786d451ffb4a.png

29b4d29a37f5a80616f7264b2cc5847a.png

3. 右连接

图示:

891851b0bdbd1d5dde304df828d18781.png

作用

把右边表的内容全部查出,左边表只查出满足条件的记录

语句

Select from tableA A Right Join tableB B on A.Key = B.Key

示例

SELECT * from employee e RIGHT JOIN department d on e.depart_id = d.id;

eb74e1c55ba237f06711af3b89955452.png

c0b1b823350192dda1398a53c0bbe23c.png

子查询

什么是子查询

一个select语句中包含另一个完整的select语句。 或两个以上SELECT,那么就是子查询语句了。

子查询出现的位置

where后,把select查询出的结果当作另一个select的条件值

from后,把查询出的结果当作一个新表;

示例表

7a68329dd250dd0a4e0a7031170516c0.png

使用

查询与项羽同一个部门人员工

先查出项羽所在的部门编号

e02d7f1f4745421aa247e2331430cd09.png

再根据编号查同一部门的员工

6cd0804f4078ee822fd2a86e8a6c1049.png

把第1条查出来的结果当第2天语句的条件

查询工资高于程咬金的员工

查出程咬金的工资

057dbf0190b03af839ebf67131e40766.png

再去根据查出的结果查询出大于该值的记录员工名称

647cc38a2a6b3fa0870f67a1567e4168.png

工资高于30号部门所有人的员工信息

先查出30号部门工资最高的那个人

05a12129c7a7a5a8689cb416f5c1c4ec.png

再到整个表中查询大于30号部门工资最高的那个人

d69d380abce191582683c6b23da8fab5.png

查询工作和工资与妲己完全相同的员工信息

先查出妲已的工作和工资

a6c88561dbc8f153b8614c80d23adba2.png

根据查询结果当作条件再去查询工作和工资相同的员工

由于是两个条件,使用 IN进行判断

11ec3e71243030205bd985dd8f91184b.png

有2个以上直接下属的员工信息

对所有的上级编号进行分组

9a4178201a55dc0a7c05ebb82b73da71.png

找出大于2个的,大于2个说明有两个下属

9526e26a4ff35ec9d6417c0f610bf902.png

把上条的结果当作员工编号时行查询

0ead0a6ceac19d704ddf323b2bb31173.png

查询员工编号为7788的员工名称、员工工资、部门名称、部门地址

4185bc2010464ecf181d5ca61819bef7.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值