一、查询
一、笛卡尔集
笛卡尔集会在下面条件下产生
省略连接条件
连接条件无效
所有表中的所有行互相连接
为了避免笛卡尔集, 可以在 WHERE 加入有 效的连接条件。
含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
笛卡尔乘积现象:表1 有m行,表2有n行,结果=m*n行
发生原因:没有有效的连接条件
如何避免:添加有效的连接条件分类:
按年代分类:
sql92标准:仅仅支持内连接
sql99标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接
按功能分类:
内连接:*等值连接
非等值连接
自连接
外连接:
*左外连接:左外连接是取左表的全部,左表有的、右表也有,若左表没有,那右表的就不用了
*右外连接:与左外连接相反
全外连接
交叉连接
二、等值/连接连接
使用连接在多个表中查询数据
在 WHERE 子句中写入连接条件。
在表中有相同列时,在列名之前加上表名前缀
表的别名
提高语句的简洁度
区分多个重名的字段
注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定
案例:查询员工名、工种号、工种名
SELECT e.last_name,e.job_id,j.job_title FROM t_mysql_employees e,jobs j
WHERE e.`job_id`=j.`job_id`;
连接多个表
连接 n个表,至少需要 n-1个连接条件。 例如:连接
三个表,至少需要两个连接条件。
案例1:查询女生名和对应的男生名
SELECT NAME,boyName
FROM boys,beauty
WHERE beauty.boyfriend_id= boys.id;
案例2:自连接
查询 员工名和上级的名称
SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
FROM t_mysql_employees e,t_mysql_employees m
WHERE e.`manager_id`=m.`employee_id`;
案例3:两个表的顺序是否可以调换(是)
查询员工名、工种号、工种名
SELECT e.last_name,e.job_id,j.job_title
FROM t_mysql_jobs j,t_mysql_employees e
WHERE e.`job_id`=j.`job_id`;
案例4:可以加筛选条件
查询 有奖金 的员工名、部门名
SELECT last_name,department_name,commission_pct
FROM t_mysql_employees e,t_mysql_departments d
WHERE e.`department_id`=d.`department_id`
AND e.`commission_pct` IS NOT NULL;
案例5:可以加分组
查询 每个城市 的部门个数
SELECT COUNT(*) 个数,city
FROM t_mysql_departments d,t_mysql_locations l
WHERE d.`location_id`=l.`location_id`
GROUP BY city;
案例6:可以加排序
查询 每个工种 的 工种名和员工的个数,并且 按员工个数降序
SELECT job_title,COUNT(*)