SELECT o2.order_id, o2.order_status_id, o2.status, o2.description, o1.record_id, o1.update_time FROM order_record AS o1 LEFTJOIN order_status AS o2 ON o1.order_id = o2.order_id WHERE o1.order_id =1730208938441322497;
//查找学生信息所在系的升序,年龄降序排列 select* from Students orderby Sdept ASC,Sage DESC
6.集合查询
并 UNION
交 intersect
差 except
使用前提,这些查询结果提供的关系具有相同的属性和属性类型列表,默认情况下去掉重复元组
1 2 3 4 5 6 7 8 9
//查找即是女明星又是净资产在1000万以上的制片人的姓名和地址 select name,address from MovieStars where gender = 'f' INTERSECT select name,address from MovieExecs where netWorth >= '10000000' //集合查询一般很少使用,可以在service层调用Java api来搞定
7.子查询
1 2 3 4 5 6 7 8 9
//查询与刘雪同系的学生学号、姓名及所在系 SELECT Sno, Sname, Sdept FROM Students WHERE Sdept = 返回单值 对比IN (SELECT Sdept FROM Students WHERE Sname=‘刘雪’ )
1 2 3 4 5 6 7 8
//查询与刘雪同系的学生 学号、姓名及所在系 SELECT Sno, Sname, Sdept FROM Students s1 WHERE s1.Sdept IN ( SELECT Sdept FROM Students s2 WHERE s2.Sname=‘刘雪’ )
1 2 3 4 5 6 7 8 9 10 11 12 13
//查询选修了‘数据结构’的学生的学号、姓名 SELECT Sno, Sname FROM Students WHERE Sno IN 集合 ( SELECT Sno FROM SC WHERE Cno = 单值 (SELECT Cno FROM Courses WHERE Cname=‘数据结构’)) //用学号和课程号做中间结果 //尽量使用 IN ,如果用 = 号,返回的是多个节点会报错的
//查询其他系比经管系某一学生年龄小的学生的姓名、年龄 SELECT s1.student_name, s1.age FROM students s1 WHERE s1.age < ( SELECT s2.age FROM students s2 WHERE s2.department ='经管系'AND s2.student_id = target_student_id ) AND s1.department <>'经管系';
<>是不等于的意思,当然也可以使用!=
查询其他系比经管系所有学生年龄都小的学生的姓名、年龄 SELECT s1.student_name, s1.age FROM students s1 WHERE s1.age < ( SELECTMIN(s2.age) FROM students s2 WHERE s2.department ='经管系' ) AND s1.department <>'经管系';
exist关键字
1 2 3 4 5 6 7 8 9 10 11
//查询选修了‘数据结构’的学生的学号、姓名 SELECT Sname,Sno FROM Students WHEREEXISTS ( SELECT SC.* FROM SC,Courses WHERE Sno=Students.Sno AND SC.Cno=Courses.Cno AND Cname=‘数据库’ ); //只要有返回数据就是为真 //注意看where后面的Student.Sno
(这个是书写顺序) SELECT 必须 FROM 必须 WHERE GROUPBY HAVING ORDERBY
执行顺序依次为: from :先确定查询范围 ON:确定多表联合查询的条件 JOIN:指定联合哪些数据表 WHERE :全表查询的筛选条件,生成第一个结果集 GROUPBY:分组条件,对第一个结果集进行分组,得到第二个结果集 HAVING :过滤条件,与groupby进行连用,对第二个结果集中的每组数据,进行筛选过滤,得到第三个结果集 SELECT:指定获取的列项,得到第四个结果集 DISTINCT :对指定列进行去重操作 ORDERBY:对结果集按照指定字段进行排序整理 LIMIT:对最终结果集进行截取,一般和offset连用,可用于分页
EXPLAIN SELECT*FROM app_user WHERE `name`='用户9999'-- 查询99999条记录
-- id _ 表名_字段名 -- create index on 字段 CREATE INDEX id_app_user_name ON app_user(`name`); -- 0.001 s EXPLAIN SELECT*FROM app_user WHERE `name`='用户9999'-- 查询一条记录