zoukankan      html  css  js  c++  java
  • MySQL:数据查询

    数据查询

    一、基本查询语句

    1、语法:写一行

    select{*<字段列表>}//查询的字段,多个字段用逗号分开
    from<表1>,<表2>…//数据表名
    {//可选
    [where<表达式>]//限定条件,只能放一个。
    

    2、实例

    mysql> select * from publisher;
    +----+-----+------+
    | bh | cbs | bz   |
    +----+-----+------+
    | 01 | 2   | 1111 |
    | 02 | 3   | 1111 |

    二、单表查询

    1、用于查询的比较运算

     

    操作符

    含义

    操作符

    含义

    操作符

    含义

    =

    等于(不是==)

    <=

    小于、等于

    in(set)

    等于值列表中的一个

    大于

    <>(!=)

    不等于

    like

    模糊查询

    >=

    大于、等于

    :=

    赋值

    is (not)null

    (不是)空值

    小于

    betwee…and

    在两值之间

     

     

    2、比较运算符的优先级

    优先级

    运算符

    优先级

    运算符

    1

    算术运算符

    5

    [NOT] BETWEEN

    2

    连接符

    6

    NOT

    3

    比较符

    7

    AND

    4

    IS [NOT] NULL, LIKE, [NOT] IN

    8

    OR

    3、查询所有字段

    语法:

    select * from 表名(心号两边有空格)

    4、查询指定字段,所有记录

    语法:

    select 字段名1…字段名n from 表名 where 条件表达式

    5、给显示的列名重新命名

    语法:

    select 字段1 as 列名1[字段2 as 列名2……字段n as 列名n] from 表名

    6、查询指定记录,单个记录

    语法:

    select 字段名1…字段n from 表名 where 条件

    7、带IN关键字的查询

    作用:用于查询指定范围内的条件记录,只要满足条件范围内的一个值即为匹配项
    语法:

    select 字段 from 数据表 where 指定字段(not)in(取值条件,取值条件1)等于where 指定字段=取值条件 or指定字段=取值条件1(order by 字段//条件可选);

    【附】加not代表不在这个范围的值

    实例:

    mysql> select bh,cbs from publisher where bh in(01,09) order by cbs;
    +----+-----+        bh的值为01,09输出结果
    | bh | cbs |   
    +----+-----+
    | 09 | 10  |
    | 01 | 2   |
    +----+-----+

    8、带BETWEEN AND的范围查询

    作用:查询每个范围内的值

    语法: 

    select 显示结果的列 from 数据表名 where 条件的列 between 范围的开始值 and 范围的结束值;

    字段名>=起始值 and 字段名<=结束值
    两个表达式字段名相同,值不同
    实例:

    mysql> select bh,cbs from publisher where cbs between 7 and 09;
    +----+-----+
    | bh | cbs |
    +----+-----+
    | 06 | 7   |
    | 07 | 8   |
    | 08 | 9   |
    +----+-----+

    9、带LIKE的字符匹配查询

    作用:查询某个字符,如“apple”“grape”“coconut”中带“a”的字段
    通配符:用于where的特殊字符
    (1)、“%”匹配任意长度的字符,甚至包括零字符,最大字段为数据类型的长度
    语法:

    select 字段from 数据表名 where 字段(类型必须是char或varchar) like '条件%';

    实例:

    1)全部值
    mysql> select*from publisher;
    +----+-----+------+
    | bh | cbs | bz   |
    +----+-----+------+
    | 01 | 2   | 1111 |
    | 02 | 3   | 1111 |
    +----+-----+------+
    
    2)取bh列且0在前面的值
    mysql> select*from publisher where bh like '0%';
    +----+-----+------+
    | bh | cbs | bz   |
    +----+-----+------+
    | 01 | 2   | 1111 |
    | 02 | 3   | 1111 |
    +----+-----+------+
    
    3)取列bh且0在后面的值
    mysql> select*from publisher where bh like '%0';
    +----+-----+------+
    | bh | cbs | bz   |
    +----+-----+------+
    | 10 | 11  | 1111 |
    | 20 | 21  | 1111 |
    +----+-----+------+
    4)取例bh且有0在的值 mysql> select*from publisher where bh like '%0%'; +----+-----+------+ | bh | cbs | bz | +----+-----+------+ | 01 | 2 | 1111 | | 02 | 3 | 1111 | +----+-----+------+

    (2)“_”一次只能匹配任意一个字符;
    作用:基本和“%”类似
    语法:

    select 字段from 数据表名 where 列 like '条件_';(后面两个’条件_ _’)

    【例】:
    查询bh列且以“1”开头,后面接一个任意符

    mysql> select*from publisher where bh like '1_';
    +----+-----+------+
    | bh | cbs | bz   |
    +----+-----+------+
    | 10 | 11  | 1111 |
    +----+-----+------+

    10、查询空值

    空值:一般表示数据未知、不适用或者在将来以后添加数据,它不是空格,或者0.
    语法:

    select 字段from 数据表名 where 列1 is null and…… and 例n;

    11、带AND的多条件查询

    条件:满足所有的条件表达式

    语法:

    select 字段from 数据表名 where 条件表达式1 and 条件表达式2 … and 条件表达式n;

    【例】

    mysql> select bh,cbs,bz from publisher where bh=10 and cbs=11 and bz=1111;
    +----+-----+------+
    | bh | cbs | bz   |
    +----+-----+------+
    | 10 | 11  | 1111 |
    +----+-----+------+

    12、带0R的多条件查询

    条件:满足一个条件表达式
    语法:语法:

    select 字段from 数据表名 where 条件表达式1 or 条件表达式2… or 条件表达式n;

    【例】

    mysql> select bh,cbs,bz from publisher where bh=10 or cbs=11 or bz=111;
    +----+-----+------+
    | bh | cbs | bz   |
    +----+-----+------+
    | 10 | 11  | 1111 |
    +----+-----+------+

    【附】and和or联用
    【例】

    mysql> select bh,cbs,bz from publisher where bh=10 or cbs=11 and bz=111;
    +----+-----+------+
    | bh | cbs | bz   |
    +----+-----+------+
    | 10 | 11  | 1111 |
    +----+-----+------+
    
    mysql>  select bh,cbs,bz from publisher where bh=10 and cbs=10 or bz=111;
    Empty set (0.00 sec)
    
    mysql>  select bh,cbs,bz from publisher where bz=111 or bh=10 and cbs=10;
    Empty set (0.00 sec)

    说明:and的优先级高于or,因此先对and两边的操作数进行操作,再于or的操作数结合。

    13、查询结果不重复

    语法:

    select distinct 字段名 from 数据表名;

    14、对查询结果排序

    (1)单列:
    语法:

    select 要显示的字段from 数据表名 order by 排序依据的字段(聚合函数) descasc;

        注意:desc降序,asc升序,asc为排序的默认方式
    (2)多列:
    语法:

    select 要显示的字段from 数据表名 order by a descasc,b descasc ……;

        注意:先进行a表的升降序,在进行b表的升降序

    15、使用LIMIT限制查询结果的数量-----分页查询

      语法:limit [位置偏移量,] 行数
    位置偏移量:值从那行开始显示,是可选,如果不指定,从第一条记录开始(第一条记录的位置从0开始,和java的索引相类似)
    行数:指示返回的记录
    注意:limit 4 offset 3,意思为获取从第五条记录开始后面3条记录,和limit 4,3返回的结果相同。
      【例】select * from dingdan limit 2,3;

    二、连接查询------先内在外

    1、内连接查询(inner join)

    语法:
    ①select 字段名 fromA表表名,B表表名……where【A表表名.】字段名a=【B表表名.】字段名b=……
    ②select 字段名 fromA表表名 inner join B表表名on【A表表名.】字段名a=【B表表名.】字段名b
    注意:字段a、b必须是有相同意义和相同类型

    2、外连接查询

    ①左外连接:
    select 需要的字段名 fromA表表名 left joinB表表名 on A表表名.】字段名=【B表表名.】字段名
    A表被称为左表    B表被称为右表
    注意:
    左外连接,不管连接条件是否满足。都执行一次
    右外连接,是否执行,根据连接条件判断
    ②右外连接:
    select 需要的字段名 fromA表表名 right joinB表表名 on A表表名.】字段名=【B表表名.】字段名
    A表被称为左表    B表被称为右表
    注意:
    右外连接,不管连接条件是否满足。都执行一次
    左外连接,是否执行,根据连接条件判断

    3、连接条件的特点

    (1)内连接:满足连接条件记录出现
    (2)左外连接:左表记录至少出现一次
    (3)满足连接条件,满足出现的记录
    (4)不满足,左表记录信息出现,右表信息为空

    4、连接查询思路

    1、根据题目要求,确定连接结果
    2、根据连接结果,确定连接方式
    3、根据语法,写出语句
    4、确定查询字段
    5、确定访问的表
    6、连接条件

    三、子查询

    1、带ANY、SOME关键字的子查询

    ①定义:只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件
    ②语法:select 字段名 from 表名 where 字段名 关系运算符 any/some(select 字段 from 表名)
    关系运算符:>,<=,<,>=,=
    条件:select 字段 from 表名

    2、带ALL关键字的子查询

    ①定义:只要满足内层子查询中的所有比较条件,才返回一个结果作为外层查询的条件
    ②语法:select 字段名 from 表名 where 字段名 关系运算符 all(select 字段 from 表名)
    关系运算符:>,<=,<,>=,=
    条件:select 字段 from 表名

    3、带EXISTS关键字的子查询---------判断某个字段是否存在

    ①定义:判断条件是否满足,满足返回true,外层开始查询,不满足返回false,外层不查询。
    ②语法:select 字段名 from 表名 where exist(条件)
    关系运算符:>,<=,<,>=,=
    条件:select 字段 from 表名 where 条件
      ③注意:no exists判断条件是否满足,不满足返回true,外层开始查询,满足返回false,外层不查询。

    4、带IN关键字的子查询

      ①定义:内层查询语句仅仅返回一个数据列,这个数据列的里的值,将提供给外层查询语句查询比较
    ②语法:elect 字段名 from 表名 where 字段名 in(select 字段名 from 表名 where 条件)
    5、带比较运算符关键字的子查询
      关键字:<,>,>=,<=,!=(不等于),<>(不等于)

    四、合并查询结果

    ①语法:select 字段名 from 表名 union【all】select 字段名from 表名;
    ②注意:
      1、两个表对应的列数和数据数量必须相同
      2、各个select之间用union或union all关键字分开
      3、union执行时删除重复的行,结果唯一
      4、union all执行时包含重复的行

    五、为表和字段取别名

    1、为表取别名:表名 as 表别名
    2、为字段取别名:列名 as 列别名
    注意,取别名时,别名不能与原有的数据的表名和列名有冲突

    六、使用正则表达式查询

    1、语法:select 字段名 from 表名 where 字段名 regexp ‘正则表达式’;
    2、常用的正则表达式字符匹配列表
    符号 说明 例子 匹配值示例

    符号

    说明

    例子

    匹配值示例

     ^ 

    匹配文本开始字符

    ‘ ^ b’匹配以字母b开头的字符串

    book,big

    $

    匹配文本结束字符

    ‘st$’匹配以st结尾的字符串

    test,resist

    .

    匹配任何单个字符

    ‘b.t’匹配任何b和t之间有一个字符

    bit,bat,but

    *

    匹配零个或多个在它前面的字符

    ‘f*n’匹配字符n前面有任意个字符f

    fn,fan,abcn

    +

    匹配一次或多次在它前面的字符

    ‘ba+’匹配以b开头后面紧跟至少有一个a

    ba,bay,bare

    <字符串>

    匹配包含指定的字符串的文本

    ‘fa’指定文本中包含fa的字符

    fan,afa,faad

    [字符集合]

    匹配字符集合中的任何一个字符

    ‘[xz]’匹配x或z

    dizzy,xebra,

    [ ^ ]

    匹配不在括号中的任何字符

    ‘[ ^ abc]’匹配任何不包含a,b,c的字符串

    desk,fox,f8ke

    字符串{n,}

    匹配前面的字符串至少n次

    b{2}匹配至少2个的b

    bbb,bbbb,bb

    字符串{n,m}

    匹配前面的字符串至少n次,至多m次。

    b{2,4}匹配至少2个,至多4个的b

    bbbb,bbb,bb

    注意:
    1)字符串{n,m},如果n为0,此参数为可选参数
    2)匹配多个指定字
    3)符串,字符串之间用“|”分开

  • 相关阅读:
    【Mybatis源码解析】- JDBC连接数据库的原理和操作
    【JDK源码解析】- ArrayList源码解析,绝对详细
    【设计模式】-代理模式及动态代理详解
    【Java基础】反射机制及应用
    Go 中的 channel 与 Java BlockingQueue 的本质区别
    Github Actions 还能做这些事
    写了一个 gorm 乐观锁插件
    Go 去找个对象吧
    Web 自动化测试全面提升之 Pytest
    【51testing专访】web自动化,从入门到进阶
  • 原文地址:https://www.cnblogs.com/hahayixiao/p/10252236.html
Copyright © 2011-2022 走看看