一.为了便于说明,先创建两张相关联的表
DROP TABLE IF EXISTS
dept;
dept
CREATE TABLE(
deptno
int(11) NOT NULL,
dname
varchar(20) default NULL,
loc
varchar(20) default NULL,
deptno
PRIMARY KEY ()
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS
emp;
emp
CREATE TABLE(
empno
int(11) NOT NULL,
ename
varchar(20) default NULL,
job
varchar(20) default NULL,
mgr
int(11) default NULL,
hibernate
varchar(20) default NULL,
sal
float default NULL,
comm
float default NULL,
deptno
int(11) default NULL,
empno
PRIMARY KEY ()
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
二. 给创建的两个表添加内容
INSERT INTO
deptVALUES ('1', '销售部', '武汉');
dept
INSERT INTOVALUES ('2', '研发部', '北京');
dept
INSERT INTOVALUES ('3', '教学部', '上海');
dept
INSERT INTOVALUES ('4', '市场部', '天津');
INSERT INTO
empVALUES ('101', '张三', '销售', '102', '2018-1-1', '5000', '10000', '1');
emp
INSERT INTOVALUES ('102', '张4', '销售', '112', '2018-1-1', '5400', '10400', '1');
emp
INSERT INTOVALUES ('103', '张2', '销售', '102', '2018-1-1', '5500', '10500', '1');
emp
INSERT INTOVALUES ('104', '张1', '市场', '112', '2018-1-1', '5600', '70000', '4');
emp
INSERT INTOVALUES ('105', '张5', '市场', '104', '2018-1-1', '5700', '10200', '4');
emp
INSERT INTOVALUES ('106', '张6', '市场', '104', '2018-1-1', '5800', '60000', '4');
emp
INSERT INTOVALUES ('107', '张7', '市场', '104', '2018-1-1', '6000', '10000', '4');
emp
INSERT INTOVALUES ('108', '张8', '教学', '112', '2018-1-1', '5650', '10000', '3');
emp
INSERT INTOVALUES ('109', '张9', '教学', '108', '2018-1-1', '4000', '50000', '3');
emp
INSERT INTOVALUES ('110', '张99', '研发', '112', '2018-1-1', '3000', '40000', '2');
emp
INSERT INTOVALUES ('111', '张88', '研发', '110', '2018-1-1', '2000', '30000', '2');
emp
INSERT INTOVALUES ('112', '张总', '研发', null, '2018-1-1', '1000', '20000', '2');
三.联合查询
1.查询的内容涉及到那几个表,就在from后面写上涉及到的所有表的名称
select ename,dname from emp,dept
这样查询的结果是两张表的数据相乘,结果是一个笛卡尔积,那么有没有一个限制条件可以将我们需要的内容筛选出来呢?
2.等值连接
仔细观察,其实两张表相关联的部分在于都存在一个字段deptno,表emp中每一个主键对应一个外键deptno,这个deptno又是表dept中的主键,所以在后面加上where条件限制,就可以筛选出我们需要的数据,后面可以and加上多个条件进一步筛选查询
select ename,dname from emp,dept
where emp.deptno = dept.deptno;
3.内联 inner join 其中inner 可以省略
select ename,dname from emp
inner join dept
on dept.deptno = emp.deptno;
4.取别名 可以简化代码长度当
其中需要注意的一点是: 当查询的内容两张表都存在时,需要指明是那一张表的字段
select e.deptno,ename,dname from emp as e
inner join dept
on dept.deptno = e.deptno;
5.子查询 最符合我们思维逻辑的查询,类似与java中的嵌套
1).查询张三所在的部门名称
select dname from dept where deptno=
(select deptno from emp where ename = '张三');
2).查询工资高于3000的员工的部门名称
select dname from dept where deptno in
(select deptno from emp where sal>3000);
最后只得注意的地方,当要查询的条件是null的时候,需要用到 is null,或者 is not null,不要用 =null,=”等,其中null值可”不相等