兄弟们我先肝为敬,MySQL数据库的查询大总结

查询

  • 全列查询 select*from student. *:当前表中的所有字段
    在这里插入图片描述我们来准备一个数据表:
DROP TABLE IF EXISTS exam_result;
 CREATE TABLE exam_result (
  id INT, name VARCHAR(20),
   chinese DECIMAL(3,1),
    math DECIMAL(3,1), 
    english DECIMAL(3,1) );
    INSERT INTO exam_result (
    id,name, chinese, math, english)
     VALUES (1,'唐三藏', 67, 98, 56), 
     (2,'孙悟空', 87.5, 78, 77),
      (3,'猪悟能', 88, 98, 90),
       (4,'曹孟德', 82, 84, 67),
        (5,'刘玄德', 55.5, 85, 45),
         (6,'孙权', 70, 73, 78.5),
          (7,'宋公明', 75, 65, 30);
  • 全列查询
    在这里插入图片描述
  • 指定列查询
select id,name from exam_result;

在这里插入图片描述查询字段为表达式
在这里插入图片描述

  • 将所有的数学成绩+10

在这里插入图片描述

  • 查询总分
    在这里插入图片描述
    起别名关键字:as
    起别名 : XXX as 别名
    在这里插入图片描述
    也可以给表起别名。
    在这里插入图片描述
    起别名的作用:就是当列名或者表名太复杂了 比如太长了其此时就可以用别名代替
  • 条件查询
    当我们需要特定信息时,我们可以使用一些关键字来限制我们所查询的信息,得到我们想要的数据。
    现在我们有这样一张表:
    在这里插入图片描述
  • 我们查询所有人的数学成绩
select math from exam_result;

在这里插入图片描述

上面的结果有重复的数字,我们如何让它不重复呢----------使用关键字distinct

  • 去重(distinct)
    在这里插入图片描述
    请问这样的语句是否可以?
select id,name,distinct math from exam_result;

答案是不可以的
在这里插入图片描述以上这条语句位置不对!!需要把去重放在第一位

select distinct math, id,name from exam_result;

在这里插入图片描述
那么,去重的原理到底是什么?记住了,去重 针对的是, 所有的字段!!只有当select distinct math, id,name from exam_result;中 的三个字段同时重复的时候,才会去 重!!!

排序

  • 将查询结果 按照,根据数学成绩进行从低到高(升序)排序
    在这里插入图片描述或者:
    在这里插入图片描述如果升序排序数据,我们一般不用加关键字asc,因为在mysql中是默认升序排序的。
  • 将查询结果 按照,根据数学成绩进行从高到低(降序)排序
    此时我们要用到关键字desc
    在这里插入图片描述
    在这里插入图片描述
    关键字不可以乱用,比如Java中你不可以将int作为变量名,类似的,mysql中你也不可以将desc等关键字用作表名,如果你那样干了,结果就会出错。但是如果你非要这样干,也并不是没有办法,在用作变量名的时候,一定要 加符号:‘desc’.

对于要排序的字段为NULL的时候:
在这里插入图片描述在这里插入图片描述排序查询:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
总结:

  • 1、order by asc 和 order by 默认是从低到高进行排序的
  • 2、order by desc 是从高到第排序的
  • 3、对于MySQL的关键字 ,在用作变量名的时候,一定要 加符号:‘ desc’

注意:查询的顺序问题:
在这里插入图片描述为什么会出错呢?
原因是:他会首先执行:SELECT name, total FROM exam_result ; 但是 此时并不认识 total是啥
在这里插入图片描述

  • 查询同学各门成绩,依次按 数学降序,英语升序,语文 升序的方式显示
    在这里插入图片描述
  • where 条件查询
--查询数学成绩大于80分的 同学的个人信息及数学成绩
select id,name,math from exam_result where math>80;

在这里插入图片描述

--查询数学成绩大于80分的 同学的个人信息及数学成绩, 然后根据数学成绩升序排序
select id,name,math from exam_result where math>80 order by math;

在这里插入图片描述

--查询数学成绩等于98分的同学及个人信息
select id,name,math from exam_result where math=98;

在这里插入图片描述

注意NULL: = 不安全 对于NULL 查不到

在这里插入图片描述解决问题:使用 <=> 这个运算符
在这里插入图片描述
不等于运算符: <> !=

在这里插入图片描述
在这里插入图片描述大家有没有发现,为什么math为NULL的没有显示?

原因就是 null 不能直接用算术运算符 进行比较

--查询数学成绩84-98之间的同学及成绩
select id,name,math from exam_result where math between 84 and 98;
--查询数学成绩在98,85,73 中的 所有同学的数学成绩和个 人信息
select id,name,math from exam_result where math in(98,73,85);

在这里插入图片描述
in : math in(98,73,85) 代表的是:只要数学成绩属于其中 的某一个就进行查询。

--此时使用的是or
select id,name,math from exam_result where math =98 or math = 73 or math=85;

在这里插入图片描述

  • IS NULL
  • IS NOT NULL
    在这里插入图片描述
    在这里插入图片描述

模糊查询:LIKE

--查找名字当中 包含 "三"的 学生的信息
select * from exam_result where name like '% 三%';

在这里插入图片描述
在这里插入图片描述
%代表的就是一个通配符。
在这里插入图片描述

  • 下划线 _ 通配符
  • 用途与%一样,但它只匹配单个字符,而不是多个字符
  • 在这里插入图片描述
  • NOT 是结合 使用的。
    在这里插入图片描述
    在这里插入图片描述
  • 学到这了,我们来做个题练习一下
    在这里插入图片描述
-- 查询英语不及格的同学及英语成绩 ( < 60 ) 
select id,name,english from exam_result where english<60;
-- 查询语文成绩好于英语成绩的同学
select id,name from exam_result where chinese>english;
 -- 查询总分在 200 分以下的同学
 注:where条件后不可以使用别名
 select id,name,chinene+english+math as total
  where  chinene+english+math<200;
  -- 查询语文成绩大于80分,且英语成绩大于80分的同学
  select id,name,chinese,english from exam_result wher chinese>80 and english >80;
   -- 查询语文成绩在 [80, 90] 分的同学及语文成绩 
  1: select id,name,chinese form exam_result where chinese between 80 and 90;
 2:   select id,name,chinese from exam_result where chinese>=80 and chinese<=90; 
   -- 查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学 及数学成绩
   1:select id,name,math from exam_result where math in(58,59,98,99);
   2:select id,name,math from exam_result where math=58 or math=59 or math=98 or math=99;
    -- 查询 qq_mail 已知的同学姓名
    select * from exam_result where qq_mail is not NULL;

分页查询Limit

开始之前先提个问题,为什么要分页?
主要是有时候,数据量太大了,那么一次性查找 数据的时候,系统会执行SQL语句,此时查询是需要时间 的。有可能系统就会被卡住!所以,一般优化的方案就是用 分页查询

原理:每次只查询当前页需要显示的数据即可。如果 每页10条数据,那么只查询10条数据。每次点击下一页的时候,又会请求 查询10条数据。这样效率就提高了!
语法:select * from exam_result limit s,n; 从偏移位置 为s的地方,取出n条数据。
在这里插入图片描述

 举个例子
 解释一下 LIMIT 2,1 的意思:

SQL 中,行号是从 0 开始的。所以 LIMIT 2,1 中, 2 是指从第三条记录开始,1
是指取一条记录。合起来就是,从第三条记录开始(包括第三条记录!),取一条记录
在这里插入图片描述在这里插入图片描述![在这里插入图片描述](https://img-blog.csdnimg.cn/5bc5c34e59874296ab055d12433bbdba.png

如果n的值过大,那么也没关系,只会查询到,能查询的内 容:
在这里插入图片描述如果S过大 ,那么SQL不会报错,但是什么也查不到。
在这里插入图片描述
如果没有写S,那么默认是从0偏移开始取n个
在这里插入图片描述

  • 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用

SELECT … FROM table_name [WHERE …] [ORDER BY …] LIMIT n OFFSET s;

  • 更新update
    – 将孙权的数学成绩,更新为99分。
    在这里插入图片描述`
> update exam_result set math=99 where name='孙 权';

在这里插入图片描述
– 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分

UPDATE exam_result SET math = 60, chinese = 70
WHERE name = '曹孟德';

在这里插入图片描述– 将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
1、找总成绩倒数前3的同学。
在这里插入图片描述

2、 数学成绩加上 30 分,实际上是更新

UPDATE exam_result SET math = math + 30 ORDER BY chinese + math + english LIMIT 3;
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

little-peter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值