• 【数据库】03_sql语句02


    分页查询

    数据太多。就要找是第几页。

    语法:limit a,b;

    意思:a是从哪里开始偏移,索引从0开始计算,b是从个数

    1. select * from student limit 2,3;
    2. # 结果就是从下标2开始的3个人,也就是012开始算起,查找出234,编号就是345

    聚合函数

    count:查个数

    sum:求和

    min:求最小

    max:求最大

    avg:求平均值

    1. select count(*) from ttable;
    2. select count(sex) from ttable;
    3. select sum(score) from ttable where id='01';
    4. select min(score) from ttable where id='01';
    5. select max(score) from ttable where id='01';
    6. select avg(score) from ttable where id='01';

    分组查询

    语法:group by 分组的依据 having 分组的条件。

    1. select c1,sum(c2) from table group by c1;
    2. # 输出的结果是两列,第一列是c1,第二列是求和
    3. # 而结果是在c1的结果中分得组
    4. select x,sum(score) sum from ttbale group by x having sum>=200;
    5. # 以x为分组,也就是说后续都是以x为主要的标识,然后第二列是求和,起临时别名叫做sum
    6. # 然后和大于200的才能出现

    分组排序:order by 排序根据 asc/desc,升降序。如果不写,默认是asc

    where和having

    where是查询之前就存在,having是查询之后计算出来的,例如sum之后就得用having了。

    1. select id,sum(score) sum from ttable group by sum having sum>=200 order by sum desc;
    2. select sex, count(sex) from ttable group by sex;

    联合查询

    把查询结果拼到一起。

    语法:一次的查询结果 union all 另一次的查询结果

    1. select count(*) from ttable where sex='男'
    2. union all
    3. select count(*) from ttable where sex='女';

    分组查询快,但是联合查询适合与其他情况 


    练习

    假设有表ttable,列名分别是学生学号id、性别sex、分数score、课程名project、学生名student

    表:studenttable学生信息表,coursetable课程表,sctable学生选课表

    问题汇总:

    1、查询每门课程被选修的学生数

    2、查询至少选修两门课程的学生学号

    3、求上一题学生对应的信息

    4、查询选修了全部课程的学生信息

    5、查询没有选修了全部课程的学生信息

    6、查询学过张三老师课程同学的信息

    7、查询没学过张三老师课程同学的信息

    8、查询每个同学01课程的成绩和个人信息

    9、查询01课程分数>02课程分数的同学的学生信息

    1. # 查询每门课程被选修的学生数
    2. # 一般有每,就是说明要分组了
    3. select project,count(student) from ttable group by project;
    4. # 查询至少选修两门课程的学生学号
    5. # 可以分两步:
    6. # 查询每个学生选修的课程数
    7. select student,count(projet) num from ttable group by student;
    8. # 课程数>=2的学生学号
    9. select student,count(projet) num from ttable group by student having num>=2;
    10. # 求上一题学生对应的信息
    11. select * from ttable where student in (
    12. select student from ttable group by student having count(projet)>=2
    13. );
    14. # 如果没有num这一列需要显示,那么就在后面出现
    15. # select查询结果可以作为一列或者一个结果集出现在另一个查询语句当中
    16. # 选修课程少于两门课程的学生信息
    17. select * from ttable where student not in(
    18. select student from ttable group by project having count(project)>=2
    19. );

    select时候,可以作为一个数据集。

    1. # 查询选修了全部课程的学生信息
    2. # 先查询全部课程
    3. select count(project) from ttable;
    4. # 每个学生选修的课程个数
    5. select count(project) from ttable group by student;
    6. # 两个个数相等的学生id
    7. select student from ttable where count(project)=(select count(project) from ttable);
    8. # 注,其中的ttable表不是一张
    9. # 根据学生id查询学生信息
    10. select * from ttable where student in (
    11. select student from ttable where count(project)
    12. =(select count(project) from ttable)
    13. );
    1. # 查询学过张三老师课程同学的信息
    2. #
    3. select teacher from teachertable where teacher='张三';
    4. #
    5. select project from coursetable where teacher in (#1);
    6. #
    7. select student from sctable where course in (#2);
    8. #
    9. select * from ttable where student in (#3);

    根据老师名字查询老师id,根据老师id查课程id,根据课程id查谁选了,再查这些人的信息。

    1. # 查询每个同学01课程的成绩和个人信息
    2. select student,score from sctable where course='01';
    3. select course from sctable where course='01';
    4. select *,(
    5. select student,score from sctable where course='01'
    6. and
    7. sctable.student=studentable.student
    8. ) 01课程成绩
    9. from studenttable where student in (
    10. select course from sctable where course='01'
    11. );

    这里注意的是,如果是表的拼接,那么就要让对应信息相同,即两个表.列名想等。

    1. # 查询01课程分数>02课程分数的同学的学生信息
    2. select score from scoretable where course='01' and scoretable.student=coursetable.student;
    3. select *,(#1) 01score,(#2),02score from studenttable having 01score>02score;

     having表示的就是,之前没有的条件,我们的条件是新增的。

    还可以:将select查询的结果,作为一个新的表

    1. select *,(#1) 01score,(#2),02score from studenttable having 01score>02score;
    2. select * from (
    3. select *,(#1) 01score,(#2),02score from studenttable having 01score>02score
    4. ) a where a.01>a.02;
    5. having 01score is not null and 02score is not null;

    判断非空,is not null

    视图

    优化sql语句的。

    是虚拟表,可以不满足范式要求。

    视图;由一个或多个表,导出的临时表,不需要满足范式的要求。

    视图view,视图创建好之后,会长久存在于数据库中,查询语句就可以通过使用视图来代替

    1. # 创建视图
    2. create view 视图名 as (select语句);
    3. create view myview as (select...);
    4. # 使用视图
    5. select * from myview where
    6. # 删除视图
    7. drop view myview;

    视图的优缺点:

    数据库是通过服务器传,进行数据库传递,因此数据库的语句都是在内部

    优点:减少网络流量,保证sql语句吧刽有问题

    缺点:视图并没有提高查询效率,一般是查询内容较多的情况用视图

  • 相关阅读:
    HFSS脚本建模入门
    docker容器内访问主机端口服务
    【C语言】通讯录(动态版本)
    【学习笔记】Half-GCD
    uniApp实现热更新
    jenkins插件迁移
    经典算法之直接插入排序法
    IP代理安全吗?如何防止IP被限制访问?
    Chrome浏览器 键盘快捷键整理
    hibernate中错误解决
  • 原文地址:https://blog.csdn.net/callmejielun/article/details/126511707