Mysql:交叉连接、内连接

发布于:2024-05-07 ⋅ 阅读:(21) ⋅ 点赞:(0)

打开Navicat Premium,新建数据库,创建两个表dept和emp:

create table dept(did int(4) primary key,dname varchar(36));
create table emp(id int(4) primary key,name varchar(36),age int(2),did int(4) not null);

插入数据:
insert into dept values(1,'网络部'),(2,'媒体部'),(3,'研发部'),(4,'人事部');
insert into emp values(1,'刘一',20,1),(2,'陈二',22,1),(3,'张三',20,2),(4,'李四',20,4);

#交叉连接 #行数相乘  列数相加
#select * from 表1 cross join 表2;
select * from dept cross join emp;
select dept.dname,emp.name from dept cross join emp;
#select did from dept cross join emp;  #两个表都有的字段,查询失败
#内连接
#select 查询字段 from 表1 [inner] join 表2 on 表1.关系字段=表2.关系字段;
#内连接使用比较运算符对两个表中的数据进行比较,并列出与连接条件匹配的数据行,组合成新的记录。只有满足条件的记录才能出现在查询结果中
select * from dept join emp on dept.did=emp.did;   #第二个表中的did在字段中变为did(1)
#select emp.name,dept.dname from dept join emp on dept.did=emp.did;
#select name,dname from dept join emp on dept.did=emp.did;
#上边两个表的结果相同,即如果字段名不重复,可以不用表名+字段名,直接使用字段名
select e.name,d.dname from dept as d join emp as e on d.did=e.did;
#使用as给表名命名,以缩短输入
#where条件语句可以替换on实现同样功能
#如:
select * from dept join emp on dept.did=emp.did;
select * from dept,emp where dept.did=emp.did;
#自连接
#如果连接的两个表是同一个表,称为自连接查询
#例:查询与刘一同部门的所有员工的记录
select p1.* from emp p1 join emp p2 on p1.did=p2.did where p2.name='刘一';
#练习:查询与刘一年龄相同的所有员工的姓名
select p1.name from emp p1 join emp p2 on p1.age=p2.age where p2.name='刘一';