MySQL笔记二

这篇博客详细介绍了SQL中的自然连接、重命名、字符串操作、排序、元组比较、集合操作、聚合函数以及子查询的使用方法。通过实例展示了如何进行复杂的数据查询,包括查找特定条件的记录、计算平均值、进行分组分析等。此外,还探讨了MySQL中不支持的交集和补集操作的替代解决方案。
摘要由CSDN通过智能技术生成

MySQL笔记二

自然连接

SELECT name,course_id
from instructor,teaches
where instructor.ID=teaches.ID

上述语句等价于

select name,course_id
from instructor natrual join teaches;

结果如下:
在这里插入图片描述
自然连接存在的问题:
有可能把同名但是不相干的属性连接在一起
自然连接是在笛卡尔乘积的基础上,选择出值相等的

重命名

对字段重命名

select ID,name,salary/12 as monthly_salary
from instructor;

在这里插入图片描述
对表进行重命名,e.g:find the name of all instructor who have a higher salary than some instructor in ‘Comp. Sci.’

select distinct T.name
from instructor as T,instructor as S
where T.salary>S.salary ans S.dept_name='Comp. Sci.';

上述语句相当于对instructor做两个副本,一个为T,一个是S,选择S表中的dept_name等于"Comp. Sci."并且T.salary>S.salary的名字
在这里插入图片描述

字符串操作

模糊查询,查询instructor中名字包含’in’的instructor的姓名

select name 
from instructor
where name like '%in%';

在这里插入图片描述

排序

SELECT distinct name 
from instructor 
order by name;

在这里插入图片描述默认是升序"asc",降序为"desc"

select distinct name
from instructor
order by name desc;

在这里插入图片描述按多个元组排序

SELECT * 
from instructor
order by dept_name,name

在这里插入图片描述
上述语句先按dept_name升序排序,当dept_name相等时,再按name升序排序。
如果我们想按dept_name升序,name降序,语句如下:

SELECT * from instructor
order by dept_name,name desc;

在这里插入图片描述

where 从句

选择薪水在90000和100000之间的instructor名字

SELECT name
from instructor
where salary between 90000 and 100000;

在这里插入图片描述
元组比较

SELECT name,course_id
from instructor,teaches
where (instructor.ID,dept_name) =(teaches.ID,'Biology');

在这里插入图片描述

集合操作

求并集UNION

SELECT course_id from section where semester='Fall' and year=2009
union
select course_id from section where semester='Spring' and year=2010;

在这里插入图片描述求交集

select course_id from section where semester='Fall' and year=2009
    -> intersect
    -> select course_id from section where semester='Spring' and year=2010;

MySQL不支持intersect,所以会报错
求补集

select course_id from section where semester='Fall' and year=2009
    -> except
    -> select course_id from section where semester='Spring' and year=2010;

MySQL也不支持except
查询薪水最大的instructor 的薪水

select distinct salary
    -> from instructor
    ->except 
    select distinct T.salary
    -> from instructor as T,instructor as S
    -> where T.salary<S.salary;

或者

select max(salary)
from instructor;

空值

查找salary是空的instructor

SELECT * 
from instructor 
where salary is null;

聚合操作(Aggregate Function)

查找计算机科学学院的平均薪水

select avg(salary)
from instructor
where dept_name='Comp. Sci.';

在这里插入图片描述
选择在Spring 2010开课的老师的数量

select count(distinct ID)
from teaches 
where semester='Spring' and year=2010;

在这里插入图片描述

Group By (分组)

查找每个院系的平均年薪

select dept_name,avg(salary)
from isntructor
group by dept_name;

在这里插入图片描述
取出后按dept_name降序

SELECT dept_name,avg(salary)
from instructor
group by dept_name
order by dept_name desc;

在这里插入图片描述
没有参与分组的字段一定要出现在group by之后

SELECT dept_name,ID,avg(salary)
from instructor
order by dept_name;

在这里插入图片描述

Having 从句

选择平均薪水大于42000

select dept_name,avg(salary)
from instructor
group by dept_name
having avg(salary)>42000;

在这里插入图片描述
where不能用于group by函数
当没有group by时,having和where效果一样

嵌套子查询(Nested Subqueries)

find course offered in fall 2009 and in spring 2010

select distinct course_id
from section
where semester='Fall' and year=2009 
and course_id in (select course_id 
from section
where semester='Spring' and year=2010);

在这里插入图片描述
先找出Spring 2010的课程的course_id的集合,在从该集合中找出semester=‘Fall’ and year=2009的course_id
find courses offered in Fall 2009 and not in Spring 2010

select course_id
from section
where semester='Fall' and year =2009
and course_id not in (select course_id
from section
where semester='Spring' and year=2010);

在这里插入图片描述
通过嵌套子查询可以帮助我们解决MySQL不支持intersect和except的问题
5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值