zoukankan      html  css  js  c++  java
  • MySQL Select查询

    1. 基本语法:

    SELECT
    {* | <字段列名>}
    [
    FROM <表 1>, <表 2>…
    [WHERE <表达式>
    [GROUP BY <group by definition>
    [HAVING <expression> [{<operator> <expression>}…]]
    [ORDER BY <order by definition>]
    [LIMIT[<offset>,] <row count>]
    ]

     1.1 全部查询

    SELECT * FROM < 表名 >;

    1.2 选择指定字段

    SELECT <字段名1>,<字段名2>,…,<字段名n> FROM <表名>;

    1.3 过滤字段中的重复值: DISTINCT

    SELECT DISTINCT <字段名> FROM <表名>;

    1.4 别名 :AS

    给很长的表或者字段可以起个别名,用别名进行查询

    mysql> select a.id,a.name from user as a;
    +----+------+
    | id | name |
    +----+------+
    |  1 | Wang |
    +----+------+


    mysql> select id as userID from user;
    +--------+
    | userID |
    +--------+
    | 1 |
    +--------+

     1.5 限制查询结果的记录数量:LIMIT

    <LIMIT> [<位置偏移量>,] <行数>

    “位置偏移量”指从哪一行开始显示,是一个可选参数,如果不指定“位置偏移量”,将会从表中的第一条记录开始(第一条记录的位置偏移量是 0,第二条记录的位置偏移量是 1,以此类推);

    第二个参数“行数”指示返回的记录条数。

    # 查询从第3+1条记录开始的4条数据。
    mysql> SELECT * FROM <表名> LIMIT 3,4;

     1.6 排序查询:ORDER BY

    ORDER BY {<列名> | <表达式> | <位置>} [ASC|DESC]

    ASC 升序
    DESC 降序

    e.g.

    从user中查询所有字段,先按照 balance 字段进行降序排列,再按照 debt 字段升序排序

    mysql> select * from user order by balance desc,debt asc;
    +----+------+----------+---------+------+
    | id | name | password | balance | debt |
    +----+------+----------+---------+------+
    |  1 | Wang | 1234     |   15000 |    0 |
    |  2 | song | 1234     |    3000 |  100 |
    |  3 | li   | 1234     |    2000 |    0 |
    |  4 | zhao | NULL     |    NULL | NULL |
    |  5 | qian | NULL     |    NULL | NULL |
    |  6 | sun  | NULL     |    NULL | NULL |
    |  9 | NULL | NULL     |    NULL |   70 |
    |  8 | NULL | NULL     |    NULL |   80 |
    |  7 | Zhou | NULL     |    NULL |   90 |
    +----+------+----------+---------+------+

     1.7 条件查询: WHERE

    WHERE <查询条件> {<判定运算1><判定运算2>,…}

    判断条件:
    1. >,<,<=,>=,=,<>,!=,<=> # 注:<=> 判断两个数据是否相等,只是可以和 NULL 进行比较,其他方面和 = 没啥差别。
    2. [NOT]LIKE
    3. IS [NOT] NULL
    4. [NOT] BETWEEN ... AND ...
    5. [NOT][REGEXP|RLIKE]

    单一查询:

    mysql> select balance from user where name = 'Wang';
    +---------+
    | balance |
    +---------+
    |   15000 |
    +---------+

    多条件查询:

    mysql> select name,balance from user where balance>=3000 and balance<16000;
    +------+---------+
    | name | balance |
    +------+---------+
    | Wang |   15000 |
    | song |    3000 |
    +------+---------+

    1.8 LIKE 模糊查询

    <表达式1> [NOT] LIKE <表达式2>

    通配符:

    1. 百分号:%  : 可以匹配 0 个或多个字符,不匹配 空值。

    2. 下划线:_   : 只匹配一个字符。

    mysql> select * from user;
    +----+------+----------+---------+------+
    | id | name | password | balance | debt |
    +----+------+----------+---------+------+
    |  1 | Wang | 1234     |   15000 |    0 |
    |  2 | song | 1234     |    3000 |  100 |
    |  3 | li   | 1234     |    2000 |    0 |
    |  4 | zhao | NULL     |    NULL | NULL |
    |  5 | qian | NULL     |    NULL | NULL |
    |  6 | sun  | NULL     |    NULL | NULL |
    |  7 | Zhou | NULL     |    NULL |   90 |
    |  8 | NULL | NULL     |    NULL |   80 |
    |  9 | NULL | NULL     |    NULL |   70 |
    +----+------+----------+---------+------+
    
    mysql> select name,debt from user where name like '%ng';
    +------+------+
    | name | debt |
    +------+------+
    | Wang |    0 |
    | song |  100 |
    +------+------+

    1.9 查询日期

    select * from <table> where date<'2019-01-20';
    
    select * from <table> where date between '2019-01-20' and '2019-10-01';

     2.0 内连接查询

    mysql> select * from grade;
    +------+--------+
    | gid  | record |
    +------+--------+
    |    1 |    100 |
    |    2 |    200 |
    |    3 |    400 |
    +------+--------+
    
    
    mysql> select * from user;
    +----+------+----------+---------+------+
    | id | name | password | balance | debt |
    +----+------+----------+---------+------+
    |  1 | Wang | 1234     |   15000 |    0 |
    |  2 | song | 1234     |    3000 |  100 |
    |  3 | li   | 1234     |    2000 |    0 |
    |  4 | zhao | NULL     |    NULL | NULL |
    |  5 | qian | NULL     |    NULL | NULL |
    |  6 | sun  | NULL     |    NULL | NULL |
    |  7 | Zhou | NULL     |    NULL |   90 |
    |  8 | NULL | NULL     |    NULL |   80 |
    |  9 | NULL | NULL     |    NULL |   70 |
    +----+------+----------+---------+------+

    # 内连接查询 mysql
    > select * from user inner join grade where user.id=grade.gid; +----+------+----------+---------+------+------+--------+ | id | name | password | balance | debt | gid | record | +----+------+----------+---------+------+------+--------+ | 1 | Wang | 1234 | 15000 | 0 | 1 | 100 | | 2 | song | 1234 | 3000 | 100 | 2 | 200 | | 3 | li | 1234 | 2000 | 0 | 3 | 400 | +----+------+----------+---------+------+------+--------+
    # 不写inner join,默认也是内连接 mysql
    > select * from user, grade where user.id=grade.gid; +----+------+----------+---------+------+------+--------+ | id | name | password | balance | debt | gid | record | +----+------+----------+---------+------+------+--------+ | 1 | Wang | 1234 | 15000 | 0 | 1 | 100 | | 2 | song | 1234 | 3000 | 100 | 2 | 200 | | 3 | li | 1234 | 2000 | 0 | 3 | 400 | +----+------+----------+---------+------+------+--------+
    # 指定查询哪些字段 mysql
    > select user.id,user.name,user.balance,grade.gid from user, grade where user.id=grade.gid; +----+------+---------+------+ | id | name | balance | gid | +----+------+---------+------+ | 1 | Wang | 15000 | 1 | | 2 | song | 3000 | 2 | | 3 | li | 2000 | 3 | +----+------+---------+------+

    2.1 外连接

    左外连接:

    基于左边的表,将右边表中的字段合并过来

    mysql> select id,name,record from user left join grade on user.id = grade.gid;
    +----+------+--------+
    | id | name | record |
    +----+------+--------+
    |  1 | Wang |    100 |
    |  2 | song |    200 |
    |  3 | li   |    400 |
    |  4 | zhao |   NULL |
    |  5 | qian |   NULL |
    |  6 | sun  |   NULL |
    |  7 | Zhou |   NULL |
    |  8 | NULL |   NULL |
    |  9 | NULL |   NULL |
    +----+------+--------+

    右外连接:

    mysql> select id,name,record from user right join grade on user.id = grade.gid;
    +------+------+--------+
    | id   | name | record |
    +------+------+--------+
    |    1 | Wang |    100 |
    |    2 | song |    200 |
    |    3 | li   |    400 |
    +------+------+--------+

    2.2 子查询

     1. IN

    <表达式> [NOT] IN <子查询>

    此处的子查询只能返回一行数据

    2. 比较运算符

    <表达式> {= | < | > | >= | <= | <=> | < > | != }
    { ALL | SOME | ANY} <子查询>

    3. EXISTS

      判断子查询是否存在,如果存在,True,否则False;

    IN:

    mysql> select * from grade;
    +------+--------+
    | gid  | record |
    +------+--------+
    |    1 |    100 |
    |    2 |    200 |
    |    3 |    400 |
    +------+--------+
    
    
    mysql> select * from user;
    +----+------+----------+---------+------+
    | id | name | password | balance | debt |
    +----+------+----------+---------+------+
    |  1 | Wang | 1234     |   15000 |    0 |
    |  2 | song | 1234     |    3000 |  100 |
    |  3 | li   | 1234     |    2000 |    0 |
    |  4 | zhao | NULL     |    NULL | NULL |
    |  5 | qian | NULL     |    NULL | NULL |
    |  6 | sun  | NULL     |    NULL | NULL |
    |  7 | Zhou | NULL     |    NULL |   90 |
    |  8 | NULL | NULL     |    NULL |   80 |
    |  9 | NULL | NULL     |    NULL |   70 |
    +----+------+----------+---------+------+
    
    mysql> select * from user where id in (select gid from grade where gid=2);
    +----+------+----------+---------+------+
    | id | name | password | balance | debt |
    +----+------+----------+---------+------+
    |  2 | song | 1234     |    3000 |  100 |
    +----+------+----------+---------+------+

    EXISTS:

    mysql> select * from user where exists (select * from grade where gid=1000);
    Empty set (0.00 sec)
    
    mysql> select * from user where exists (select * from grade where gid=1);
    +----+------+----------+---------+------+
    | id | name | password | balance | debt |
    +----+------+----------+---------+------+
    |  1 | Wang | 1234     |   15000 |    0 |
    |  2 | song | 1234     |    3000 |  100 |
    |  3 | li   | 1234     |    2000 |    0 |
    |  4 | zhao | NULL     |    NULL | NULL |
    |  5 | qian | NULL     |    NULL | NULL |
    |  6 | sun  | NULL     |    NULL | NULL |
    |  7 | Zhou | NULL     |    NULL |   90 |
    |  8 | NULL | NULL     |    NULL |   80 |
    |  9 | NULL | NULL     |    NULL |   70 |
    +----+------+----------+---------+------+

     2.3 分组查询

     分组查询查到是每个,相同的数据会合并到一个组里,是看不到的。可以使用聚合函数对每个组的数据进行求和、统计数量等。

    mysql> select * from user;
    +----+------+----------+---------+------+
    | id | name | password | balance | debt |
    +----+------+----------+---------+------+
    |  1 | Wang | 1234     |   15000 |    0 |
    |  2 | song | 1234     |    3000 |  100 |
    |  3 | li   | 1234     |    2000 |    0 |
    |  4 | zhao | NULL     |    NULL | NULL |
    |  5 | qian | NULL     |    NULL | NULL |
    |  6 | sun  | NULL     |    NULL | NULL |
    |  7 | Zhou | NULL     |    NULL |   90 |
    | 10 | Wang | NULL     |   15000 | NULL |
    +----+------+----------+---------+------+
    
    # 按照名字分组,查询每个分组的id,name,balance的总和。sum,聚合函数之一。
    mysql> select id,name,sum(balance) from user group by name;
    +----+------+--------------+
    | id | name | sum(balance) |
    +----+------+--------------+
    |  1 | Wang |        30000 |
    |  2 | song |         3000 |
    |  3 | li   |         2000 |
    |  4 | zhao |         NULL |
    |  5 | qian |         NULL |
    |  6 | sun  |         NULL |
    |  7 | Zhou |         NULL |
    +----+------+--------------+

    HAVING

    having,给分组添加过滤,筛选符合条件的分组

    mysql> select count(name) ,name from user group by name having count(name)>1;
    +-------------+------+
    | count(name) | name |
    +-------------+------+
    |           2 | Wang |
    +-------------+------+

     2.4 正则表达式查询:REGEXP

    匹配模式

    ^    匹配开始字符        '^b'匹配以b开头的字符串

    $    匹配结束字符        'b$'匹配以b结束的字符串

    .     匹配任意单个字符      

    *    匹配前面的字符0次或多次     a*b 匹配 b、ab、aaaaaaaab

    +    匹配前面的字符1次或多次    a+b 匹配 ab、aaaaaab

    <字符>  匹配包含的字符        <fa> 匹配 afa,fa,bbbfaccc

    []    匹配内部的任意一个字符   [xyz] 匹配 x 或 y 或 z

    [^]     匹配不在括号内的字符    [^1-9] 不匹配 1-9

    {n,}   匹配前一个字符最少n次

    {n,m}  匹配前一个字符最少n次,最多m次。

    e.g.

    mysql> select * from user where name regexp '^W';
    +----+------+----------+---------+------+
    | id | name | password | balance | debt |
    +----+------+----------+---------+------+
    |  1 | Wang | 1234     |   15000 |    0 |
    | 10 | Wang | NULL     |   15000 | NULL |
    +----+------+----------+---------+------+
    2 rows in set (0.02 sec)
  • 相关阅读:
    随感
    Serializable方式实现数据传递
    Serializable方式实现数据传递
    MeterailDesign最佳UI设计
    MeterailDesign最佳UI设计
    Metarial Design之ToolBar
    Metarial Design之ToolBar
    Android"寻龙点穴"指南针
    如何完全卸载VS2010(亲自体验过)
    【杭电】[2049]不容易系列之(4)——考新郎
  • 原文地址:https://www.cnblogs.com/wztshine/p/11950665.html
Copyright © 2011-2022 走看看