IT十八掌 Mysql 多表查询

多表查询

 

多表设计——外键约束

作用:保证数据的完整性

创建完语句后,可以直接使用修改语句定义

alter table 表名 add foreign key 当前表名 (字段名) references 目标表名 (目标表的主键);

分析:

有一个部门的表,还有一个员工表,

create database day16;

use day16;

create table dept(

did int primary key auto_increment,

dname varchar(30)

);

create table emp(

eid int primary key auto_increment,

ename varchar(20),

salaly double,

dno int

);

insert into dept values(null,‘研发部‘);

insert into dept values(null,‘销售部‘);

insert into dept values(null,‘人事部‘);

insert into dept values(null,‘扯淡部‘);

insert into dept values(null,‘牛宝宝部‘);

insert into emp values(null,‘班长‘,10000,1);

insert into emp values(null,‘美美‘,10000,2);

insert into emp values(null,‘小凤‘,10000,3);

insert into emp values(null,‘如花‘,10000,2);

insert into emp values(null,‘芙蓉‘,10000,1);

insert into emp values(null,‘东东‘,800,null);

insert into emp values(null,‘波波‘,1000,null);

update emp set salaly=2500 where eid = 5;

* 把研发部删除?

* 研发部下有人员?该操作不合理。

* 引入外键约束?

* 作用:保证数据的完整性。

* 添加外键

语法:alter table emp add foreign key 当前表名(dno) references 关联的表(did);

alter table emp add foreign key emp(dno) references dept(did);

删除delete from dept where did = 1;

多表设计中三种实体关系

1:N 的联系可不引入关系表

例如:一个班级可以有多个学生,但是一个学生只能属于一个班级。或者部门与员工之间的关系。这些都是属于一对多的例子。那一对多在数据库设计中是怎么描述的呢?画图举例部门与员工的关系。

M:N的联系引入关系表

例如:在生活中一个学生可以选择多门课程,每一门课程也可以被多个学生所选择。这些例子在数据库设计中可以使用多对多来完成。

建表原则:

需要创建第三张表,该表中至少有两个字段,作为外键分别指向多对多的双方的主键。

联系的属性及两个实体的主标识形成关系表。

关系表的主键为两个实体主标识的组合

1:1的联系不用引入关系表(很少用)

在生活中,1对1的应用比较少,因为完全可以作为一张表出现。但是有可能公司的业务原因,而需要设计1对1的表结构。例如:一个公司对应一个地址,一个地址也只能对应一个公司

建表原则:

第一种是主键对应

将两个表的主键进行关联

第二种是唯一外键对应

在任何一方加一个外键,但是需要设置成唯一(unique),指向另一方的主键

多表设计实例

假设模拟一个购物网站的表结构设计

那购物的网站一般都包含一些基本实体:例如用户、订单、商品、分类等等。

设计表结构首先需要分清楚各个实体之间的关系。

例如用户可以产生多个订单、一种分类下可以有多个商品、一个订单中可以有多个商品、一种商品可以在多个订单中。

可以画图描述各个实体之间的关系

多表查询——笛卡尔积(了解)

多表的查询

笛卡尔积的概念:(了解)

表A表B

aid anamebidbname

a1aa1b1bb1

a2aa2b2bb2

b3bb3

* 查询的语法

select * from 表A,表B;返回的结果就是笛卡尔积。

结果:

a1aa1b1bb1

a1aa1b2bb2

a1aa1b3bb3

a2aa2b1bb1

a2aa2b2bb2

a2aa2b3bb3

select * from dept,emp;

 多表查询

内连接(用的比较多)

      普通内连接

      通过使用 select * from 表1 inner join 表2 on 条件

      隐式内连接

      通过使用select * from 表1,表2 where 条件

 

普通内连接

* 前提条件:需要有外键的。

* 提交关键字inner join ... on

select * from dept inner join emp on dept.did = emp.dno;

隐式内连接(用的是最多的)

* 可以不使用inner join ... on关键字

select * from dept,emp where dept.did = emp.dno;

多表查询—外链接

左外连接(把左边表所有的数据都查出来)

语法:select * from 表1 left outer join 表2 … On

右外连接 (把右边表所有的数据都查出来)

语法:select * from 表1 right outer join 表2 … On

画图描述链接的区别

* 外连接

* 左外链接(看左表,把左表所有的数据全部查询出来)

* 前提条件:需要有外键的。

* 语法:使用关键字left [outer] join ... on

select * from dept left outer join emp on dept.did = emp.dno;

* 右外链接(看右表,把右表所有的数据全部查询出来)

* 前提条件:需要有外键的。

* 语法:使用关键字right [outer] join ... on

select * from dept right join emp on dept.did = emp.dno;

多表查询—子查询

在sql语言中,select…from…语为一个查询块,将一个查询块嵌套在另一个查询块中作为条件称为嵌套查询,也称为子查询.

外层的查询块称为父查询,内层的查询块称为子查询。

语法:select * from table where 条件 > (select * from table where 条件)

* 查询的内容需要另一个查询的结果。

select * from emp where ename > (select * from emp where 条件);

any 任意

all全部

>any大于结果的最小值

>all大于结果的最大值

作业

查看所有人所属的部门名称和员工名称?

select dept.dname,emp.ename from dept,emp where dept.did = emp.dno;

select d.dname,e.ename from dept d,emp e where d.did = e.dno;

统计每个部门的人数(按照部门名称统计,分组group by  count)

select d.dname,count(*) from dept d,emp e where d.did = e.dno group by d.dname;

统计部门的平均工资(按部门名称统计 ,分组group by  avg)

select d.dname,avg(salaly) from dept d,emp e where d.did = e.dno group by d.dname;

统计部门的平均工资大于公司平均工资的部门(子查询)

* 公司的平均工资

select avg(salaly) from emp;

* 部门的平均工资

select d.dname,avg(e.salaly) as sa from dept d,emp e where d.did = e.dno group by d.dname having sa > (select avg(salaly) from emp);

 

时间: 2024-10-31 16:01:00

IT十八掌 Mysql 多表查询的相关文章

python3 mysql 多表查询

python3 mysql 多表查询 一.准备表 创建二张表: company.employee company.department #建表 create table department( id int, name varchar(20) ); create table employee( id int primary key auto_increment, name varchar(20), sex enum('male','female') not null default 'male'

MySQL多表查询回顾

----------------------siwuxie095 MySQL 多表查询回顾 以客户和联系人为例(一对多) 1.内连接 /*内连接写法一*/ select * from t_customer c,t_linkman l where c.cid=l.clid /*内连接写法二(inner 可以省略不写)*/ select * from t_customer c inner join t_linkman l on c.cid=l.clid 2.左外连接 /*左外连接(outer 可以省

mysql多表查询方法(left join(左连接),right join (右连接),inner join (内连接)的区别)

表A记录如下:  aID aNum  1 a20050111  2 a20050112  3 a20050113  4 a20050114  5 a20050115  表B记录如下:  bID bName  1 2006032401  2 2006032402  3 2006032403  4 2006032404  8 2006032408  创建这两个表SQL语句如下:  CREATE TABLE a  aID int( 1 ) AUTO_INCREMENT PRIMARY KEY ,  a

MySQL information_schema表查询导致内存暴涨

case:下面的一条sql语句,导致mysql实例内存暴涨: select * from tables where table_name not in(select table_name from partitions group by table_name having count(*)>1 ); mysql 5.5, 1w+的innodb表. 下面看下调查的结果: 1.  sql的执行情况以及内存分配:   step1: 构造information_schema.tables临时表 1.1 

MYSQL 连表查询及别名用法

MYSQL连表查询是两个表之间的查询或者更多表之间查询,通过外键的方式查询所有的数据,在查询过程中产生字段的重复,为了区分这种情况数据库设计别名,有的表很长,也可以用别名. 1,连表查询 INNER JOIN ,LEFT JOIN,RIGHT JOIN INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录.LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录.RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表

4 - MySQL:多表查询

MySQL:多表查询 一,介绍 本节主题 多表连接查询 复合条件连接查询 子查询 准备工作 #建表 create table department( id int, name varchar(20) ); create table employee( id int primary key auto_increment, name varchar(20), sex enum('male','female') not null default 'male', age int, dep_id int

记一次mysql多表查询(left jion)优化案例

一次mysql多表查询(left jion)优化案例 在新上线的供需模块中,发现某一个查询按钮点击后,出不来结果,找到该按钮对应sql手动执行,发现需要20-30秒才能出结果,所以服务端程序判断超时,故先不显示结果 以下是对这条查询的优化记录 1 数据库配置 数据库配置:4C8G 主表数据:3W+ 2 sql语句 提取sql语句,简化如下 SELECT taba.id, taba.title, taba.type, taba.end_time, tabb.username, tabc.orgna

python开发mysql:单表查询&多表查询

一 单表查询,以下是表内容 1 一 having 过滤 2 1.1 having和where 3 select * from emp where id > 15; 4 解析过程;from > where 找到数据 > 分组(没有默认一个组)> select 打印 where是出结果之前 5 select * from emp having id > 15; 6 解析过程;from > where 找到数据(没有约束条件,就是整个表)) > 分组(没有默认一个组)&

mysql联表查询,使用phpStudy自带的

一.内联结.外联结.左联结.右联结的含义及区别在SQL标准中规划的(Join)联结大致分为下面四种:1.内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结.2.外联结:分为外左联结和外右联结.左联结A.B表的意思就是将表A中的全部记录和表B中联结的字段与表A的联结字段符合联结条件的那些记录形成的记录集的联结,这里注意的是最后出来的记录集会包括表A的全部记录.右联结A.B表的结果和左联结B.A的结果是一样的,最后出来的记录集会包括表B的全部记录.具体如下: Select l