• MySQL数据库之select查询语句


    select查询语句

    • 语法
      • select [选项] 列名 [from 表名] [where 条件] [group by 分组] [order by 排序][having 条件] [limit 限制]

    select字段表达式

    • 可以直接输出内容
    MariaDB [sel]> select 'Sunny is a boy!';
    +-----------------+
    | Sunny is a boy! |
    +-----------------+
    | Sunny is a boy! |
    +-----------------+
    # `1 row in set (0.000 sec)`
    
    • 输出表达式
    MariaDB [sel]> select 10*27;
    +-------+
    | 10*27 |
    +-------+
    |   270 |
    +-------+
    # `1 row in set (0.000 sec)`
    
    MariaDB [sel]> select name,chinese,math,chinese+math from grades;
    +-------+---------+------+--------------+
    | name  | chinese | math | chinese+math |
    +-------+---------+------+--------------+
    | Sunny |      93 |   96 |          189 |
    | Jerry |      97 |   91 |          188 |
    | Marry |      95 |   94 |          189 |
    | Tommy |      98 |   94 |          192 |
    +-------+---------+------+--------------+
    # `4 rows in set (0.000 sec)`
    
    • 输出函数表达式
    MariaDB [sel]> select rand();
    +-------------------+
    | rand()            |
    +-------------------+
    | 0.294372641755615 |
    +-------------------+
    # `1 row in set (0.007 sec)`
    
    • 通过as给字段取别名
      • as可以省略
    MariaDB [sel]> select 'Sunny' as 'name';
    +-------+
    | name  |
    +-------+
    | Sunny |
    +-------+
    # `1 row in set (0.000 sec)`
    
    MariaDB [sel]> select name,chinese,math,chinese+math as '总分' from grades;
    +-------+---------+------+------+
    | name  | chinese | math | 总分 |
    +-------+---------+------+------+
    | Sunny |      93 |   96 |  189 |
    | Jerry |      97 |   91 |  188 |
    | Marry |      95 |   94 |  189 |
    | Tommy |      98 |   94 |  192 |
    +-------+---------+------+------+
    # `4 rows in set (0.007 sec)`
    
    MariaDB [sel]> select name,chinese,math,chinese+math '总分' from grades;
    +-------+---------+------+------+
    | name  | chinese | math | 总分 |
    +-------+---------+------+------+
    | Sunny |      93 |   96 |  189 |
    | Jerry |      97 |   91 |  188 |
    | Marry |      95 |   94 |  189 |
    | Tommy |      98 |   94 |  192 |
    +-------+---------+------+------+
    # `4 rows in set (0.001 sec)`
    

    from子句

    • from [表名]
      • from后面跟的是数据源
      • 数据源可以有多个,返回笛卡尔积
    -- 创建数据表
    MariaDB [sel]> create table stu1(
        -> name varchar(20)
        -> )charset=gbk;
    # `Query OK, 0 rows affected (0.026 sec)`
    
    MariaDB [sel]> insert into stu1 values ('Sunny'),('Jerry');
    # `Query OK, 2 rows affected (0.012 sec)`
    # `Records: 2  Duplicates: 0  Warnings: 0`
    
    MariaDB [sel]> create table stu2(
        -> age int
        -> )charset=gbk;
    # `Query OK, 0 rows affected (0.023 sec)`
    
    MariaDB [sel]> insert into stu2 values (20),(24);
    # `Query OK, 2 rows affected (0.012 sec)`
    # `Records: 2  Duplicates: 0  Warnings: 0`
    
    -- from子句查询
    MariaDB [sel]> select * from stu1;
    +-------+
    | name  |
    +-------+
    | Sunny |
    | Jerry |
    +-------+
    # `2 rows in set (0.000 sec)`
    
    -- from返回笛卡尔积
    MariaDB [sel]> select * from stu1,stu2;
    +-------+------+
    | name  | age  |
    +-------+------+
    | Sunny |   20 |
    | Jerry |   20 |
    | Sunny |   24 |
    | Jerry |   24 |
    +-------+------+
    # `4 rows in set (0.000 sec)`
    

    dual表

    • 概念
      • dual表是一个伪表
      • 在有些特定情况下,没有具体的表的参与
      • 为了保证select语句的完整又必须要一个表名,这时候就使用伪表
    MariaDB [sel]> select 10*27 as '结果' from dual;
    +------+
    | 结果 |
    +------+
    |  270 |
    +------+
    # `1 row in set (0.007 sec)`
    

    where子句

    • 概念

      • where后面跟的是条件,在数据源中进行筛选
      • 返回条件为真记录
    • MySQL支持的运算符

      • 比较运算符
        • > 大于
        • < 小于
        • >= 大于等于
        • <= 小于等于
        • = 等于
        • != 不等于
      • 逻辑运算符
        • and
        • or
        • not
      • 其他
        • in | not in 字段的值在枚举范围内
        • between...and | not between...and 字段的值在数字范围内
        • is null | is not null 字段的值不为空
    -- 比较运算判断
    MariaDB [sel]> select * from grades where math=94;
    +-------+---------+------+
    | name  | chinese | math |
    +-------+---------+------+
    | Marry |      95 |   94 |
    | Tommy |      98 |   94 |
    +-------+---------+------+
    # `2 rows in set (0.007 sec)`
    
    -- 输出所有数据
    MariaDB [sel]> select * from grades where 1;
    +-------+---------+------+
    | name  | chinese | math |
    +-------+---------+------+
    | Sunny |      93 |   96 |
    | Jerry |      97 |   91 |
    | Marry |      95 |   94 |
    | Tommy |      98 |   94 |
    +-------+---------+------+
    # `4 rows in set (0.000 sec)`
    
    -- 不输出数据
    MariaDB [sel]> select * from grades where 0;
    # `Empty set (0.000 sec)`
    
    -- 逻辑运算判断
    MariaDB [sel]> select * from grades where math=96 or math=91;
    +-------+---------+------+
    | name  | chinese | math |
    +-------+---------+------+
    | Sunny |      93 |   96 |
    | Jerry |      97 |   91 |
    +-------+---------+------+
    # `2 rows in set (0.001 sec)`
    
    MariaDB [sel]> select * from grades where math in (91,96);
    +-------+---------+------+
    | name  | chinese | math |
    +-------+---------+------+
    | Sunny |      93 |   96 |
    | Jerry |      97 |   91 |
    +-------+---------+------+
    # `2 rows in set (0.000 sec)`
    
    MariaDB [sel]> select * from grades where math not in (91,96);
    +-------+---------+------+
    | name  | chinese | math |
    +-------+---------+------+
    | Marry |      95 |   94 |
    | Tommy |      98 |   94 |
    +-------+---------+------+
    # `2 rows in set (0.000 sec)`
    
    • 查找年龄在20~25之间
    -- 方法一:
    mysql> select * from stu where stuage>=20 and stuage<=25;
    
    -- 方法二:
    mysql> select * from stu where not(stuage<20 or stuage>25);
    
    -- 方法三:between...and...
    mysql> select * from stu where stuage between 20 and 25;
    
    -- 年龄不在20~25之间
    mysql> select * from stu where stuage not between 20 and 25;
    
    • 查找缺考的学生
    mysql> select * from stu where ch is null or math is null;
    +--------+----------+--------+--------+---------+------------+------+------+
    | stuNo  | stuName  | stuSex | stuAge | stuSeat | stuAddress | ch   | math |
    +--------+----------+--------+--------+---------+------------+------+------+
    | s25301 | 张秋丽    | 男     |    18 |       1 | 北京        |   80 | NULL |
    | s25304 | 欧阳俊雄  | 男     |    28 |       4 | 天津        | NULL |   74 |
    +--------+----------+--------+--------+---------+------------+------+------+
    
    • 查找没有缺考的学生
    mysql> select * from stu where ch is not null and math is not null;
    +--------+----------+--------+--------+---------+------------+------+------+
    | stuNo  | stuName  | stuSex | stuAge | stuSeat | stuAddress | ch   | math |
    +--------+----------+--------+--------+---------+------------+------+------+
    | s25302 | 李文才    | 男     |     31 |       3 | 上海       |   77 |   76 |
    | s25303 | 李斯文    | 女     |     22 |       2 | 北京       |   55 |   82 |
    | s25305 | 诸葛丽丽  | 女     |     23 |       7 | 河南       |   72 |   56 |
    | s25318 | 争青小子  | 男     |     26 |       6 | 天津       |   86 |   92 |
    | s25319 | 梅超风    | 女     |     23 |       5 | 河北       |   74 |   67 |
    | s25320 | Tom      | 男     |     24 |       8 | 北京       |   65 |   67 |
    | s25321 | Tabm     | 女     |     23 |       9 | 河北       |   88 |   77 |
    +--------+----------+--------+--------+---------+------------+------+------+
    # `7 rows in set (0.00 sec)`
    
    • 查找需要补考的学生
    mysql> select * from stu where ch<60 or math<60 or ch is null or math is null;
    +--------+----------+--------+--------+---------+------------+------+------+
    | stuNo  | stuName  | stuSex | stuAge | stuSeat | stuAddress | ch   | math |
    +--------+----------+--------+--------+---------+------------+------+------+
    | s25301 | 张秋丽    | 男    |     18 |       1 | 北京        |   80 | NULL |
    | s25303 | 李斯文    | 女    |     22 |       2 | 北京        |   55 |   82 |
    | s25304 | 欧阳俊雄  | 男    |     28 |       4 | 天津        | NULL |   74 |
    | s25305 | 诸葛丽丽  | 女    |     23 |       7 | 河南        |   72 |   56 |
    +--------+----------+--------+--------+---------+------------+------+------+
    4 rows in set (0.00 sec)
    
    • 查找学号是s25301,s25302,s25303的学生
    mysql> select * from stu where stuno in ('s25301','s25302','s25303');
    +--------+---------+--------+--------+---------+------------+------+------+
    | stuNo  | stuName | stuSex | stuAge | stuSeat | stuAddress | ch   | math |
    +--------+---------+--------+--------+---------+------------+------+------+
    | s25301 | 张秋丽   | 男     |     18 |       1 | 北京       |   80 | NULL |
    | s25302 | 李文才   | 男     |     31 |       3 | 上海       |   77 |   76 |
    | s25303 | 李斯文   | 女     |     22 |       2 | 北京       |   55 |   82 |
    +--------+---------+--------+--------+---------+------------+------+------+
    # `3 rows in set (0.00 sec)`
    
    • 查找年龄是18~20的学生
    mysql> select * from stu where stuage between 18 and 20;
    +--------+---------+--------+--------+---------+------------+------+------+
    | stuNo  | stuName | stuSex | stuAge | stuSeat | stuAddress | ch   | math |
    +--------+---------+--------+--------+---------+------------+------+------+
    | s25301 | 张秋丽  | 男     |     18 |       1 | 北京        |   80 | NULL |
    +--------+---------+--------+--------+---------+------------+------+------+
    1 row in set (0.00 sec)
    

    group by [分组查询]

    • 概念
      • 将查询的结果分组,分组查询目的在于统计数据
      • 如果是分组查询,查询字段是分组字段和聚合函数
      • 查询字段是普通字段,只取第一个值
      • group_concat()将同一组的数据连接起来
    -- 查询男生和女生的各自语文平均分
    mysql> select stusex,avg(ch) '平均分' from stu group by stusex;
    +--------+---------+
    | stusex | 平均分  |
    +--------+---------+
    | 女     | 72.2500 |
    | 男     | 77.0000 |
    +--------+---------+
    # `2 rows in set (0.00 sec)`
    
    -- 查询男生和女生各自多少人
    mysql> select stusex,count(*) 人数 from stu group by stusex;
    +--------+------+
    | stusex | 人数 |
    +--------+------+
    | 女     |    4 |
    | 男     |    5 |
    +--------+------+
    # `2 rows in set (0.00 sec)`
    
    -- 查询每个地区多少人
    mysql> select stuaddress,count(*) from stu group by stuaddress;
    +------------+----------+
    | stuaddress | count(*) |
    +------------+----------+
    | 上海       |        1 |
    | 北京       |        3 |
    | 天津       |        2 |
    | 河北       |        2 |
    | 河南       |        1 |
    +------------+----------+
    # `5 rows in set (0.00 sec)`
    
    -- 每个地区的数学平均分
    mysql> select stuaddress,avg(math) from stu group by stuaddress;
    +------------+-----------+
    | stuaddress | avg(math) |
    +------------+-----------+
    | 上海       |   76.0000 |
    | 北京       |   74.5000 |
    | 天津       |   83.0000 |
    | 河北       |   72.0000 |
    | 河南       |   56.0000 |
    +------------+-----------+
    # `5 rows in set (0.00 sec)`
    
    • group_concat() 函数
      • 将同一组的值连接起来显示
    mysql> select group_concat(stuname),stusex,avg(math) from stu group by stusex;
    +-------------------------------------+--------+-----------+
    | group_concat(stuname)               | stusex | avg(math) |
    +-------------------------------------+--------+-----------+
    | 李斯文,诸葛丽丽,梅超风,Tabm           | 女     |   70.5000 |
    | 张秋丽,李文才,欧阳俊雄,争青小子,Tom    | 男    |   77.2500 |
    +-------------------------------------+--------+-----------+
    # `2 rows in set (0.00 sec)`
    
    • 多列分组
    mysql> select stuaddress,stusex,avg(math) from stu group by stuaddress,stusex;
    +------------+--------+-----------+
    | stuaddress | stusex | avg(math) |
    +------------+--------+-----------+
    | 上海       | 男     |   76.0000 |
    | 北京       | 女     |   82.0000 |
    | 北京       | 男     |   67.0000 |
    | 天津       | 男     |   83.0000 |
    | 河北       | 女     |   72.0000 |
    | 河南       | 女     |   56.0000 |
    +------------+--------+-----------+
    # `6 rows in set (0.00 sec)`
    

    order by [排序]

    • asc 升序 [默认]
    • desc 降序
    MariaDB [sel]> select * from grades order by math desc;
    +-------+---------+------+
    | name  | chinese | math |
    +-------+---------+------+
    | Sunny |      93 |   96 |
    | Marry |      95 |   94 |
    | Tommy |      98 |   94 |
    | Jerry |      97 |   91 |
    +-------+---------+------+
    # `4 rows in set (0.001 sec)`
    
    -- 按总分降序排列
    MariaDB [sel]> select *,chinese+math  from grades order by math+chinese desc;
    +-------+---------+------+--------------+
    | name  | chinese | math | chinese+math |
    +-------+---------+------+--------------+
    | Tommy |      98 |   94 |          192 |
    | Sunny |      93 |   96 |          189 |
    | Marry |      95 |   94 |          189 |
    | Jerry |      97 |   91 |          188 |
    +-------+---------+------+--------------+
    # `4 rows in set (0.001 sec)`
    
    MariaDB [sel]> select *,chinese+math '总分'  from grades order by math+chinese desc;
    +-------+---------+------+------+
    | name  | chinese | math | 总分 |
    +-------+---------+------+------+
    | Tommy |      98 |   94 |  192 |
    | Sunny |      93 |   96 |  189 |
    | Marry |      95 |   94 |  189 |
    | Jerry |      97 |   91 |  188 |
    +-------+---------+------+------+
    # `4 rows in set (0.000 sec)`
    
    • 多列排序
      • 前列为主,后列为辅
    MariaDB [sel]> select * from grades order by math desc,chinese asc;
    +-------+---------+------+
    | name  | chinese | math |
    +-------+---------+------+
    | Sunny |      93 |   96 |
    | Marry |      95 |   94 |
    | Tommy |      98 |   94 |
    | Jerry |      97 |   91 |
    +-------+---------+------+
    # `4 rows in set (0.000 sec)`
    

    having条件

    • 概念

      • 是在结果集上进行条件筛选
    • havingwhere的区别

      • where是对原始数据进行筛选
      • having是对记录集进行筛选
    -- having与where相同
    MariaDB [sel]> select * from grades where math=94;
    +-------+---------+------+
    | name  | chinese | math |
    +-------+---------+------+
    | Marry |      95 |   94 |
    | Tommy |      98 |   94 |
    +-------+---------+------+
    # `2 rows in set (0.000 sec)`
    
    MariaDB [sel]> select * from grades having math=94;
    +-------+---------+------+
    | name  | chinese | math |
    +-------+---------+------+
    | Marry |      95 |   94 |
    | Tommy |      98 |   94 |
    +-------+---------+------+
    # 2 rows in set (0.000 sec)
    
    -- having与where不同
    MariaDB [sel]> select name from grades where math=94;
    +-------+
    | name  |
    +-------+
    | Marry |
    | Tommy |
    +-------+
    # `2 rows in set (0.000 sec)`
    
    MariaDB [sel]> select name from grades having math=94;
    # `ERROR 1054 (42S22): Unknown column 'math' in 'having clause'`
    

    limit

    • 语法
      • limit [起始位置],显示长度
    -- 从第0个位置开始取,取3条记录
    mysql> select * from stu limit 0,3;
    
    -- 从第2个位置开始取,取3条记录
    mysql> select * from stu limit 2,3;
    +--------+----------+--------+--------+---------+------------+------+------+
    | stuNo  | stuName  | stuSex | stuAge | stuSeat | stuAddress | ch   | math |
    +--------+----------+--------+--------+---------+------------+------+------+
    | s25303 | 李斯文    | 女     |     22 |       2 | 北京       |   55 |   82 |
    | s25304 | 欧阳俊雄  | 男     |     28 |       4 | 天津       | NULL |   74 |
    | s25305 | 诸葛丽丽  | 女     |     23 |       7 | 河南       |   72 |   56 |
    +--------+----------+--------+--------+---------+------------+------+------+
    # `3 rows in set (0.00 sec)`
    
    • 起始位置可以省略,默认是从0开始
    mysql> select * from stu limit 3;
    +--------+---------+--------+--------+---------+------------+------+------+
    | stuNo  | stuName | stuSex | stuAge | stuSeat | stuAddress | ch   | math |
    +--------+---------+--------+--------+---------+------------+------+------+
    | s25301 | 张秋丽  | 男     |     18 |       1 | 北京        |   80 | NULL |
    | s25302 | 李文才  | 男     |     31 |       3 | 上海        |   77 |   76 |
    | s25303 | 李斯文  | 女     |     22 |       2 | 北京        |   55 |   82 |
    +--------+---------+--------+--------+---------+------------+------+------+
    # `3 rows in set (0.00 sec)`
    
    • 找出班级总分前三名
    mysql> select *,ch+math total from stu order by (ch+math) desc limit 0,3;
    +--------+----------+--------+--------+---------+------------+------+------+-------+
    | stuNo  | stuName  | stuSex | stuAge | stuSeat | stuAddress | ch   | math | total |
    +--------+----------+--------+--------+---------+------------+------+------+-------+
    | s25318 | 争青小子  | 男     |     26 |       6 | 天津       |   86 |   92 |   178 |
    | s25321 | Tabm     | 女     |     23 |       9 | 河北       |   88 |   77 |   165 |
    | s25302 | 李文才   | 男     |     31 |       3 | 上海        |   77 |   76 |   153 |
    +--------+----------+--------+--------+---------+------------+------+------+-------+
    # `3 rows in set (0.00 sec)`
    
    • limit在update和delete语句中也是可以使用的
    -- 前3名语文成绩加1分
    mysql> update stu set ch=ch+1 order by ch+math desc limit 3;
    # `Query OK, 3 rows affected (0.00 sec)`
    # `Rows matched: 3  Changed: 3  Warnings: 0`
    
    -- 前3名删除
    mysql> delete from stu order by ch+math desc limit 3;
    # `Query OK, 3 rows affected (0.00 sec)`
    

    查询语句中的选项distinct

    • 查询语句中的选项有两个
      • all 显示所有数据 [默认]
      • distinct 去除结果集中重复的数据
    -- 显示列所有数据
    MariaDB [sel]> select all math from grades;
    +------+
    | math |
    +------+
    |   96 |
    |   91 |
    |   94 |
    |   94 |
    +------+
    # `4 rows in set (0.001 sec)`
    
    -- 单列去除重复的项
    MariaDB [sel]> select distinct math from grades;
    +------+
    | math |
    +------+
    |   96 |
    |   91 |
    |   94 |
    +------+
    # `3 rows in set (0.001 sec)`
    
  • 相关阅读:
    微信小程序 生命周期
    ftp uploadFileAction(重要)
    java FTP 上传下载删除文件
    httpsession
    db2 blob EMPTY_BLOB()
    java blob
    java session getCreationTime()
    eclipse 查看源代码
    java file类
    Vue.js 和 MVVM 小细节
  • 原文地址:https://www.cnblogs.com/SharkJiao/p/14137791.html
Copyright © 2020-2023  润新知