MySQL(表)-实操:数据查询

练习1:成绩表筛选

创建成绩表(exam):

    CREATE TABLE exam(
        id INT PRIMARY KEY AUTO_INCREMENT,
        NAME VARCHAR(20) NOT NULL,
        chinese DOUBLE,
        math DOUBLE,
        english DOUBLE
    );

插入数据:

    INSERT INTO exam VALUES(NULL,'关羽',85,76,70);
    INSERT INTO exam VALUES(NULL,'张飞',70,75,70);
    INSERT INTO exam VALUES(NULL,'赵云',90,65,95);
    INSERT INTO exam VALUES(NULL,'刘备',97,50,50);
    INSERT INTO exam VALUES(NULL,'曹操',90,89,80);
    INSERT INTO exam VALUES(NULL,'司马懿',90,67,65);

我们将进行以下练习:

    1、查询表中所有学生的信息。
        SELECT * FROM exam;


    2、查询表中所有学生的姓名和对应的英语成绩。
       SELECT NAME,english FROM exam;


    3、过滤表中重复数据。
       SELECT DISTINCT * FROM exam; 


    4、在所有学生分数上加10分特长分。
    SELECT NAME 姓名,(chinese+10) 语文加10分,math=(math+10) 数学加10分,english=(english+10) 英语加10分 FROM exam;


    5、统计每个学生的总分。
       SELECT NAME 姓名,(chinese+math+english) 总分 FROM exam;


    6、使用别名表示学生分数。
      SELECT NAME 姓名,chinese 语文,math 数学,english 英语 FROM exam;


    -----使用WHERE子句
    7、查询姓名为刘备的学生成绩
        SELECT * FROM exam WHERE NAME="刘备";


    8、查询英语成绩大于90分的同学
       SELECT * FROM exam WHERE english>90;


    9、查询总分大于200分的所有同学
      SELECT * FROM exam WHERE (chinese+math+english)>200;


    10、查询英语分数在 80-90之间的同学。
           SELECT * FROM exam WHERE english>=80 AND english<=90;


    11、查询数学分数为89,75,91的同学。
        SELECT * FROM exam WHERE math=89 OR math=75 OR math=91;


    12、查询所有姓刘的学生成绩。
        SELECT * FROM exam WHERE NAME LIKE "刘%";


    13、查询所有姓刘两个字的学生成绩。
        SELECT * FROM exam WHERE NAME LIKE "刘_";


    14、查询数学分>80并且语文分>80的同学。
        SELECT * FROM exam WHERE math>80 AND chinese>80;


    15、查询数学分>80 或者 语文分>80的同学。
       SELECT * FROM exam WHERE math>80 OR chinese>80;


    ------使用ORDER BY  排序
    16、对数学成绩排序后输出。
        SELECT * FROM exam ORDER BY math;


    17、对总分排序按从高到低的顺序输出
        SELECT *,(chinese+math+english) 总分 FROM exam ORDER BY 总分 DESC;


    18、对姓赵的学生成绩排序输出
        SELECT *,(chinese+math+english) 总分 FROM exam WHERE NAME LIKE "赵%" ORDER BY 总分;


    ------使用COUNT(函数)
    19、统计一个班级共有多少学生?
       SELECT COUNT(*)  数量 FROM exam;


    20、统计数学成绩大于或等于90的学生有多少个?
        SELECT COUNT(*)  数量 FROM exam WHERE math>=90;

语文成绩大于或等于90的学生数量:

SELECT COUNT(*) 数量 FROM exam WHERE chinese>=90;


    21、统计总分大于220的人数有多少?
       SELECT COUNT(*) 数量 FROM exam WHERE (chinese+math+english)>220;


    -------使用SUM函数
    22、统计一个班级数学总成绩?
        SELECT SUM(math) 数学成绩总和 FROM exam;


    23、统计一个班级语文、英语、数学各科的总成绩
        SELECT SUM(chinese) 语文成绩总和,SUM(math) 数学成绩总和,SUM(english) 英语成绩总和 FROM exam;


    24、统计一个班级语文、英语、数学的成绩总和 
        SELECT SUM(chinese+math+english) 3科成绩总和 FROM exam;


    25、统计一个班级语文成绩平均分
        SELECT SUM(chinese)/COUNT(*) 语文成绩平均分 FROM exam;

也可以SELECT AVG(chinese) 语文成绩平均分 FROM exam;


    --------使用AVG函数
    26、求一个班级数学平均分?
        SELECT AVG(math) 数学成绩平均分 FROM exam;


    27、求一个班级总分平均分
       SELECT AVG(chinese+math+english) 班级总平均分 FROM exam;


    -------使用MAX,MIN函数
    28、求班级最高分和最低分(数值范围在统计中特别有用)

SELECT MAX(chinese+math+english) 班级最高分,MIN(chinese+math+english) 班级最低分 FROM exam;

如果要查询最高分是谁,不进行排名的方式

SELECT totals.NAME,totals.tscore FROM (SELECT NAME,(chinese+math+english) tscore FROM exam) totals WHERE totals.tscore=(SELECT MAX(chinese+math+english) tscore FROM exam);

如果要求以降序方式排名:(2种<1和2>方式实现,第3条是2的补充,带别名)

SELECT totals.NAME,totals.tscore FROM (SELECT NAME,(chinese+math+english) tscore FROM exam) totals ORDER BY totals.tscore DESC;

SELECT e.NAME,(e.chinese+e.math+e.english) tscore FROM exam e ORDER BY tscore DESC;

SELECT e.id 序号,e.NAME 姓名,(e.chinese+e.math+e.english) 总分数 FROM exam e ORDER BY 总分数 DESC;

2与3的对比

不断探索,有更多新的发现...

练习2:商品订单筛选

创建订单表:

    create table orders(
    id int,
    product varchar(20),
    price float
    );

插入订单数据:

INSERT INTO orders(id,product,price) VALUES(1,'电视',900),(2,'洗衣机',100),(3,'洗衣粉',90),(4,'桔子',9),(5,'洗衣粉',90);

查看表数据:

SELECT * FROM orders;

接下来的练习:

1.查询购买了哪几类商品,并且每类商品的单价大于95的商品

SELECT * FROM orders e2 WHERE e2.product IN (SELECT DISTINCT o1.product FROM orders o1) AND e2.price>90;

另一种方式:通过GROUP BY分组实现

SELECT product,price FROM orders WHERE price>95 GROUP BY product;(默认是升序,语句后面加DESC,降序的显示效果是一样的,见后面)

SELECT * FROM orders WHERE price>95 GROUP BY product DESC;

2.查询商品的单价大于85、单类商品的总价小于200的商品名称、总价:

SELECT * FROM (SELECT product 商品,SUM(price) 总价 FROM orders WHERE price>85 GROUP BY product DESC) sumprice WHERE sumprice.总价<200;

可以对比一下,商品单价和单类商品的总价查询的不同!(商品单价大于85)

商品单价:

SELECT product 商品,price 单价 FROM orders WHERE price>85 GROUP BY product DESC;

单类商品总价:

SELECT product 商品,SUM(price) 总价 FROM orders WHERE price>85 GROUP BY product DESC;

对比之后,个人觉得,问题出在“GROUP BY product”,如果只追求价格问题,可以参考下面的语句:

SELECT product 商品,price 单价 FROM orders WHERE price>85 GROUP BY price DESC;(GROUP BY product换成了GROUP BY price,看起来自然些,需要考虑,我们的重点在商品分类,还是价格分类?后面的意义不大)

不断探索,有更多新的发现...

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值