Mysql语言关键字
image.png
inner join:2表值都存在
outer join:附表中值可能存在null的情况。
总结:
①A inner join B:取交集
②A left join B:取A全部,B没有对应的值,则为null
③A right join B:取B全部,A没有对应的值,则为null
④A full outer join B:取并集,彼此没有对应的值为null
上述4种的对应条件,在on后填写。

内连接:INNER JOIN

内连接需要用ON来指定两张表需要比较的字段,最终结果只显示满足条件的数据
SELECT * FROM tab1 INNER JOIN tab2 ON tab1.id1 = tab2.id2

左连接可以看做在内连接的基础上,把左表中不满足ON条件的数据也显示出来,但结果中的右表部分中的数据为NULL

写一个sql语句查询各个岗位分数的平均数,并且按照分数降序排序,结果保留小数点后面3位

SELECT job, ROUND(avg(score), 3)
FROM grade
GROUP BY job
ORDER BY avg(score) DESC

写一个sql语句查询用户分数大于其所在工作(job)分数的平均分的所有grade的属性,并且以id的升序排序,如下

image.png
1、on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。

2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

select g1.id, l.name, g1.score
from grade g1 join language l on g1.language_id=l.id
where
(
select count(distinct g2.score)
from grade g2
where g2.score>=g1.score and g1.language_id=g2.language_id
) <=2 order by l.name,g1.score desc ,g1.id;

  1. select g1.id, l.name, g1.score
  2. from grade g1 join language l on g1.language_id=l.id
  3. where
  4. (
  5. select count(distinct g2.score)
  6. from grade g2
  7. where g2.score>=g1.score and g1.language_id=g2.language_id
  8. ) <=2 #少于等于两个重复分数(并列分数) order by l.name,g1.score desc ,g1.id;

selects.emp_no, salary, s.from_date, s.to_date, dept_no
from salaries s join dept_manager dm
ons.emp_no = dm.emp_no
anddm.to_date=’9999-01-01’
ands.to_date=’9999-01-01’
orderbys.emp_no