MySQL数据库基础知识二(表的查询)

Select 语句基本语法

  1. SELECT select_list                                     #所选择的列
  2. FROM table_list                                          #所选择的表名
  3. WHERE row_constraint                              #行必须满足的条件
  4. GROUP BY grouping_columns                  #结果如何分组
  5. ORDER BY sorting_columns                     #结果如何排序
  6. HAVING group_constraint                         #分组必须满足的条件
  7. 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;

扫描二维码关注公众号,回复: 3388450 查看本文章

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

猜你喜欢

转载自blog.csdn.net/qq_31026587/article/details/82820570