第10讲——MySQL查询数据1

97 阅读7分钟

❤️持续创作,加速成长!开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情

🎨 个人介绍

👉大家好,我是:旺仔不是程序员

👉认真分享技术,记录学习过程的点滴,如果我的分享能为你带来帮助,请支持我奥🍻

👉你的支持,是我每天更新的动力。

👉赞点:👍 留言:✍ 收藏:⭐

👉个人格言:想法一步一步的落实,才是你我前进最佳选择。

my.jpeg

基本查询

1. 对于查询的概述

  1. 语法格式
 select 
   [all|distinct]
   <目标列的表达式1> [别名],
   <目标列的表达式2> [别名]...
 from <表名或视图名> [别名],<表名或视图名> [别名]...
 [where<条件表达式>]
 [group by <列名>  [having <条件表达式>]]
 [order by <列名> [asc|desc]]
 [limit <数字或者列表>];
  1. 简化版语法
 select *, 列名 fromwhere 条件
  1. select语句的执行顺序
 FROM
 <表名> # 选取表,将多个表数据通过笛卡尔积变成一个表。
 ON
 <筛选条件> # 对笛卡尔积的虚表进行筛选
 JOIN<join, left join, right join...>
 <join> # 指定join,用于添加数据到on之后的虚表中,例如left join会将左表的剩余数据添加到虚表中
 WHERE
 <where条件> # 对上述虚表进行筛选
 GROUP BY
 <分组条件> # 分组
 <SUM()等聚合函数> # 用于having子句进行判断,在书写上这类聚合函数是写在having判断里面的
 HAVING
 <分组筛选> # 对分组后的结果进行聚合筛选
 SELECT
 <返回数据列表> # 返回的单列必须在group by子句中,聚合函数除外
 DISTINCT
 # 数据除重
 ORDER BY
 <排序条件> # 排序
 LIMIT
 <行数限制>

2. 查询分类

1. 创建查询数据

 # 创建表
 CREATE TABLE fruits
 (
 f_id    char(10)        NOT NULL,
 s_id    INT         NOT NULL,
 f_name  char(255)   NOT NULL,
 f_price decimal(8,2)    NOT NULL,
 PRIMARY KEY(f_id) 
 )
 # 为了演示如何使用SELECT语句,需要插入如下数据:
  INSERT INTO fruits (f_id, s_id, f_name, f_price)
      VALUES('a1', 101,'apple',5.2),
      ('b1',101,'blackberry', 10.2),
      ('bs1',102,'orange', 11.2),
      ('bs2',105,'melon',8.2),
      ('t1',102,'banana', 10.3),
      ('t2',102,'grape', 5.3),
      ('o2',103,'coconut', 9.2),
      ('c0',101,'cherry', 3.2),
      ('a2',103, 'apricot',2.2),
      ('l2',104,'lemon', 6.4),
      ('b2',104,'berry', 7.6),
      ('m1',106,'mango', 15.6),
      ('m2',105,'xbabay', 2.6),
      ('t4',107,'xbababa', 3.6),
      ('m3',105,'xxtt', 11.6),
      ('b5',107,'xxxx', 3.6);
 # 测试查询 使用SELECT语句查询f_id字段的数据。
 SELECT f_id, f_name FROM fruits;
 ​
 ​
 # 查询空值的数据准备
 # 下面,在数据库中创建数据表customers,该表中包含了本章中需要用到的数据。
 CREATE TABLE customers
 (
   c_id      int       NOT NULL AUTO_INCREMENT,
   c_name    char(50)  NOT NULL,
   c_address char(50)  NULL,
   c_city    char(50)  NULL,
   c_zip     char(10)  NULL,
   c_contact char(50)  NULL,
   c_email   char(255) NULL,
   PRIMARY KEY (c_id)
 );
 # 为了演示需要插入数据,请读者插入执行以下语句。
 INSERT INTO customers(c_id, c_name, c_address, c_city, 
 c_zip,  c_contact, c_email) 
 VALUES(10001, 'RedHook', '200 Street ', 'Tianjin', 
  '300000',  'LiMing', 'LMing@163.com'),
 (10002, 'Stars', '333 Fromage Lane',
  'Dalian', '116000',  'Zhangbo','Jerry@hotmail.com'),
 (10003, 'Netbhood', '1 Sunny Place', 'Qingdao',  '266000',
  'LuoCong', NULL),
 (10004, 'JOTO', '829 Riverside Drive', 'Haikou', 
  '570000',  'YangShan', 'sam@hotmail.com');
 # 查看数据
 SELECT *  FROM customers;
 # 统计数据条数
 SELECT COUNT(*) AS cust_num  FROM customers;
 ​
 # 分组数据,创建表
 # 为了演示效果,首先创建数据表,SQL语句如下:
 CREATE TABLE orderitems
 (
   o_num      int          NOT NULL,
   o_item     int          NOT NULL,
   f_id       char(10)     NOT NULL,
   quantity   int          NOT NULL,
   item_price decimal(8,2) NOT NULL,
   PRIMARY KEY (o_num,o_item)
 ) ;
 # 然后插入演示数据。SQL语句如下:
 INSERT INTO orderitems(o_num, o_item, f_id, quantity, item_price)
 VALUES(30001, 1, 'a1', 10, 5.2),
 (30001, 2, 'b2', 3, 7.6),
 (30001, 3, 'bs1', 5, 11.2),
 (30001, 4, 'bs2', 15, 9.2),
 (30002, 1, 'b3', 2, 20.0),
 (30003, 1, 'c0', 100, 10),
 (30004, 1, 'o2', 50, 2.50),
 (30005, 1, 'c0', 5, 10),
 (30005, 2, 'b1', 10, 8.99),
 (30005, 3, 'a2', 10, 2.2),
 (30005, 4, 'm1', 5, 14.99);

2. 单表查询实战

  1. 在SELECT语句中使用星号(*)通配符查询所有字段
 # 从fruits表中检索所有字段的数据,SQL语句如下:
 SELECT * FROM fruits;
  1. 在SELECT语句中指定所有字段和单个字段
 ## 以后查询建议使用这样,不要使用 *
 SELECT f_id, s_id ,f_name, f_price FROM fruits;
 # 查询fruits表中f_name列所有水果名称,SQL语句如下:
 SELECT f_name FROM fruits;
 # 例如,从fruits表中获取f_name和f_price两列,SQL语句如下:
 SELECT f_name, f_price FROM fruits;
 # 查询价格为10.2元的水果的名称,SQL语句如下:
  1. 查询指定记录
 SELECT f_name, f_price
 FROM fruits
 WHERE f_price = 10.2;
 # 查找名称为“apple”的水果的价格,SQL语句如下:
 SELECT f_name, f_price
 FROM fruits
 WHERE f_name = 'apple';
 # 查询价格小于10的水果的名称,SQL语句如下:
 SELECT f_name, f_price
 FROM fruits
 WHERE f_price < 10;
  1. 模糊查询
 # s_id为101102的记录,SQL语句如下:
 # IN操作符用来查询满足指定范围内的条件的记录
 SELECT s_id,f_name, f_price 
 FROM fruits 
 WHERE s_id IN (101,102) 
 ORDER BY f_name;
 ​
 # 查询所有s_id不等于101也不等于102的记录,SQL语句如下:
 # 可以使用关键字NOT来检索不在条件范围内的记录
 SELECT s_id,f_name, f_price
 FROM fruits
 WHERE s_id NOT IN (101,102)
 ORDER BY f_name;
 ​
 # 查询价格在2.00元到10.20元之间的水果名称和价格,SQL语句如下:
 # BETWEEN AND用来查询某个范围内的值
 # 该操作符需要两个参数,即范围的开始值和结束值
 SELECT f_name, f_price 
 FROM fruits 
 WHERE f_price BETWEEN 2.00 AND 10.20;
 # 查询结果如下:
 SELECT f_name, f_price
 FROM fruits
 WHERE f_price BETWEEN 2.00 AND 10.20;
          
 # 查询价格在2.00元到10.20元之外的水果名称和价格,SQL语句如下:
 # BETWEEN AND操作符前可以加关键字NOT,表示指定范围之外的值
 SELECT f_name, f_price
 FROM fruits 
 WHERE f_price NOT BETWEEN 2.00 AND 10.20;
 ​
 # 查找所有以’b’字母开头的水果,SQL语句如下:
 # 百分号通配符‘%’,匹配任意长度的字符,甚至包括零字符
 SELECT f_id, f_name
 FROM fruits
 WHERE f_name LIKE 'b%';
 # 在fruits表中,查询f_name中包含字母’g’的记录,SQL语句如下:
 SELECT f_id, f_name
 FROM fruits
 WHERE f_name LIKE '%g%';
 # 查询以’b’开头,并以’y’结尾的水果的名称,SQL语句如下:
 SELECT f_name
 FROM fruits
 WHERE f_name LIKE 'b%y';
 ​
 # 在fruits表中,查询以字母’y’结尾,且’y’前面只有4个字母的记录,SQL语句如下:
 # 下划线通配符‘_’,一次只能匹配任意一个字符
 SELECT f_id, f_name FROM fruits WHERE f_name LIKE '----y';
  1. 逻辑查询
 # 查询customers表中c_email为空的记录的c_id、c_name和c_email字段值,SQL语句如下:
 SELECT c_id, c_name,c_email 
 FROM customers 
 WHERE c_email IS NULL
 ​
 ​
 # 查询customers表中c_email不为空的记录的c_id、c_name和c_email字段值,SQL语句如下:
 SELECT c_id, c_name,c_email 
 FROM customers 
 WHERE c_email 
 IS NOT NULL
 ​
 # 在fruits表中查询s_id = 101,并且f_price大于等于5的水果价格和名称,SQL语句如下:
 SELECT f_id, f_price, f_name 
 FROM fruits 
 WHERE s_id = '101' AND f_price >=5;
 ​
 # 在fruits表中查询s_id = 101或者102,且f_price大于5,并且f_name=‘apple’的水果价格和名称,SQL语句如下:
 SELECT f_id, f_price, f_name 
 FROM fruits 
 WHERE s_id IN('101', '102') AND f_price >= 5 AND f_name = 'apple';
 ​
 # 查询s_id=101或者s_id=102的水果供应商的f_price和f_name,SQL语句如下:
 # OR会使得索引失效
 SELECT s_id,f_name, f_price 
 FROM fruits 
 WHERE s_id = 101 OR s_id = 102;
 ​
 # 查询s_id=101或者s_id=102的水果供应商的f_price和f_name,SQL语句如下:
 SELECT s_id,f_name, f_price 
 FROM fruits 
 WHERE s_id IN(101,102);
 ​
 # 查询fruits表中s_id字段的值,返回s_id字段值且不得重复,SQL语句如下:
 SELECT DISTINCT s_id FROM fruits;
  1. 排序、分组查询
 # 查询fruits表的f_name字段值,并对其进行排序,SQL语句如下:
 SELECT f_name FROM fruits ORDER BY f_name;
 ​
 # 查询fruits表中的f_name和f_price字段,先按f_name排序,再按f_price排序,SQL语句如下:
 SELECT f_name, f_price FROM fruits ORDER BY f_name, f_price;
 ​
 # 查询fruits表中的f_name和f_price字段,对结果按f_price降序方式排序,SQL语句如下:
 SELECT f_name, f_price FROM fruits ORDER BY f_price DESC;
 # 查询fruits表,先按f_price降序排序,再按f_name字段升序排序,SQL语句如下:
 SELECT f_price, f_name FROM fruits ORDER BY f_price DESC, f_name;
 ​
 # 根据s_id对fruits表中的数据进行分组,SQL语句如下:
 SELECT s_id, COUNT(*) AS Total FROM fruits GROUP BY s_id;
 # 根据s_id对fruits表中的数据进行分组,将每个供应商的水果名称显示出来,SQL语句如下:
 SELECT s_id, GROUP_CONCAT(f_name) AS Names FROM fruits GROUP BY s_id;
 # 根据s_id对fruits表中的数据进行分组,并显示水果种类大于1的分组信息,SQL语句如下:
 SELECT s_id, GROUP_CONCAT(f_name) AS Names 
 FROM fruits 
 GROUP BY s_id HAVING COUNT(f_name) > 1;
 ​
 # 根据s_id对fruits表中的数据进行分组,并显示记录数量,SQL语句如下:
 SELECT s_id, COUNT(*) AS Total 
 FROM fruits 
 GROUP BY s_id WITH ROLLUP;
 ​
 # 根据s_id和f_name字段对fruits表中的数据进行分组, SQL语句如下,
  SELECT * FROM fruits group by s_id,f_name;
 ​
 ​
 # 查询订单价格大于100的订单号和总订单价格,SQL语句如下:
 SELECT o_num,  SUM(quantity * item_price) AS orderTotal
 FROM orderitems
 GROUP BY o_num
 HAVING SUM(quantity*item_price) >= 100;
 # 可以看到,返回的结果中orderTotal列的总订单价格并没有按照一定顺序显示
 # 接下来,使用ORDER BY关键字按总订单价格排序显示结果,SQL语句如下:
 SELECT o_num,  SUM(quantity * item_price) AS orderTotal
 FROM orderitems
 GROUP BY o_num
 HAVING SUM(quantity*item_price) >= 100
 ORDER BY orderTotal;
  1. 分页查询
 # 显示fruits表查询结果的前4行,SQL语句如下:
 # LIMIT [位置偏移量,] 行数
 SELECT * From fruits LIMIT 4;
 ​
 # 在fruits表中,使用LIMIT子句,返回从第5个记录开始的,行数长度为3的记录,SQL语句如下:
 SELECT * From fruits LIMIT 4, 3;