MySql操作[数据查询]-20211222

SELECT 数据查询

基础

显示如何使用简单的select语句查询单个表中的数据
使用SELECT语句从表或视图获取数据。
表由行和列组成,如电子表格。 通常,我们只希望看到子集行,列的子集或两者的组合。
SELECT语句的结果称为结果集,它是行列表,每行由相同数量的列组成。
select 语法

  SELECT 
      column_1, column_2, ...
  FROM
      table_1
  [INNER | LEFT |RIGHT] JOIN table_2 ON conditions
  WHERE
      conditions
  GROUP BY column_1
  HAVING group_conditions
  ORDER BY column_1
  LIMIT offset, length;

SELECT语句由以下列表中所述的几个子句组成:

  1. SELECT 之后是逗号分隔列或星号(*)的列表,表示要返回所有列。
  2. FROM 指定要查询数据的表或视图。
  3. JOIN 根据某些连接条件从其他表中获取数据。
  4. WHER E过滤结果集中的行。
  5. GROUP BY将一组行组合成小分组,并对每个小分组应用聚合函数。
  6. HAVING 过滤器基于GROUP BY子句定义的小分组。
  7. ORDER BY 指定用于排序的列的列表。
  8. LIMIT 限制返回行的数量。

语句中的SELECTFROM语句是必须的,其他部分是可选的。
SELECT语句允许通过在SELECT子句中指定逗号分隔列的列表来查询表的部分数据

  SELECT 
      lastname, firstname, jobtitle
  FROM
      employees;
      #选出lasrname,firstname,jobtitle三列
      SELECT 
      *
  FROM
      employees;
      选出所有列数据。
    

建议显式获取数据的列,原因如下:

  1. 使用星号(*)可能会返回不使用的列的数据。 它在MySQL数据库服务器和应用程序之间产生不必要的I/O磁盘和网络流量。
  2. 如果明确指定列,则结果集更可预测并且更易于管理。 想象一下,当您使用星号(*)并且有人通过添加更多列来更改表格数据时,将会得到一个与预期不同的结果集。
  3. 使用星号(*)可能会将敏感信息暴露给未经授权的用户

格式
select 列筛选 form table where 行筛选

还有一些有用的运算符可以在WHERE子句中使用来形成复杂的条件,例如:

BETWEEN 选择在给定范围值内的值。
LIKE 匹配基于模式匹配的值。
IN 指定值是否匹配列表中的任何值。
IS NULL 检查该值是否为NULL。

SELECT 子查询

在一个查询过程中 嵌套另一个查询,子查询的结果作为外部查询的条件或者数据范围来使用。

分为 3 类:

  1. where 型

    • select展示列名 from 表名 where 列名 运算符[in...] (select 对应列名 from ...)
      • 这个列名 和对应列名应该做到类型相同
      • 如果不加入运算符 也可使用IN 这写类似的符号
    • select 展示列名 from 表名 where 列名 in (select 对应列名 from ...)
      • ex: select 展示列名 from 表名 where 列名 >ALL(select 对应列名 from ....);比子查询的值都大
        select 展示列名 from 表名 where 列名 >ANY(select 对应列名 from ....);比子查询的任意一个值大
  2. from 型

    • select 展示列名 from 表名 inner join (select 列名 from ...) 临时表名 on 条件;
      • 其中,select的子查询所得的表 为临时表,后跟临时表名,可在条件判断中指代
  3. exist 型

    • select 展示列 from 表名 where exists (select 列名 from 表名 where 条件);
      • 将主查询的结果带入子查询进行条件判断和匹配,如果查询出结果即保留。

去重 DISTINCT

SELECT 语句执行简单的数据查询时,返回的是所有匹配的记录。distinct 实现查询不重复的数据

DISTINCT 关键字的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据给用户。

SELECT DISTINCT <字段名> FROM <表名>;
# 字段名”为需要消除重复记录的字段名称,多个字段时用逗号隔开。

使用 DISTINCT 关键字时需要注意以下几点:

  • DISTINCT 关键字只能在 SELECT 语句中使用。
  • 在对一个或多个字段去重时,DISTINCT 关键字必须在所有字段的最前面。
  • 如果 DISTINCT 关键字后有多个字段,则会对多个字段进行组合去重,也就是说,只有多个字段组合起来完全是一样的情况下才会被去重。

指定别名 AS

1. 为表指定别名

  1. 当表名很长的时候 或者 执行了一些特殊的查询的时候,为方便操作,可以为表指定一个别名,用以替代原来的名称
  2. 语法.
  3. <表名> as <别名>
    • 含义:
    • <表名> : 数据库中存储的数据表名称。
    • <别名> : 查询的时候指定的新的名称。
    • as : 此关键字 可以 省略,省略之后要将 表名别名空格 分开
      注意:表的别名不能与该数据库的其它表同名。字段的别名不能与该表的其它字段同名。在条件表达式中不能使用字段的别名,否则会出现“ERROR 1054 (42S22): Unknown column”这样的错误提示信息。

ex1:

SELECT stu.name,stu.height FROM tb_students_info AS stu;
SELECT stu.name,stu.height FROM tb_students_info stu;

2. 为字段指定别名

  1. 在使用 SELECT 语句查询数据时,MySQL 会显示每个 SELECT 后面指定输出的字段。有时为了显示结果更加直观,我们可以为字段指定一个别名。
  2. 语法:
  3. <字段名> [AS] <别名>
- 含义:
  - `<字段名>`:为数据表中字段定义的名称。
  - `<字段别名>`:字段新的名称。
  - `AS` 关键字可以省略,省略后需要将字段名和别名用空格隔开

注意:表别名只在执行查询时使用,并不在返回结果中显示。而字段定义别名之后,会返回给客户端显示,显示的字段为字段的别名


ex2:

SELECT name AS student_name, age AS student_age FROM tb_students_info;
SELECT name AS student_name, age student_age FROM tb_students_info;

限制查询条数 LIMIT

  1. LIMIT 关键字有 3 种使用方式,即
    • 指定初始位置
    • 不指定初始位置
    • OFFSET 组合使用

(。。。。。 我之前一直不知道, 只会使用 limit 200。。。。。)

指定初始位置

  1. 语法
    • LIMIT 初始位置,记录数
      • 初始位置”表示从哪条记录开始显示;第一条记录的位置是 0,第二条记录的位置是 1。后面的记录依次类推。
      • “记录数”表示显示记录的条数。
      • LIMIT 后的两个参数必须都是正整数。

ex:tb_students_info 表中,使用 LIMIT 子句返回从第 4 条记录开始的行数为 5 的记录,SQL 语句和运行结果如下。

mysql> SELECT * FROM tb_students_info LIMIT 3,5;
+----+-------+---------+------+------+--------+------------+
| id | name  | dept_id | age  | sex  | height | login_date |
+----+-------+---------+------+------+--------+------------+
|  4 | Jane  |       1 |   22 | F    |    162 | 2016-12-20 |
|  5 | Jim   |       1 |   24 | M    |    175 | 2016-01-15 |
|  6 | John  |       2 |   21 | M    |    172 | 2015-11-11 |
|  7 | Lily  |       6 |   22 | F    |    165 | 2016-02-26 |
|  8 | Susan |       4 |   23 | F    |    170 | 2015-10-01 |
+----+-------+---------+------+------+--------+------------+
5 rows in set (0.00 sec)
# LIMIT之后的 3 是从第四行开始 5 是返回的行数

不指定初始位置

记录从第一条记录开始显示。显示记录的条数由 LIMIT 关键字指定。

  1. 语法
    • LIMIT 5
    • SELECT * FROM tb_students_info LIMIT 15;

LIMIT 和 OFFSET 组合使用

  1. 语法
    • LIMIT 记录数 OFFSET 初始位置
    • 参数和 LIMIT 语法中参数含义相同,“初始位置”指定从哪条记录开始显示;“记录数”表示显示记录的条数。
mysql> SELECT * FROM tb_students_info LIMIT 5 OFFSET 3;
+----+-------+---------+------+------+--------+------------+
| id | name  | dept_id | age  | sex  | height | login_date |
+----+-------+---------+------+------+--------+------------+
|  4 | Jane  |       1 |   22 | F    |    162 | 2016-12-20 |
|  5 | Jim   |       1 |   24 | M    |    175 | 2016-01-15 |
|  6 | John  |       2 |   21 | M    |    172 | 2015-11-11 |
|  7 | Lily  |       6 |   22 | F    |    165 | 2016-02-26 |
|  8 | Susan |       4 |   23 | F    |    170 | 2015-10-01 |
+----+-------+---------+------+------+--------+------------+
# 该语句返回的是从第 4 条记录开始的之后的 5 条记录。即“LIMIT 5 OFFSET 3”意思是获取从第 4 条记录开始的后面的 5 条记录,和“LIMIT 3,5”返回的结果相同。

2021-12-22 今天先学到这里 明天继续 MySql 的查询 学习

SELECT 数据查询(二)

对查询结果排序 ORDER BY

ORDER BY 关键字主要用来将查询结果中的数据按照一定的顺序进行排序

  1. 语法:
    • order by <字段名> [asc|desc]
      • 说明 asc 按照升序排序【默认】, desc 按照降序排序
  2. 注意:
    • ORDER BY 关键字后可以跟子查询
    • 当排序的字段中存在空值时,ORDER BY 会将该空值作为最小值来对待
    • 当排序的字段中存在空值时,ORDER BY 会将该空值作为最小值来对待
      查询数据按字母升序进行排序(A~Z),但数据的排序并不仅限于此,还可以使用 ORDER BY 中的 DESC 对查询结果进行降序排序(Z~A)。
mysql> SELECT * FROM tb_students_info ORDER BY height;
mysql> SELECT name,height FROM tb_students_info ORDER BY height,name;
mysql> SELECT name,height FROM tb_student_info ORDER BY height DESC,name ASC;

条件查询数据 WHERE

如果需要有条件的从数据表中查询数据,可以使用 WHERE 关键字来指定查询条件。

  1. 语法
    • WHERE conditons
      • 带比较运算符和逻辑运算符的查询条件
      • 带 BETWEEN AND 关键字的查询条件
      • 带 IS NULL 关键字的查询条件
      • 带 IN 关键字的查询条件
      • 带 LIKE 关键字的查询条件

单条件查询

mysql> SELECT name,height FROM tb_students_info
    -> WHERE height=170;

mysql> SELECT name,age FROM tb_students_info
    -> WHERE age<22;


多条件查询

在 WHERE 关键词后可以有多个查询条件,这样能够使查询结果更加精确。多个查询条件时用逻辑运算符 AND(&&)、OR(||)XOR 隔开。

  1. AND :记录 满足所有条件,才会被查询出结果
  2. OR : 记录 满足任意一个查询条件,才会被查询出结果
  3. XOR : 记录 满足其中一个条件,并且不满足另外一个条件是,才会被查询出结果
mysql> SELECT name,age,height FROM tb_students_info 
    -> WHERE age>21 AND height>=175;

mysql> SELECT name,age,height FROM tb_students_info 
    -> WHERE age>21 OR height>=175;

mysql> SELECT name,age,height FROM tb_students_info 
    -> WHERE age>21 XOR height>=175

OR、AND 和 XOR 可以一起使用,但是在使用时要注意运算符的优先级。
http://c.biancheng.net/view/7399.html

模糊查询 LIKE [新知识 4me]

  1. 语法:
    • [NOT]LIKE
      • NOT :可选参数,字段中的内容与指定的字符串不匹配时满足条件。
      • 字符串:指定用来匹配的字符串。“字符串”可以是一个很完整的字符串,也可以包含通配符。

LIKE 关键字支持百分号%和下划线_通配符。

带有“%”通配符的查询

“%”是 MySQL 中最常用的通配符,它能代表任何长度的字符串,字符串的长度可以为 0。
例如,a%b表示以字母 a 开头,以字母 b 结尾的任意长度的字符串。该字符串可以代表 ab、acb、accb、accrb 等字符串。

mysql> SELECT name FROM tb_students_info
    -> WHERE name LIKE 'T%';
+--------+
| name   |
+--------+
| Thomas |
| Tom    |
+--------+

mysql> SELECT NAME FROM tb_students_info
    -> WHERE NAME NOT LIKE 'T%'
+-------+
| NAME  |
+-------+
| Dany  |
| Green |
| Henry |
| Jane  |
| Jim   |
| John  |
| Lily  |
| Susan |
+-------+

mysql> SELECT name FROM tb_students_info
    -> WHERE name LIKE '%e%';
+-------+
| name  |
+-------+
| Green |
| Henry |
| Jane  |
+-------+

注意:匹配的字符串必须加单引号双引号

带有“_”通配符的查询

“_”只能代表单个字符,字符的长度不能为 0。
例如,a_b可以代表 acb、adb、aub 等字符串。

mysql> SELECT name FROM tb_students_info
    -> WHERE name LIKE '____y';
+-------+
| name  |
+-------+
| Henry |
+-------+

LIKE 区分大小写(默认不区分)

默认情况下,LIKE 关键字匹配字符的时候是 不 区分大小写的。如果需要 可以加入BINARY关键字

mysql> SELECT name FROM tb_students_info WHERE name LIKE 't%';

mysql> SELECT name FROM tb_students_info WHERE name LIKE BINARY 't%';

使用通配符的注意事项和技巧

  1. 注意事项:
    • 注意大小写。MySQL 默认是不区分大小写的。如果区分大小写,像“Tom”这样的数据就不能被“t%”所匹配到。
    • 注意尾部的空格 尾部空格会干扰通配符的匹配。例如,“T% ”就不能匹配到“Tom”。
    • 注意NULL。”%”通配符可以到匹配任意字符,但是不能匹配 NULL。也就是说 “%”匹配不到 tb_students_info 数据表中值为 NULL 的记录。
  2. 使用技巧:
    • 不要过度使用通配符,如果其它操作符能达到相同的目的,应该使用其它操作符。因为 MySQL 对通配符的处理一般会比其他操作符花费更长的时间。
    • 在确定使用通配符后,除非绝对有必要,否则不要把它们用在字符串的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。
    • 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。
      拓展
      如果查询内容中包含通配符,可以使用“\”转义符。
mysql> SELECT NAME FROM test.`tb_students_info` WHERE NAME LIKE '%\%';

2021-12-23 今天先学到这里 明天继续 MySql 的查询 学习

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • 模糊查询 根据指定的关键字进行查询,使用LIKE关键字后跟通配符通配符_:任意一个字母%:任意0~n个字母5个字母...
    你猜_e00d阅读 150评论 0 0
  • 数据查询 EXISTS 和 NOT EXISTS 子查询 EXISTS 子查询EXISTS子查询用来确认后边的查询...
    刘玉鹏151阅读 328评论 0 0
  • 语法:select 列名1,列名2.....from 表名 where 条件; 查询所有字段 select * f...
    hello_我的哥阅读 886评论 0 2
  • 学习目的 掌握Mysl常用的查询语句 掌握数据查询在实际开发中的应用 一.Mysql数据查询(DQL) DQL概念...
    从前的小余儿阅读 268评论 0 0
  • 1.条件 使用where语句对表中的数据筛选,结果为true的行会出现在结果集中 语法如下: select * f...
    指尖舞者_3f01阅读 257评论 0 0