MySQL-记录的操作(查询记录)

一.简单查询

  • 格式:select 字段名 from 表名

  • 字段名可以指定一个,也可以指定多个,使用*代表查询所有字段

  • 表名必须存在

  • select后边可以对指定字段进行数学运算

    # 使用*可以查询到当前表中的所有字段
    SELECT * FROM product;
    
    # 查询所有商品的指定字段(商品名,商品价格)
    SELECT pname, price FROM product;
    
    # 将商品名称及商品价格互换位置,则输出的数据列位置同样进行更改
    SELECT price, pname FROM product;
    
    # 查询所有商品价格的同时对所有的商品价格+10后进行输出
    SELECT pname, price + 10 FROM product;
    

二.比较查询

  • < > <= >= = != <>

    # 需求:查询商品价格大于600的所有商品信息
    SELECT * FROM product WHERE price > 600;
    
    # 查询商品价格小于2000的所有商品信息
    SELECT * FROM product WHERE price < 2000;
    
    # 查询商品价格小于等于1000的所有商品的名称
    SELECT pname FROM product WHERE price <= 1000;
    
    # 查询 商品价格大于等于800的多有商品的名称和价格
    SELECT pname, price FROM product WHERE price >= 800;
    
    # 查询商品价格不等于800的所有商品的信息
    SELECT * FROM product WHERE price != 800;
    SELECT * FROM product WHERE price <> 800;
    

三.范围查询

  • between and 查询连续范围内的数据,包含左右边间,是一个闭区间

  • between and 必须从小值到大值进行范围划分,否则没有数据

  • in 查询不连续区间内的数据,in (数据1, 数据2 。。。。。)

  • 格式:select 列名 from 表名 where 字段名 in (数据1, 数据2, 数据3 。。。。)

    # 需求: 查找,价格在200-2000范围内的所有商品,包含起始和终止位置,是一个闭区间[]
    SELECT * FROM product WHERE price BETWEEN 200 AND 2000;
    
    # in 不连续范围查询
    # 需求:查找价格是200, 800, 2000, 5000的所有商品的全部信息
    SELECT * FROM product WHERE price IN (200, 800, 2000, 5000);
    
    # 查询在安徽和北京的同学
    SELECT * FROM  student_info WHERE hometown in not ('安徽', '北京');
    

四.逻辑查询

  • 逻辑运算符

  • and 逻辑与 同真即真

  • or 逻辑或 同假即假

  • not 逻辑非 非真即假,非假即真

    # 需求: 查询价格在200-2000之间的所有商品,如果需要包含边界,则需要使用大于等于和小于等于
    SELECT * FROM product WHERE price <= 2000 AND price >= 200;
    
    # 需求:查询价格不再200-2000范围内的所有商品信息
    SELECT * FROM product WHERE NOT (price <= 2000 AND price >= 200);
    # 方法二:
    SELECT * FROM product WHERE price > 2000 OR  price < 200;
    

五.模糊查询

  • like关键字,可以进行模糊查询:根据指定规则进行查询

    • %:代表0个或多个字符
    • _:代表一个字符
  • 格式: select 列名 from 表名 where 字段 like 规则;

    # 需求:查询名字以"斯"结尾的所有商品
    SELECT * FROM product WHERE pname LIKE '%斯';
    
    # 需求,查询名字以"海"开头的所有商品
    SELECT * FROM product WHERE pname LIKE '海%';
    
    # 需求:查询名字中带有"霸"的所有商品
    SELECT * FROM product WHERE pname LIKE '%霸%';
    
    # 需求:查询名字是两个字的所有商品
    SELECT * FROM product WHERE pname LIKE '__';
    
    # 查询名字是三个字符,且结尾为斯的商品信息
    SELECT * FROM product WHERE pname LIKE '__斯';
    

六.非空查询

  • is null 判断是否为空
  • is not null 判断是否不为空
  • 格式: select 列名 from 表名 where 字段名 is (not) null;
    # 需求: 删除pid =10 的category_id 的值
    UPDATE product SET category_id = NULL WHERE pid = 10;
    
    # 需求: 查询所有商品中,category_id为空的商品
    # null 是不能和其他数据类型进行比较的
    # 如果需要判断当前数据是否为空值,则使用is null判断
    SELECT * FROM product WHERE category_id IS NULL;
    
    # 需求:查询所有商品中category_id不为空的商品
    SELECT * FROM product WHERE category_id IS NOT NULL;
    SELECT * FROM product WHERE NOT (category_id IS NULL);
    
    # 查询所有商品中category_id为空  且 pname 不为空的商品(加上括号易于阅读,并且不容易出错)
    SELECT * FROM product WHERE (category_id IS NULL) AND (pname IS NOT NULL);
    

七.排序查询

  • order by:排序的关键字,可以构建指定字段,指定规则的排序
  • 格式: select 列名 from 表名 where 条件 order by 字段名 排序规则(asc 升序、 desc 降序);
  • 如果按照多个字段进行排序,先按照排在前边的字段进行排序,如果排序值相同,则按照后边的规则排序。
  • 如果需要升序排列,则不需要使用ASC,默认就是升序排列
  • 按照多个字段规则进行排序,则先按照最前面的规则排序,如果排序过程中,值相同,则按照后边的规则进行排序
  • 文本型数据排序规则
    • 没有数据 < 有数据
    • 排序按照编码表顺序排序 排在前边的小 排在后边的大 0-9依次递增 < A-Z 依次递增 < a - z 依次等
    • 文本型数据比较大小按位比较,第一位进行比较如果值大则大,值小则小,如果相同,则比较第二位
    # 需求:查询所有商品中,价格大于2000的商品并按照升序进行排列.
    SELECT * FROM product WHERE price > 2000 ORDER BY price ASC;
    
    # 需求:按照categroy_id进行升序排列,如果categroy_id相同,则按照价格进行降序排列
    SELECT * FROM product ORDER BY category_id ASC , price DESC ;
    
    # 需求:按照价格进行降序排列,如果价格相同,则按照category_id进行升序排列
    SELECT * FROM product ORDER BY price DESC , category_id;
    

八.分组查询

  • group by :将记录按照指定字段分成多组,字段相同的内容分为一组

  • 格式:select 分组字段/聚合函数/其他函数 from 表名 group by 分组字段 having 条件

  • having

    • 在group by 分组之后,不能使用where进行条件查询,只能通过having进行条件筛选
    • 在having中可以使用聚合函数,但是在where 中不可以使用
  • 在linux 中默认开启了group by 严格模式,在select后边不能使用除了分组字段外的其他字段

    # 需求:查询当前产品中每一类商品各有多少个
    SELECT category_id, count(*) FROM product GROUP BY category_id;
    # 需求:查询当前商品中,每一类商品的平均价格是多少?
    SELECT category_id, avg(price) FROM product GROUP BY category_id;
    # 需求:查询每一类商品的最大价格是多少?
    SELECT category_id, max(price) FROM product GROUP BY category_id;
    
    # 需求,查询出商品种类超过两种的商品类型
    SELECT category_id, count(*) FROM product GROUP BY category_id HAVING count(*) >= 2;
    
    # 根据多个字段进行分组
    # 根据多个字段分组的原则就是,两个字段同时相等,则分为一组,如果有一个字段不相同,也不能分为一组
    SELECT category_id, price FROM product GROUP BY category_id, price;
    
    # 拓展  查看当前每一类商品的所有商品名称
    # 在查询数据时,每一个组中有多条记录,在查询过程中,不能使用除分组字段外的其他字段进行显示,因为对应记录较多,不知道该获取哪一条记录
    SELECT category_id, group_concat(pname) FROM product GROUP BY category_id;
    
    

九.分页查询

  • 分页查询就是将查询到的数据按照一定的规则截取其中的一部分
    • 格式:select 字段 from 表名 limit m , n
    • m:当前也开始索引的位置
    • n:当前页所要展示的条目数
    # 需求:查询所有的商品数据,并展示前三条数据
    SELECT * FROM product LIMIT 0, 3;
    # 如果从开头开始展示,可以将起始位置进行省略
    SELECT * FROM product LIMIT 3;
    # 需求:查询所有商品数据,并展示第5-7条数据
    SELECT * FROM product LIMIT 4, 3;
    

十.多表查询

  • 内连接:交集,在查询过程中,保留左右两侧共有的记录

  • 左连接:差集,在查询过程中,保留左侧表全部数据,以及右侧表可以匹配到左表的数据

  • 右连接:差集,在查询过程中,保留右侧表全部数据,以及左侧表可以匹配到右侧表的数据

     # 内连接:交集运算,左表中存在的数据,右表中也存在则被保存
    SELECT * FROM hero INNER JOIN kongfu on hero.kongfu_id = kongfu.kid;
    # inner可以被省略
    
    SELECT * FROM hero JOIN kongfu on hero.kongfu_id = kongfu.kid;
    # 左 外链接  左表中所有的数据都被保存下来,右表中只有能够匹配左表的数据被保留
    SELECT * FROM hero LEFT OUTER JOIN kongfu ON hero.kongfu_id = kongfu.kid;
    # outer 可以被省略
    SELECT * FROM hero LEFT JOIN kongfu ON hero.kongfu_id = kongfu.kid;
    
    # 右 外连接  右表中所有的数据都被保留下来,左表中只有能够匹配右表的数据被保留
    SELECT * FROM hero RIGHT OUTER JOIN kongfu ON hero.kongfu_id = kongfu.kid;
    # outer 可以被省略
    SELECT * FROM hero RIGHT JOIN kongfu ON hero.kongfu_id = kongfu.kid;
    
    
    # 字段名称和表名,可以使用as关键字,进行重命名,字段名称,
    # 重命名后,查询出来的内容的列名将会发生改变
    SELECT h.hname AS hero_name, k.kname  AS kongfu_name FROM hero AS h JOIN kongfu AS k ON h.kongfu_id = k.kid;
    # as 可以被省略,但是初学阶段不建议省略,增加可读性,方便日后复习
    SELECT h.hname hero_name, k.kname kongfu_name FROM hero h JOIN kongfu k ON h.kongfu_id = k.kid;
    
    

十一.子查询

  • 子查询就是select中嵌套一个select语句

  • select 查询,可以作为一个值,一个数据序列, 也可以作为一个表出现

  • 子查询可以单独执行,如果子查询单独执行出现报错那放到其他语句中一样会报错

    # 需求:获取所有商品的平均价格
    SELECT avg(price) FROM product;  # select 获取的是一个值
    
    # 需求:获取所有商品的名称
    SELECT pname FROM product;  # select 获取的是一列数据 (或者说一个向量数据)
    
    # 需求:获取所有商品的全部信息
    SELECT * FROM product; # select 获取的是一个表  (或者说获取的是一个矩阵)
    
    # 需求:获取产品价格大于平均价格的所有商品的信息
    SELECT * FROM product WHERE price > (SELECT avg(price) FROM product);
    
    # 需求: 获取和categroy_id= 1 的商品价格相同的所有商品
    # 结构: 获取商品信息  价格  in (类别为1的所有商品的价格)
    SELECT * FROM product WHERE price IN (SELECT price FROM product WHERE category_id = 'c001');
    
    # 需求: 获取所有的数据,价格大于平均值 且category_id 不等于'c001'()
    SELECT * FROM (SELECT * FROM product WHERE category_id != 'c002') AS c WHERE price > (SELECT avg(price) FROM product);
    
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值