子查询(适合没有主外键有联系的)
-- 现在薪水最高的那个员工的信息。
select * from employees where emp_no=( -- 最高薪水员工所有信息
select emp_no from salaries where salary =( -- 最高薪水员工号
select max(salary) from salaries where to_date='9999-01-01'))
-- 查询“95033”班所选课程的平均分。
select round(avg(DEGREE),2) from SCORE where sno in (
select sno from STUDENG where class='95033')
-- 查询Score表中的最⾼分的学⽣学号和课程号
select SNO,CNO from SCORE where DEGREE=(
select max(DEGREE) from SCORE )
连表查询(有主外键的,没有主外键,有联系使用可能出现错误)
内连接
-- select 列名 from 表A a inner join 表B b on a.key=b.key
等值连接
-- select 列名 from 表A a ,表B b where a.key=b.key
-- 左外联接: select 列名 from 表A a left join 表B b on a.key=b.key
-- 右外联接: select 列名 from 表A a right join 表B b on a.key=b.key
内查询
select a.emp_no,a.last_name ,b.dept_no
from employees a
inner join dept_emp b
on a.emp_no = b.emp_no;
等值查询(具有主外键,一一对应的关系)
select a.emp_no,a.last_name ,b.dept_no
from employees a,dept_emp b
where a.emp_no = b.emp_no;
左查询
select a.emp_no,a.last_name ,b.dept_no
from employees a
left outer join dept_emp b
on a.emp_no = b.emp_no
limit 100;
右查询
select a.emp_no,a.last_name ,b.dept_no
from employees a
right outer join dept_emp b
on a.emp_no = b.emp_no
where a.emp_no=81783
limit 100;
联立两张无关系的表
Union : SELECT * FROM t1 union select * from t2;(上下连接,注意是不同两个表列数量不同会报错,只要补一下短的就行。)
在大多数开发中,使用一条SELECT查询就会返回一个结果集。如果,我们想一次性查询多条SQL语句,并将每一条SELECT查询的结果合并成一个结果集返回。就需要用到Union操作符,将多个SELECT语句组合起来,这种查询被称为并(Union)或者复合查询。
select * from STUDENG union select sno,cno,degree,4,5 from SCORE;
cross join是mysql中的一种连接方式,区别于内连接和外连接,对于cross join连接
说,其实使用的就是笛卡尔连接。 在MySQL中,当CROSS JOIN不使用WHERE子句时,CROSS JOIN产生了一个结果集,该结果集是两个关联表的行的乘积。 通常,如果每个表分别具有n和m行,则结果集将具有n*m行
CROSS JOIN(笛卡尔积):SELECT t1.id, t2.id FROM t1 CROSS JOIN t2;
select * from STUDENG cross join SCORE;
截止2001年工作10年以上的员工都有谁?具体每个人每年薪资详细信息。
select * from salaries where emp_no in (select emp_no from
salaries group by emp_no having count(emp_no)>=10 ) limit
50;
显示员工号,员工名字和所在部门号(部门名称)
select a.emp_no,a.last_name ,b.dept_no
from employees a
left outer join dept_emp b
on a.emp_no = b.emp_no
limit 10;
显示 Customer Service 部门所有员工名字 ,使用内联接,左联接-数量 ,右联接-数量是否不同。
select a.dept_name,b.last_name from departments a
inner join employees b inner join dept_emp c
on b.emp_no=c.emp_no and a.dept_no=c.dept_no
where a.dept_name ='Customer Service';
显示现在薪水最低的10名人员员工编号及薪水
select a.emp_no,a.last_name ,b.salary
from employees a
inner join salaries b
where a.emp_no = b.emp_no
order by salary
limit 10;