mysql学习笔记(4)——进阶查询(sql92语法)

连接查询

又称多表查询,当我们查询的字段来自于多个表时,会用到连接查询
笛卡尔集错误情况:表1有m行,表2有n行,结果是m*n行
如何解决:添加有效的连接

分类:
1.按年代分类

sql92标准:仅仅支持内连接
sql99标准/推荐:支持内连接、外连接(不支持全外连接)、交叉连接

2.按功能分类:

a.内连接:等值连接、非等值连接、自连接
b.外连接:左外连接、右外连接、全外连接
c.交叉连接

案例:
SELECT * FROM beauty
SELECT * FROM boys 
SELECT name,boyName FROM boys,beauty 
WHERE beauty.boyfriend_id=boys.id
一、SQL 92标准

1.等值连接
案例一、查询女生名对应的男生名

SELECT name,boyName FROM beauty,boys 
WHERE beauty.boyfriend_id =boys.id 

案例二、查询员工名对应的部门名

SELECT name department_name FROM mylist,departments 
WHERE mylist.department_id =departments.department_id 

案例三、查询员工名,工种号,工种名(为表起别名)

SELECT last_name,job_title, e.job_id 
FROM employees e,jobs j
WHERE e.`job_id`=j.`job_id`

两个表的顺序可以调换

案例四、查询有奖金的员工名,部门名(可以加筛选)

SELECT last_name,department_name 
FROM employees e,departments d
WHERE e.department_id=d.department_id 
AND commission_pct IS NOT NULL 

案例五、查询城市名中第二个字符为o的部门

SELECT city ,department_name FROM departments d ,locations l 
WHERE d.location_id=l.location_id
AND  city like'_o%'

案例六、查询每个城市的部门个数(可以加分组)

SELECT count(*),city FROM departments d ,locations l 
WHERE d.location_id =l.location_id 
GROUP BY city

案例七、查询有奖金的每个部门的部门名,和部门领导编号,和该部门的最低工资

SELECT MIN(salary),d.`manager_id`,department_name
FROM departments d,employees e 
WHERE e.commission_pct IS NOT  NULL 
AND d.department_id =e.department_id 
GROUP BY department_name,d.`manager_id`

案例八,查询每个工种的工种名和员工的个数,并按照员工个数降序(可以加排序)

SELECT j.job_title , count(*)FROM employees e, jobs j 
WHERE e.`job_id` =j.`job_id`
GROUP BY j.`job_title` 
ORDER BY count(*) DESC 

案例九:查询员工名、部门名和所在的城市

SELECT e.last_name,d.department_name,l.city
FROM employees e ,departments d ,locations l 
WHERE l.location_id =d.location_id
AND e.department_id =d.department_id 
AND city LIKE'S%'
ORDER BY e.last_name desc

2.非等值连接
查询员工工资和员工级别, 并将员工工资从低到高排序

SELECT salary,grade_level FROM employees e ,job_grades g
WHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal`
AND g.grade_level ='A'
ORDER BY salary ASC 

3.自连接
查询上级对应的员工的名称,上级名称

SELECT e.last_name ,e.employee_id, m.manager_id,m.last_name 
FROM employees e ,employees m
WHERE e.employee_id  = m.manager_id 
GROUP BY manager_id
SELECT * FROM employees e 

测试题目
1.显示员工表的最大工资,工资平均值

SELECT max(salary),min(salary) FROM employees e 

2.查询员工表employee_id,job_id,last_name,按照department_id降序,按照salary升序

SELECT employee_id,job_id,last_name,department_id,salary FROM employees e 
ORDER BY department_id DESC,salary ASC

3.查询员工表的job_id中包含a和e,并且a在e的前面

SELECT job_id FROM employees e 
WHERE job_id LIKE '%a%e%' 

4.已知表student 里面有id(学号) ,name,gradeId(年级编号)
已知表grade 里面有id(年级编号) ,name(年级名)
已知表result里面有id ,score,studentNo(学号)
查姓名,年级名,成绩

SELECT s.name,g.name,r.score 
FROM student s,RESULT r,grade g
WHERE s.gradeId=g.id AND s.id=r.studentNo

5.显示当前日期,以及去前后空格,截取字符串的函数

  SELECT substr(trim(now()),1,10 ) 
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容