Select 语句基本语法
- SELECT select_list #所选择的列
- FROM table_list #所选择的表名
- WHERE row_constraint #行必须满足的条件
- GROUP BY grouping_columns #结果如何分组
- ORDER BY sorting_columns #结果如何排序
- HAVING group_constraint #分组必须满足的条件
- LIMIT count; #限制结果里的行数。
内链接(笛卡儿积):
表名通过 INNER JOIN来连接:
Select * from t1 inner join t2 [where ...];
select t1.*,t2.* from t1 inner join t2 where t1.i1=t2.i2;
连接运算符“,”也与inner join类似,但是“,”的优先级与其他不同所以在某些情况下或导致错误。
在指定如何对表里的列进行匹配方面,inner join,cross join和join,有一种语法是用on代替where子句。
左连接:
当左表的某行在右表无匹配时,它仍然会被选去一个NULL的输出行。
Select t1.*,t2.* from t1 left join t2 on t1.i1 = t2.i2 [where t2.i2 IS NULL];
下面这个sql语句是查询没有去考试的学生名单。
- select
- student.name , student.student_id , grade_event.date , grade_event.event_id , grade_event.category
- from
- student inner join grade_event
- left join score on student.student_id = score.student_id
- AND grade_event.event_id = score.event_id
- where
- score.score IS NULL
- ORDER BY
- student.student_id , grade_event.event_id;
记录学生的student表,记录已发生考试或测验事件的grade_event表,还有一个记录每位学生的每次考试或测验成绩的score表。
使用子查询实现多表检索
子查询值的是用括号括起来,并嵌入另一条语句里的那条SELECT语句。
- 实现找出与考试类别T 相对应的所有考试事件行的ID,然后利用它们来查找那些考试成绩。
- select * from score
- where event_id IN (select event_id from grade_event where category = 'T');
- 注:
- 可以用诸如“=”,“<“之类的关系比较运算符来评估量子查询的结果。
- IN 和NOT IN来测试某给定值是否包含在子查询的结果集里。
- 用ALL,ANY,SOME把某给定值与子查询的结果集进行比较。
- 运用EXISTS和NOT EXISTS来测试子查询的结果是否为空。
- 测试1,子查询返回的结果只有一个否则的话会报错:
- select * from score
- where event_id =
- (select event_id from grade_event
- where data = '2012-09-23' AND category = 'Q');
平均值,最小值,
select MIN(birth) from president;
select AVG(score) from score where event_id = 5;
ALL,ANY,SOME子查询
select last_name,first_name,birth from president where birth <= ALL(select birth from president);
select last_name,first_name,birth from president where birth <= ANY(select birth from president);
select last_name,first_name,city ,state from president where (city,state) = ANY (select city,state from president where last_name = 'rooas');
EXISTS和NOT EXISTS子查询
如果absence为空则第一条返回0,第二条返回1。
select exists (select * from absence);
select not exists (select *from absence);
使用UNION实现多表检索
以下几种特性:
1.列名和数据类型
select i ,c from t1 union select i,d from t3;
select i,c from t1 union select d,i from t3;
以第一个select列的数据类型来规定最后的查询结果,后面的数据类型若与前面的列不一致,则会进行强制类型转换。
2.重复行处理
在默认情况下,union会将结果集里的重复行剔除掉。
select * from t1 union select * from t2 union select * from t3;
上面这条语句会将重复行剔除,如果想要保留重复行则需要把所有的union改成union all.
3.order by 和 limit处理
如果想将union结果作为一个整体进行排序,那么需要用括号和order by,例子如下。
(select i , c from t1)union(select i,d from t3) order by c; //对c列进行排序
如果想要限制union所返回行的数量,利用limit,例子如下:
(select * from t1)union(select * from t2)union(select * from t3) limit 2;//限制返回的数据条数为2.
子句order by和limit还可以用在被括号括起来的单个select里,从而只对这条select语句起作用。
(select * from t1 order by i limit 2) union (select * from t2 order by j limit 1) union (select * from t3 order by d limit 2);
在括号括起来的单个select语句里,order by 与limit一起使用。
多表删除和更新
删除
delete from t where id >100;将表t里的id值大于100的所有行删除掉。
delete t1 from t1 inner join t2 on t1.id = t2.id;//将从表1里把其id值可以在另一个表t2里找到的所有行全部删除。
delete t1,t2 from t1 inner join t2 on t1.id = t2.id;//将两个表里把id值相匹配的行都删除掉。
select t1.* from t1 left join t2 on t1.id = t2.id where t2.id IS NULL; //想要从表t1里把在表t2中没有匹配的行找出来。
delete t1 from t1 left join t2 on t1.id = t2.id where t2.id IS NULL;
更新
把每位学生的考试成绩都加1
update score , grade_event ,SET score.score = score.score+1
where score.event_id = grade_event.event_id
AND grade_event.date ='2012-09-23' AND grade_event.category='Q';
等效于下:
update score SET score = score +1 where event_id = (select event_id from grade_event where date = '2012-09-23' AND category='Q';
Update t1,t2 SET t2.a=t1.a where t2.id = t1.id;//将t1.a复制到t2.a