下午去打了一下午球,晚上看了会,害,明天争取搞到120章
#2:非等值连接
/*
通过笛卡尔乘积,进行非等值连接
非等值连接支持等值连接的所有操作
*/
SELECT
a.`salary` AS '工资',
b.`grade_level` AS '等级'
FROM
`employees` AS a,
`job_grades` AS b
WHERE
a.`salary` BETWEEN b.`lowest_sal` AND b.`highest_sal`
ORDER BY a.salary;
#3:自连接,自己连接自己
/* sql99语法
语法:
select 查询列表
from 表1 别名连接类型
join 表2 别名
on 连接条件
+
[where]
[group by 分组]
[having 筛选分组后的条件]
[order by 排序]
内连接:inner
外连接:
左外() left(outer)
右外() right(outer)
全外() full(outer)
交叉连接 cross
一:内连接
语法:
select 查询列表
from 表名1
inner join 表名2
别名 on连接条件
*/
SELECT b.`last_name`,a.`department_name` FROM `departments` AS a INNER
JOIN `employees` AS b ON a.`department_id`=b.`department_id`;
SELECT
a.`last_name`,b.`job_title`
FROM `employees` AS a INNER JOIN `jobs` AS b
ON a.`job_id`=b.`job_id`
WHERE a.`last_name` LIKE '%e%';
SELECT
b.`city`,COUNT(*)
FROM `departments` AS a INNER JOIN `locations` AS
b ON a.`location_id`=b.`location_id`
GROUP BY b.`city` HAVING COUNT(*)>3;
SELECT
COUNT(*),a.`department_name`
FROM `departments` a
JOIN `employees` b
ON a.`department_id`=b.`department_id`
GROUP BY b.`department_id`
HAVING COUNT(*)>3
ORDER BY COUNT(*) DESC;
#自连接
/* 把join 两边的表名相同
*/
/*外连接
左外连接
右外连接
外连接的所有条件为住表中的所有记录
如果从表中有和主表中匹配的,显示
反则显示Null
right join 右边是主表
left join 左边是主表
*/
SELECT b.* FROM `beauty`;
SELECT a.`name`,b.`boyName` FROM `beauty` a
LEFT JOIN `boys` b
ON a.`boyfriend_id` =b.`id`
WHERE b.`boyName` IS NULL;
SELECT a.*,b.`employee_id` FROM
`departments` a LEFT JOIN `employees` b
ON a.`department_id`=b.`department_id`
WHERE b.`employee_id` IS NULL
;
/*交叉连接
cross join 实现笛卡尔乘积
*/
SELECT
b.*
FROM
`beauty` AS a
LEFT JOIN `boys` AS b
ON a.`boyfriend_id` = b.`id`
WHERE a.`id`>3 ;
/*
子查询
出现在其他语句中的select语句,称为子查询或内查询
分类:
按子查询出现的位置
select 后面
from 后面表子查询
where 或 having 后面标量子查询
exists 后面(相关子查询)
标量子查询(结果只有一行一列)
行子查询(一行多列)
列子查询(一列多行)
表子查询
*/
/*
where 或者having后面
in,some,any,all
*/
SELECT
*
FROM
`employees`
WHERE salary>
(SELECT
salary
FROM
`employees`
WHERE last_name = 'Abel')
;
SELECT
`last_name`,
`job_id`,
`salary`
FROM `employees`
WHERE
job_id=(SELECT
job_id
FROM
`employees`
WHERE `employee_id` = 141)
AND
salary>(SELECT
salary
FROM
`employees`
WHERE `employee_id` = 143) ORDER BY salary DESC;