zoukankan      html  css  js  c++  java
  • 数据库查询

    廖雪峰数据库教学资料读书笔记.

    基操


    基本查询

    要查询数据表中的数据

    SELECT * FROM student;
    

    SELECT可以用于计算,但它并不是SQL的强项. 但是不带FROMSELECT语句可以有一个有用的用途.就是用来判断当前到数据库的链接是否有效, 许多检测工具都会执行一条 SELECT 1;用来测试数据库链接.


    条件查询

    有时候并不想获取所有的记录,而是根据调价选择性的获取指定的记录, 例如查询分数在80分以上的学生记录, 在一张表有百万记录的情况下, 获取所有记录不仅费时 ,而且浪费带宽. 获取students表中分数大于等于80的学生.

    SELECT * FROM students WHERE score >= 80;
    

    查询分数不低于80且是男生的记录

    SELECT * FROM students WHERE score>=80 AND gender='M';
    

    查询分数在80到90之间并且是男生的记录

    SELECT * FROM students WHERE (score >=80 AND score <=90) AND gender='M';
    SELECT * FROM students WHERE (score BETWEEN 80 AND 90) AND gender='M';
    

    查询(分数在80到90之间的男生) 或者女生.

    SELECT * FROM students WHERE (score >=80 AND score <= 90) or gender = 'F';
    

    查询不是女生且分数在80到90之间的人.

    SELECT * FROM students WHERE(score>=80 AND score<=90) AND (NOT gender='F')
    

    查询不是一班的人

    SELECT * FROM students WHERE(class_id<>1)
    SELECT * FROM students WHERE(NOT class_id=1)
    

    查询分数位数是5的记录

    SELECT * FROM students WHERE socre LIKE "%5";
    

    投影查询

    我们希望只返回我们指定想要的数据,而不是记录中的所有字段, 我们可以用 SELECT 字段1 字段2 字段3 FROM ...

    查询分数在90以上记录的name字段.

    SELECT name FROM students WHERE score>=90;
    

    排序

    查询所有一班同学并且按照成绩排序(倒序)

    SELECT id,name,score FROM students WHERE class_id=1 ORDER BY score;
    

    查询所有一班同学并且按照成绩排序(正序)

    SELECT id,name,score FROM students WHERE class_id=1 ORDER BY score DESC;
    

    先按照分数正序,如果分数相同,则按照id从大到小排序

    SELECT id,name,score,gender FROM students ORDER BY score DESC,id DESC;
    

    分页

    当数据量特别大的时候,放在一个页面上面显示是有点智障的, 这个时候应该分页显示.

    先将学生成绩从高到低排序, 然后分页. 一页3个 从第0个开始.

    SELECT id,name,gender,score FROM students ORDER BY score DESC LIMIT 3 OFFSET 0;
    

    查询第二页的信息.

    SELECT id,name,gender,score FROM students ORDER BY score DESC LIMIT 3 OFFSET 3;
    

    聚合查询

    如果要统计一张表的数据的量,例如查询students有多少记录的时候,用 SELECT * FROM students;查出来然后数一数 太沙雕了, 对于统计总数,平均数这一类常用计算 一定是会有聚合函数的, 使用聚合函数进行查询就是聚合查询, 它可以快速获得结果.

    SELECT COUNT(*) FROM students;
    

    count(*) 表示查询所有列的行数, 要注意的是虽然得到的结果显示 是一个数字, 但是实际上它还是一个二维表, 并且列名是count(*), 通常使用聚合查询的时候需要给列明设置一个别名,便于进行处理.

    SELECT COUNT(*) num FROM students;
    

    聚合查询同样也可以结合条件查询进行操作. 例如: 统计不低于80分的有几个人.

    SELECT COUNT(*) num FROM students WHERE score>=80; 
    

    除了COUNT之外还有计算总和,平均,最大,最小这些方法.

    函数 说明
    SUM 计算某一列合计值,该列必须为数值类型
    AVG 计算某一列平均值,该列必须为数值类型
    MAX 计算某一列最大值
    MIN 计算某一列最小值

    计算男生的平均成绩 (如果没有找到的话,返回NULL)

    SELECT AVG(score) average FROM students WHERE gender='M';
    

    如果要统计表中有多少记录的话 使用COUNT(*),或COUNT(id). 但是如果想使用其他字段的话 如果字段可以为NULL,则统计出来的数据是 表中该字段有多少记录.

    分组聚合

    如果我们要统计一班学生的数量我们可以 用SELECT COUNT(*) num FROM students WHERE class_id=1 查询,但是如果查询其他班级的话 每次都要更新SQL语句 就太烦了, 这个时候就用到了分组查询.

    SELECT COUNT(*) num FROM students GROUP BY class_id;
    

    查询班级人数,分数(保留两位小数),和班级id. 语句和结果如下

    SELECT class_id,COUNT(*) student_num,ROUND(AVG(score),2) avg_score FROM students GROUP BY class_id;
    
    class_id student_num avg_score
    1 4 86.5
    2 3 73.66666666666667
    3 3 89.33333333333333

    查询每个班级的男女生人数

    SELECT class_id, gender , count(*) FROM students GROUP BY class_id,gender;
    

    使用一条SQL 查询每个班级的男女平均分,结果集有六条记录.

    SELECT class_id,gender,ROUND(AVG(score),2) FROM students GROUP BY class_id,gender;
    

    多表联查

    SELECT 查询不仅仅可以从一张表查询数据,还可以从多张表中同事查询数据,查询多张表的语法是SELECT * FROM <表1> <表2> 此种方法又称为 笛卡尔查询.

    SELECT * FROM students,classes;
    

    这种一次查询两个表的数据,查询的结果还是一个二维表,它是 students和classes表的成绩,即students和classes拼接在一起返回的, 要注意的一点是小心记录大爆炸, 如果两个表分别有100条, 则会 返回1w条数据. 如果两个表分别由1w条数据, 则返回1亿条 数据, 这个 东西很智障.

    做笛卡尔成绩的时候 最好给输出的字段重命名一下.

    SELECT students.id 学号,students.name 姓名,students.gender 性别,students.score 分数,classes.id 课程ID,classes.name 班级名 FROM students,classes;
    

    多表查询的时候,要使用表名.列名这样的方式来应用列和设置别名. 但是,使用这种方法列举两个表的所有列有时候会因为 表名较长而比较麻烦, 这个时候我们可以用同样的方法给 表名起别名.

    SELECT s.id 学号,s.name 姓名,s.gender 性别,s.score 分数,c.id 课程编号,c.name 课程名称 FROM students s,classes c;
    

    笛卡尔积查询班级ID为1,且性别为男生的记录.

    SELECT s.id 学号,s.name 姓名,s.gender 性别,s.score 分数,c.id 课程编号,c.name 课程名称 FROM students s,classes c WHERE s.gender="M" AND c.id=1;
    

    连接查询

    连接查询是另一种类型的多表查询,链接查询对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行为有选择性的链接在主表结果集上. 例如:查询students表中的所有信息.

    SELECT s.id, s.name, s.class_id, s.gender, s.score FROM students s;
    

    如果我们想将班级也连接上去 怎么办? 按照以前所学 只能通过笛卡尔积.

    SELECT s.id ID,s.class_id 班级编号,s.`name` 姓名,s.gender	性别,s.score 分数,c.id 班级ID,c.name 班级名 FROM students s,classes c WHERE s.class_id=c.id;
    

    但是正如前面所说的 这个太蠢了. 然后试一下现在的 INNER JOIN. 其写法为 :

    1. 先确认主表 SELECT * FROM <表1>.
    2. 在确定需要链接的表 INNER JOIN <表2>
    3. 确认连接条件 ON <条件>. 将c.id = s.class_id的列进行链接.
    SELECT s.id ID,s.class_id 班级编号,s.`name` 姓名,s.gender	性别,s.score 分数,c.id 班级ID,c.name 班级名 FROM students s INNER JOIN classes c ON c.id=s.class_id;
    

    有内连接 就有外连接. 外连接会将 四班单独列出, 其他字段为NULL.

    SELECT s.id ID,s.class_id 班级编号,s.`name` 姓名,s.gender	性别,s.score 分数,c.id 班级ID,c.name 班级名 FROM students s RIGHT OUTER JOIN classes c ON c.id=s.class_id;
    

    右链接 , 右边是classes 以它为准 ,因为 四班没人 所以单列一个四班 其他字段为空.

    SELECT s.id ID,s.class_id 班级编号,s.`name` 姓名,s.gender	性别,s.score 分数,c.id 班级ID,c.name 班级名 FROM students s RIGHT OUTER JOIN classes c ON c.id=s.class_id;
    

    左连接 , 左边是students 以它为准, 所以不列出四班.

    SELECT s.id ID,s.class_id 班级编号,s.`name` 姓名,s.gender	性别,s.score 分数,c.id 班级ID,c.name 班级名 FROM students s LEFT OUTER JOIN classes c ON c.id=s.class_id;
    

    全连接 : 左连接代码 UNION 右连接代码 ;

    内连接 顾名思义 + 图 : 得到交集.

    左外连接

    右外连接

    全连接

    廖雪峰数据库教学资料读书笔记.

  • 相关阅读:
    3.12
    3.11
    安卓开发
    安卓开发
    安卓开发
    安卓开发
    安卓开发
    安卓开发
    安卓开发
    安卓开发
  • 原文地址:https://www.cnblogs.com/A-FM/p/11141819.html
Copyright © 2011-2022 走看看