selectdistinct dept_name # distinct强行去除重复 from instructor; selectall dept_name # all显式指明不去除重复 from instructor;
1 2 3
select name from instructor where dept_name ='Music'and salary >70000;
多关系查询
1 2 3
select name, instructor.dept_name, building from instructor,department where instructor.dept_name=department.dept_name;
select子句用于列出查询结果中所需要的属性。
from子句是一个查询求值中需要访问的关系列表。
where子句是一个作用在from子句中关系的属性上的谓词。
通过from子句定义了一个列出的关系上的笛卡尔积。若没有where则会输出该笛卡尔积。
SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。
重命名关系
1 2 3
select T.name, S.course_id from instructor as T, teaches as S where T.ID = S.ID;
比较运算符
1 2 3 4
select dept_name from department where building like'%Watson%'; # 匹配子串包含Watson的字符串 like'ab\%cd%'escape'\' # 用escape转义,匹配以ab%cd开头的字符串
显示次序
1 2 3 4
select name from instructor where dept_name ='Physics' orderby name;
## 升降序
1 2 3
select* from instructor orderby salary desc, name asc; # 工资降序排列,若工资相同则姓名升序排列。
where子句
1 2 3
select name from instructor where salary between90000and100000;
记号比较
1 2 3
select name,course_id from instructor,teaches where (instructor.ID, dept_name)=(teaches.ID, 'Biology');
集合运算
采用union,intersect,except对应并,交,差
1 2 3 4 5 6 7 8 9 10 11
( select course_id from section where semester ='Fall'andyear=2009 ) union ( select course_id from section where semester ='Spring'andyear=2010 )
union自动去重。
空值
空值与true,false对应,为unknown。空值与任何值运算为空值。
聚集函数
平均值:avg
最小值:min
最大值:max
总和:sum
计数:count
1 2 3
selectavg(salary) from instructor where dept_name ='Music';
分组聚集
group by
1 2 3
select dept_name, ave(salary) as avg_salary from instructor groupby dept_name;
查询每个学科的平均工资,每个学科被当作一个分组。
任何没有出现在group by子句中的属性如果出现在select中的话,只能出现在聚集函数内。
having子句
1 2 3 4
select dept_name, avg(salary) as avg_salary from instructor groupby dept_name havingavg(salary) >42000;
最先根据from子句计算出一个关系。
如果出现where子句,where子句中的谓词将应用到from子句计算的结果上。
如果出现group by子句,满足where谓词的元组通过group by子句形成分组。
如果出现having子句,不满足having子句谓词的分组将被抛弃。
select子句利用剩下的分组产生出查询结果中的元组。
嵌套查询
1 2 3 4 5 6
selectdistinct course_id from section where semester ='Fall'andyear=2009and course_id in (select course_id from section where semester ='Spring'andyear=2010);
集合的比较
1 2 3 4 5
select name from instructor where salary >some(select salary from instructor where dept_name ='Biology');
some表示至少比某一个大。
from子查询替代having
1 2 3 4 5 6
select dept_name, avg_salary from(select dept_name,avg(salary) as avg_salary from instructor groupby dept name) as dept_avg(dept_name, avg_salary) # 重命名子查询的结果 where avg_salary >42000;
with子句
1 2 3 4 5 6
with max_budget(value) as (selectmax(budget) from department) select budget from department, max_budget where department.budget = max_budget.value;