一.为了便于说明,先创建两张相关联的表
DROP TABLE IF EXISTSdept;
CREATE TABLE
dept(
deptnoint(11) NOT NULL,
dnamevarchar(20) default NULL,
locvarchar(20) default NULL,
PRIMARY KEY (
deptno)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTSemp;
CREATE TABLE
emp(
empnoint(11) NOT NULL,
enamevarchar(20) default NULL,
jobvarchar(20) default NULL,
mgrint(11) default NULL,
hibernatevarchar(20) default NULL,
salfloat default NULL,
commfloat default NULL,
deptnoint(11) default NULL,
PRIMARY KEY (
empno)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

二. 给创建的两个表添加内容
INSERT INTOdeptVALUES ('1', '销售部', '武汉');
INSERT INTO
deptVALUES ('2', '研发部', '北京');
INSERT INTO
deptVALUES ('3', '教学部', '上海');
INSERT INTO
deptVALUES ('4', '市场部', '天津');

INSERT INTOempVALUES ('101', '张三', '销售', '102', '2018-1-1', '5000', '10000', '1');
INSERT INTO
empVALUES ('102', '张4', '销售', '112', '2018-1-1', '5400', '10400', '1');
INSERT INTO
empVALUES ('103', '张2', '销售', '102', '2018-1-1', '5500', '10500', '1');
INSERT INTO
empVALUES ('104', '张1', '市场', '112', '2018-1-1', '5600', '70000', '4');
INSERT INTO
empVALUES ('105', '张5', '市场', '104', '2018-1-1', '5700', '10200', '4');
INSERT INTO
empVALUES ('106', '张6', '市场', '104', '2018-1-1', '5800', '60000', '4');
INSERT INTO
empVALUES ('107', '张7', '市场', '104', '2018-1-1', '6000', '10000', '4');
INSERT INTO
empVALUES ('108', '张8', '教学', '112', '2018-1-1', '5650', '10000', '3');
INSERT INTO
empVALUES ('109', '张9', '教学', '108', '2018-1-1', '4000', '50000', '3');
INSERT INTO
empVALUES ('110', '张99', '研发', '112', '2018-1-1', '3000', '40000', '2');
INSERT INTO
empVALUES ('111', '张88', '研发', '110', '2018-1-1', '2000', '30000', '2');
INSERT INTO
empVALUES ('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值可”不相等

Logo

更多推荐