笛卡尔积
笛卡尔积,举个例子,有几个球队,他们之间要踢球,每个球队都要与除啦自身踢个遍, 说白啦就是拿一个表中的一行去匹配另一个表的所有行
SELECT t1.`name` 主场, t2.`name` 客场
FROM football as t1, football as t2
WHERE t1.u_id != t2.u_id
左连接
左连接,就是以其中一个表为基准,比对左的表,看哪一行符合条件当没有符合条件,左边哪一行最少出现一次
-- 联表查询/左连接,以一张表为基准 查询左边的表,看哪一行符合条件, 没有符合条件为null
-- 以department的每一行为基准 比对左边的表employee 看哪一行符合条件d.id = e.deptId
-- 如果没有一行符合条件,左表的哪一行最少出现一次
SELECT *
FROM department AS d LEFT JOIN employee AS e
ON d.id = e.deptId
右连接
以右边为基准,拿右边的每一行比对左表的每一行,看能否符合条件 ,当没有符合条件,右边哪一行最少出现一次
-- 联表查询右连接
-- 以右边为基准,拿右边的每一行比对左表的每一行,看能否符合条件 ,当没有符合条件,右边哪一行最少出现一次
SELECT *
FROM department AS d RIGHT JOIN employee AS e
ON d.id = e.deptId
内连接
内连接就是条件必须满足,如果条件满足不了不能出现
--联表查询-内连接-查询渡一教学部的所有员工姓名、性别、入职时间、部门名、公司名
SELECT
e.`name` 员工姓名,
CASE
e.ismale
WHEN 1 THEN
'男' ELSE '女'
END 性别,
e.joinDate 入职时间,
d.`name` 部门,
c.`name` 公司名
FROM
employee AS e
INNER JOIN department AS d ON d.id = e.deptId
INNER JOIN company AS c ON c.id = d.companyId
WHERE
c.`name` = '渡一教育'
AND d.`name` = '教学部'
练习
联表查询-内连接-显示出所有员工的姓名、性别(使用男或女显示)、入职时间、薪水、所属部门(显示部门名称)、所属公司(显示公司名称)
SELECT
e.`name` 员工姓名,
CASE
e.ismale
WHEN 1 THEN
'男' ELSE '女'
END 性别,
e.joinDate 入职时间,
e.salary 薪水,
d.`name` 所属部门,
c.`name` 所属公司
FROM
employee e
INNER JOIN department d ON e.deptId = d.id
INNER JOIN company c ON d.companyId = c.id
--联表查询-内连接-查询腾讯和蚂蚁金服的所有员工姓名、性别、入职时间、部门名、公司名
SELECT e.`name` 员工姓名,
CASE
e.ismale
WHEN 1 THEN
'男'
ELSE
'女'
END 性别,
e.joinDate 入职时间,
d.`name` 部门名,
c.`name` 公司名
FROM employee AS e
INNER JOIN department AS d ON d.id = e.deptId
INNER JOIN company AS c ON c.id = d.companyId
WHERE c.`name` IN('腾讯科技', '蚂蚁金服')