数据库 test08

//test08 对A,B两条数据库里面的数据进行操作

//1.取出所有的数据
1. select * from A,B where A.A_ID=B.B_ID;

// inner join * on 关键字必须一起使用
2. select * from A inner join B on where A.A_ID=B.B_ID;


//2.左外链接查询 关键字 left outer join * on 右面的表相对于左面的表进行查询,右面的表符合条件的输出,否则输出null
//取出所有的水果,如果有对应的价格就取出价格,没有就不输出
select * from a left outer join b on A.A_ID = B.A_ID;

//3.右外链接查询 关键字 right outer join * on 左面的表相对于右面的表进行查询,左面的表符合条件的输出,否则输出null
//取出所有的水果,如果有对应的价格就取出价格,没有就不输出
select * from a left outer join b on A.A_ID = B.A_ID;
 
//4.全外链接 相当于左外链接与右外链接查询结果进行合并 !结果去重只需要把all关键字去掉即可
select * from a left outer join b on A.A_ID = B.A_ID;
union all
select * from a right outer join b on A.A_ID = B.A_ID;

-- 需求1:查询价格最贵的水果名称
-- 1.1找出最贵的价格 3.5 
select MAX(B_PRICE) from B;

-- 1.2查询出最贵的水果的id
select A_ID from B where B_PRICE = (select MAX(B_PRICE) from B);

-- 1.3根据id查询出水果的名称 
select A_NAME from A where A_ID = (select A_ID from B where B_PRICE = (select MAX(B_PRICE) from B));

-- 需求2:查询编号2课程比编号1课程最高成绩 高 的学生姓名 和成绩
--2.1 首先查询出编号1课程的最高分
select MAX(score) from studentcourse where course_id = 1

--2.2 查询编号2课程比80分高的学生的id 和成绩
select student_id,score from studentcourse where score>(select MAX(score) from studentcourse where course_id = 1) and course_id =2;

--2.3 需要查询的数据来源2张表
select student.name,temp.score from student,(select student_id,score from studentcourse where score>(select MAX(score) from studentcourse where course_id = 1) and course_id =2) as temp where student.id = temp.student_id

-- -- 需求:查询不及格的学生的信息(使用in完成)
-- 1.1首先查询出不及格学生的id
select student_id from studentcourse where score<60

-- 1.2在根据id来查询出学生的信息
select * from student where id in (select student_id from studentcourse where score<60)
|or|
-- -- 需求:查询不及格的学生的信息(使用exists完成)
select * from student where exists (select * from studentcourse where student.id = 
studentcourse.student_id and score<60)

--两者之间的区别
当外表是大表,内表是小表的时候,那么使用in
当外表是小表,内表是 大表的时候,那么使用exists
in的算法
var outer,inter,arr
for(var i=0;i<outer.length;i++){
   for(var j=0;j<inter.length;j++){
     if(outer[i]==inter[j])
  }
}

exist 的算法
for(var i=0;i<outer.length;i++){
   if(exists(outer[i]))
}


--sql优化的注意要点
1.尽量自己手写sql
2.我们需要什么就去查询什么
3.In和exists的用法
4.index的用法,如果表中的列经常作为被查询的条件用来查询数据。针对列中数据的值很多的列,创建索引,如果列中的值不多,那么就不创建索引
5.当多张表(>2)需要查询的时候,我们最好两两联合查询
6.优先执行筛选出更多没用数据的条件


--1查询平均成绩大于70分的同学的学号和平均成绩
  --1.1按照学生的id分组
  select student_id,avg(score) from studentcourse group by student_id having avg(score)>70;

--2.查询所有同学的学号,姓名,选课数,总成绩
--2.1分组,查询学号,选课数,总成绩
select student_id,COUNT(*),SUM(score) from studentcourse group by student_id;

--2.2将2.1的结果作为临时表联合student表查询
--注意:我们不能用聚合函数来调用列
select student.id,student.name,temp.cou,temp.sumscore from student,(select student_id,COUNT(*) 
 cou,SUM(score) sumscore from studentcourse group by student_id;)as temp where student.id = temp.student_id  

--3.查询没有学三门课以上的同学的学号,姓名
--3.1分组,计算没学过三门课以上的学生的学号
select student_id from studentcourse group by student_id having COUNT(*)<3;




 

    原文作者:数据库基础
    原文地址: https://my.oschina.net/u/3462907/blog/1579629
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞