精华内容
下载资源
问答
  • 目录MySQL的进阶查询一、 按关键字排序1.1 单字段排序1.2 多字段排序二 、对结果进行分组2.1 group by分组2.2 group by结合order by三、限制结果条目LIMIT四、设置别名五、通配符六、子查询七、视图八、NULL值九、...

    MySQL的进阶查询

    一、 按关键字排序

    • 使用ORDERBY语句来实现排序
    • 排序可针对一个或多个字段
    • ASC:升序,默认排序方式 【升序是从小到大】
    • DESC:降序 【降序是从大到小】
    • ORDER BY的语法结构
    • ORDER BY后面跟字段名

    准备一张成绩表

    mysql> select * from chengji;
    +----+-----------+-------+
    | id | name      | score |
    +----+-----------+-------+
    |  1 | xiaoli    |    85 |
    |  2 | wangcheng |    77 |
    |  3 | lili      |    65 |
    |  4 | yanyu     |    70 |
    |  5 | chenchen  |    95 |
    |  6 | baixue    |    90 |
    |  7 | liuqi     |    88 |
    +----+-----------+-------+
    7 rows in set (0.00 sec)
    

    语法结构

    select 字段1,字段2 from 表名 order by 字段1 desc|asc,字段2 desc|asc;

    1.1 单字段排序

    升序

    mysql> select * from chengji order by score;默认就是升序
    
    +----+-----------+-------+
    | id | name      | score |
    +----+-----------+-------+
    |  3 | lili      |    65 |
    |  4 | yanyu     |    70 |
    |  2 | wangcheng |    77 |
    |  1 | xiaoli    |    85 |
    |  7 | liuqi     |    88 |
    |  6 | baixue    |    90 |
    |  5 | chenchen  |    95 |
    +----+-----------+-------+
    7 rows in set (0.00 sec)
    

    降序

    mysql> select * from chengji order by score desc;
    +----+-----------+-------+
    | id | name      | score |
    +----+-----------+-------+
    |  5 | chenchen  |    95 |
    |  6 | baixue    |    90 |
    |  7 | liuqi     |    88 |
    |  1 | xiaoli    |    85 |
    |  2 | wangcheng |    77 |
    |  4 | yanyu     |    70 |
    |  3 | lili      |    65 |
    +----+-----------+-------+
    7 rows in set (0.00 sec)
    

    1.2 多字段排序

    先以前面的字段(主参考字段)排序,如果相同再按后面的字段排序

    mysql> select * from chengji;
    +----+-----------+-------+
    | id | name      | score |
    +----+-----------+-------+
    |  1 | xiaoli    |    85 |
    |  2 | wangcheng |    77 |
    |  3 | lili      |    65 |
    |  4 | yanyu     |    70 |
    |  5 | chenchen  |    95 |
    |  6 | baixue    |    90 |
    |  7 | liuqi     |    88 |
    |  8 | lihao     |    77 |
    |  9 | jiangyi   |    85 |
    +----+-----------+-------+
    9 rows in set (0.00 sec)
    
    mysql> select * from chengji order by score desc,id asc;
    +----+-----------+-------+
    | id | name      | score |
    +----+-----------+-------+
    |  5 | chenchen  |    95 |
    |  6 | baixue    |    90 |
    |  7 | liuqi     |    88 |
    |  1 | xiaoli    |    85 |  #相同记录再按id升序排
    |  9 | jiangyi   |    85 |
    |  2 | wangcheng |    77 |
    |  8 | lihao     |    77 |  #
    |  4 | yanyu     |    70 |
    |  3 | lili      |    65 |
    +----+-----------+-------+
    9 rows in set (0.00 sec)

    二 、对结果进行分组

    • 使用GROUP BY语句来实现分组
    • 通常结合聚合函数一起使用
    • 可以按一个或多个字段对结果进行分组
    • GROUP BY的语法结构

    2.1 group by分组

    按照hobby分组(相同hobby一个组),并统计每个组的人数

    mysql> select * from chengji;
    +----+-----------+-------+-------+
    | id | name      | score | hobby |
    +----+-----------+-------+-------+
    |  1 | xiaoli    |    85 |     2 |
    |  2 | wangcheng |    77 |     1 |
    |  3 | lili      |    65 |     3 |
    |  4 | yanyu     |    70 |     2 |
    |  5 | chenchen  |    95 |     2 |
    |  6 | baixue    |    90 |     1 |
    |  7 | liuqi     |    88 |     3 |
    |  8 | lihao     |    77 |     3 |
    |  9 | jiangyi   |    85 |     1 |
    +----+-----------+-------+-------+
    9 rows in set (0.00 sec)
    mysql> select count(id),hobby from chengji group by hobby;
    +-----------+-------+
    | count(id) | hobby |
    +-----------+-------+
    |         3 |     1 |
    |         3 |     2 |
    |         3 |     3 |
    +-----------+-------+
    3 rows in set (0.00 sec)
    

    2.2 group by结合order by

    先按hobby分组,再按hobby序号降序排列

    mysql> select count(id),hobby from chengji group by hobby order by hobby desc;
    +-----------+-------+
    | count(id) | hobby |
    +-----------+-------+
    |         3 |     3 |
    |         3 |     2 |
    |         3 |     1 |
    +-----------+-------+
    3 rows in set (0.00 sec)
    

    三、限制结果条目LIMIT

    • 只返回SELECT查询结果的第一行或前几行
    • 使用LIMIT语句限制条目

    LIMIT语法结构

    SELECT column1,column2,...FROM table_name LIMIT[offset,] number;
    number:返回记录行的最大数目
    [offset,]:位置偏移量,从0开始

    查看前两行

    mysql> select * from chengji limit 2;
    +----+-----------+-------+-------+
    | id | name      | score | hobby |
    +----+-----------+-------+-------+
    |  1 | xiaoli    |    85 |     2 |
    |  2 | wangcheng |    77 |     1 |
    +----+-----------+-------+-------+
    2 rows in set (0.01 sec)
    

    查看从第四行开始的五行内容

    mysql> select * from chengji limit 3,5;
    +----+----------+-------+-------+
    | id | name     | score | hobby |
    +----+----------+-------+-------+
    |  4 | yanyu    |    70 |     2 |
    |  5 | chenchen |    95 |     2 |
    |  6 | baixue   |    90 |     1 |
    |  7 | liuqi    |    88 |     3 |
    |  8 | lihao    |    77 |     3 |
    +----+----------+-------+-------+
    5 rows in set (0.00 sec)
    

    四、设置别名

    • 使用AS语句设置别名,关键字AS可省略
    • 设置别名时,保证不能与库中其他表或字段名称冲突

    别名的语法结构

    SELECT column_name AS 别名 FROM table_name;
    SELECT column_name(s) FROM table_name AS 别名;
    

    AS的用法
    对于字段设置

    #省略了as
    mysql> select name 姓名, score 分数 from chengji;
    +-----------+--------+
    | 姓名      | 分数   |
    +-----------+--------+
    | xiaoli    |     85 |
    | wangcheng |     77 |
    | lili      |     65 |
    | yanyu     |     70 |
    | chenchen  |     95 |
    | baixue    |     90 |
    | liuqi     |     88 |
    | lihao     |     77 |
    | jiangyi   |     85 |
    +-----------+--------+
    9 rows in set (0.00 sec)
    

    对于表设置,一般在多表查询时使用

    多表操作时,对表别名之后,在select字段时要用别名.字段,区分字段属于哪个表

    #这里只有一个表可不用,i.字段
    mysql> select i.address as 地址,i.name as 姓名 from info as i;
    +--------+--------+
    | 地址   | 姓名   |
    +--------+--------+
    | 苏州   | lisi   |
    | 杭州   | liqi   |
    | 北京   | wangwu |
    | 南京   | yangli |
    | 南京   | lili   |
    +--------+--------+
    5 rows in set (0.00 sec)
    

    作为连接语句
    创建一个新表,将旧表的内容导入,与旧表的区别在于表的结构

    #将成绩大于等于90的记录放入great表
    mysql> create table great as select * from chengji where score>=90;
    mysql> select * from great;
    +----+----------+-------+-------+
    | id | name     | score | hobby |
    +----+----------+-------+-------+
    |  5 | chenchen |    95 |     2 |
    |  6 | baixue   |    90 |     1 |
    +----+----------+-------+-------+
    2 rows in set (0.01 sec)
    
    #查看表的结构:无主键和自增加的约束,原来的表是有的
    mysql> desc great;
    +-------+----------+------+-----+---------+-------+
    | Field | Type     | Null | Key | Default | Extra |
    +-------+----------+------+-----+---------+-------+
    | id    | int(2)   | NO   |     | 0       |       |
    | name  | char(20) | YES  |     | NULL    |       |
    | score | int(2)   | YES  |     | NULL    |       |
    | hobby | int(2)   | YES  |     | NULL    |       |
    +-------+----------+------+-----+---------+-------+
    4 rows in set (0.00 sec)
    

    五、通配符

    • 用于替换字符串的部分字符
    • 通常配合LIKE一起使用,并协同WHERE完成查询
    • 常用的通配符
    • %表示零个、一个或多个
    • _表示单个字符

    例:
    查询以姓名y开头的记录:

    mysql> select * from chengji where name like 'y%';
    +----+-------+-------+-------+
    | id | name  | score | hobby |
    +----+-------+-------+-------+
    |  4 | yanyu |    70 |     2 |
    +----+-------+-------+-------+
    1 row in set (0.00 sec)

    查询姓名为y_ _y_格式的记录,_代表单个字符,占位

    mysql> select * from chengji where name like 'y__y_';
    +----+-------+-------+-------+
    | id | name  | score | hobby |
    +----+-------+-------+-------+
    |  4 | yanyu |    70 |     2 |
    +----+-------+-------+-------+
    1 row in set (0.00 sec)
    

    六、子查询

    • 也称作内查询或者嵌套查询
    • 先于主查询被执行,其结果将作为外层主查询的条目
    • 在增删改查中都可以使用子查询
    • 支持多层嵌套
    • IN语句是用来判断某个值是否在给定的结果集中

    例:根据表need,筛选出与need表中内容相匹配的成绩表的内容

    mysql> select * from need;
    +------+
    | id   |
    +------+
    |    1 |
    |    3 |
    |    5 |
    +------+
    3 rows in set (0.00 sec)
    #where跟的字段名,必须与select跟的字段名一致,两个表都有这个字段
    mysql> select * from chengji where id in (select id from need);
    +----+----------+-------+-------+
    | id | name     | score | hobby |
    +----+----------+-------+-------+
    |  1 | xiaoli   |    85 |     2 |
    |  3 | lili     |    65 |     3 |
    |  5 | chenchen |    95 |     2 |
    +----+----------+-------+-------+
    3 rows in set (0.00 sec)
    

    多层嵌套,筛选出need表中id与chengji表id相同的记录之后,在这基础上再筛选出名字相同的记录

    mysql> select * from chengji where name in(select name from need where id in(select id from need));
    +----+----------+-------+-------+
    | id | name     | score | hobby |
    +----+----------+-------+-------+
    |  3 | lili     |    65 |     3 |
    |  5 | chenchen |    95 |     2 |
    +----+----------+-------+-------+
    2 rows in set (0.00 sec)

    等同于下面两步的操作

    mysql> create table need2 as select name from need where id in(select id from need);
    Query OK, 3 rows affected (0.01 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    mysql> select * from need2;
    +----------+
    | name     |
    +----------+
    | NULL     |
    | lili     |
    | chenchen |
    +----------+
    3 rows in set (0.00 sec)
    mysql> select * from chengji where name in(select name from need2);
    +----+----------+-------+-------+
    | id | name     | score | hobby |
    +----+----------+-------+-------+
    |  3 | lili     |    65 |     3 |
    |  5 | chenchen |    95 |     2 |
    +----+----------+-------+-------+
    2 rows in set (0.00 sec)
    

    七、视图

    数据库中的虚拟表,这张虚拟表中不包含任何数据,只是做了数据映射;
    创建视图并查看:

    mysql> create view v_cehngji as select * from chengji where score<=80;
    mysql> select * from v_cehngji;
    +----+-----------+-------+-------+
    | id | name      | score | hobby |
    +----+-----------+-------+-------+
    |  2 | wangcheng |    77 |     1 |
    |  3 | lili      |    65 |     3 |
    |  4 | yanyu     |    70 |     2 |
    |  8 | lihao     |    77 |     3 |
    +----+-----------+-------+-------+
    4 rows in set (0.00 sec)
    
    mysql> show table status;  ###查看视图表的信息
    

    在这里插入图片描述

    八、NULL值

    • 表示缺失的值
    • 与数字0或者空白(spaces)是不同的
    • 使用IS NULL或IS NOT NULL进行判断

    NULL与空值的区别:
    空值长度为0,不占空间;NULL值的长度为NULL,占用空间
    IS NULL无法判断空值 空值使用“=”或者“<>”来处理
    COUNT()计算时,NULL会忽略,不加入计算,空值会加入计算

    九、正则表达式

    • 根据指定的匹配模式匹配记录中符合要求的特殊字符
    • 使用REGEXP关键字指定匹配模式

    常用匹配模式

    在这里插入图片描述
    例:
    查询以l开头的记录:

    mysql> select * from chengji where name regexp '^l';
    +----+-------+-------+-------+
    | id | name  | score | hobby |
    +----+-------+-------+-------+
    |  3 | lili  |    65 |     3 |
    |  7 | liuqi |    88 |     3 |
    |  8 | lihao |    77 |     3 |
    +----+-------+-------+-------+
    3 rows in set (0.00 sec)
    

    查询以o结尾的

    mysql> select * from chengji where name regexp 'o$';
    +----+-------+-------+-------+
    | id | name  | score | hobby |
    +----+-------+-------+-------+
    |  8 | lihao |    77 |     3 |
    +----+-------+-------+-------+
    1 row in set (0.00 sec)
    

    .代表任意单个字符,占位,查询lihao的记录

    mysql> select * from chengji where name regexp 'li..o';
    +----+-------+-------+-------+
    | id | name  | score | hobby |
    +----+-------+-------+-------+
    |  8 | lihao |    77 |     3 |
    +----+-------+-------+-------+
    1 row in set (0.00 sec)
    

    查询不是z开头的

    mysql> select * from info where name regexp '^[^z]';

    匹配w及后面一个w两次

    mysql> select * from info where name regexp 'ww{2}';
    +----+-------+-------+-------+----------+
    | id | name  | score | hobby | addr     |
    +----+-------+-------+-------+----------+
    |  8 | wwwwo |    65 |     2 | hangzhou |
    +----+-------+-------+-------+----------+

    十、运算符

    MySQL 的运算符用于对记录中的字段值进行运算。MySQL 的运算符共有四种,分别是:算术运算符、比较运算符、逻辑运算符和位运算符。下面分别对这四种运算符进行说明。

    10.1 算数运算符

    MYSQL支持使用的运算符号
    在这里插入图片描述

    mysql> select 1+2,5-2,4*3,9/4,9%4;
    +-----+-----+-----+--------+------+
    | 1+2 | 3-2 | 5*3 | 8/4    | 9%4  |
    +-----+-----+-----+--------+------+
    |   3 |   1 |  15 | 2.0000 |    1 |
    +-----+-----+-----+--------+------+
    1 row in set (0.00 sec)
    

    10.2 比较运算符

    常用比较运算符
    在这里插入图片描述

    10.2.1 等于

    等号(=)是用来判断数字、字符串和表达式是否相等的,如果相等则返回 1,如果不相等则返回 0。如果比较的两者有一个值是 NULL,则比较的结果就是 NULL。其中字符的比较是根据 ASCII 码来判断的,如果 ASCII 码相等,则表示两个字符相同;如果 ASCII 码不相等,则表示两个字符不相同。例如,等于运算符在数字、字符串和表达式上的使用

    mysql> select 1=2,4='4','a'='a',11=NULL;
    +-----+-------+---------+--------+
    | 1=2 | 4='4' | 'a'='a' | 11=NULL|
    +-----+-------+---------+--------+
    |   0 |     1 |       1 |   NULL |
    +-----+-------+---------+--------+
    1 row in set (0.00 sec)

    10.2.2 不等于

    不等于号有两种写法,分别是<>或者!=,用于针对数字、字符串和表达式不相等的比较。如果不相等则返回 1,如果相等则返回 0,这点正好跟等于的返回值相反。需要注意的是不等于运算符不能用于判断 NULL。

    mysql> select 'wen'<>'tin',22!=33,NULL!=NULL;
    +--------------+--------+------------+
    | 'wen'<>'tin' | 22!=33 | NULL!=NULL |
    +--------------+--------+------------+
    |            1 |      1 |       NULL |
    +--------------+--------+------------+
    1 row in set (0.01 sec)
    mysql> select 'abc'='abc';
    +-------------+
    | 'abc'='abc' |
    +-------------+
    |           1 |
    +-------------+
    1 row in set (0.00 sec)
    
    mysql> select 'abc'='bca';
    +-------------+
    | 'abc'='bca' |
    +-------------+
    |           0 |
    +-------------+
    1 row in set (0.00 sec)

    10.2.3 大于、大于等于、小于、小于等于

    • 大于(>)运算符用来判断左侧的操作数是否大于右侧的操作数,若大于返回 1,否则返回 0,同样不能用于判断 NULL。
    • 小于(<)运算符用来判断左侧的操作数是否小于右侧的操作数,若小于返回 1,否则返回 0,同样不能用于判断 NULL。
    • 大于等于(>=)判断左侧的操作数是否大于等于右侧的操作数,若大于等于返回 1,否则返回 0,不能用于判断 NULL。
    • 小于等于(<=)判断左侧的操作数是否小于等于右侧的操作数,若小于等于返回 1,否则返回 0,不能用于判断 NULL。
    • 数值比较会自动转换ASCII表的数值
    在这里插入代码片

    几个常用Dec(十进制):
    0是48,A是65,a是97,其余的都是按顺序下去的

    mysql> select 3>2,'b'>'c',5>=5,(3+4)>=(1+2),'A'<='a',5<=5.5,'n'>=NULL;
    +-----+---------+------+--------------+----------+--------+-----------+
    | 3>2 | 'b'>'c' | 5>=5 | (3+4)>=(1+2) | 'A'<='a' | 5<=5.5 | 'n'>=NULL |
    +-----+---------+------+--------------+----------+--------+-----------+
    |   1 |       0 |    1 |            1 |        1 |      1 |      NULL |
    +-----+---------+------+--------------+----------+--------+-----------+
    1 row in set (0.00 sec)

    比较字符串,一旦开头的b比a大,后面就不在比较

    mysql> select 'abc'<'baa';
    +-------------+
    | 'abc'<'baa' |
    +-------------+
    |           1 |
    +-------------+
    1 row in set (0.00 sec)

    10.2.4 IS NULL、IS NOT NULL

    • ISNULL 判断一个值是否为 NULL,如果为 NULL 返回 1,否则返回 0。
    • IS NOT NULL 判断一个值是否不为 NULL,如果不为 NULL 返回 1,否则返回 0
    mysql> select 'a' is NULL,'b' is not null,null is null,null is not null;
    +-------------+-----------------+--------------+------------------+
    | 'a' is NULL | 'b' is not null | null is null | null is not null |
    +-------------+-----------------+--------------+------------------+
    |           0 |               1 |            1 |                0 |
    +-------------+-----------------+--------------+------------------+
    1 row in set (0.00 sec)
    

    10.2.5 BETWEEN AND

    BETWEEN AND 比较运算通常用于判断一个值是否落在某两个值之间。例如,判断某数字是否在另外两个数字之间,也可以判断某英文字母是否在另外两个字母之间。between and 包含两端

    mysql> select 'd' between 'a' and 'f',6 between 1 and 10,5 between 6 and 9;
    +-------------------------+--------------------+-------------------+
    | 'd' between 'a' and 'f' | 6 between 1 and 10 | 5 between 6 and 9 |
    +-------------------------+--------------------+-------------------+
    |                       1 |                  1 |                 0 |
    +-------------------------+--------------------+-------------------+
    1 row in set (0.00 sec)
    

    数字与字符之间不能比较

    10.2.6 LEAST、GREATEST

    LEAST:当有两个或者多个参数时,返回其中的最小值。如果其中一个值为 NULL,则返回结果就为 NULL。
    GREATEST:当有两个或者多个参数时,返回其中的最大值。如果其中一个值为 NULL, 则返回结果就为 NULL。

    mysql> select least(11,87,12),greatest(98,16,43);
    +-----------------+--------------------+
    | least(11,87,12) | greatest(98,16,43) |
    +-----------------+--------------------+
    |              11 |                 98 |
    +-----------------+--------------------+
    1 row in set (0.00 sec)
    

    10.2.7 IN、NOT IN

    IN 判断一个值是否在对应的列表中,如果是返回 1,否则返回 0。
    NOT IN 判断一个值是否不在对应的列表中,如果不是返回 1,否则返回 0。

     mysql> select 'a' in ('a','b','c'),'a' not in ('a','b','c');
    +----------------------+--------------------------+
    | 'a' in ('a','b','c') | 'a' not in ('a','b','c') |
    +----------------------+--------------------------+
    |                    1 |                        0 |
    +----------------------+--------------------------+
    1 row in set (0.00 sec)
    

    10.2.8 like

    LIKE 用来匹配字符串,如果匹配成功则返回 1,反之返回 0。
    LIKE 支持两种通配符:’%’ 用于匹配任意数目的字符,而’_’只能匹配一个字符。
    NOT LIKE 正好跟 LIKE 相反,如果没有匹配成功则返回 1,反之返回 0。

    mysql> select 'abcd' like '_bcd','abcd' like '%d','abcd' not like '%cd';
    +--------------------+------------------+-----------------------+
    | 'abcd' like '_bcd' | 'abcd' like '%d' | 'abcd' not like '%cd' |
    +--------------------+------------------+-----------------------+
    |                  1 |                1 |                     0 |
    +--------------------+------------------+-----------------------+
    1 row in set (0.00 sec)

    10.3 逻辑运算符

    逻辑运算符又被称为布尔运算符,通常用来判断表达式的真假,如果为真返回 1,否则返回 0,真和假也可以用 TRUE 和 FALSE 表示。

    在这里插入图片描述

    10.3.1 逻辑非

    逻辑运算符中最简单的运算符就是逻辑非,逻辑非使用 NOT 或!表示。逻辑非将跟在它后面的逻辑测试取反,把真变为假,把假变为真。如果 NOT 后面的操作数为 0 时,所得值为 1;如果操作数为非 0 时,所得值为 0;如果操作数为 NULL 时,所得值为 NULL。例如,对非 0 值和 0 值分别作逻辑非运算,具体操作如下所示。

    mysql> select not 0,!2,!(4-4);
    +-------+----+--------+
    | not 0 | !2 | !(4-4) |
    +-------+----+--------+
    |     1 |  0 |      1 |
    +-------+----+--------+
    1 row in set (0.00 sec)

    10.3.2 逻辑与

    逻辑与通常用于判断两个值或多个值的有效性,如果所有值都是真返回 1,否则返回 0。逻辑与使用 AND 或者&&表示。例如,对非 0 值、0 值和 NULL 值分别作逻辑与运算,具体操作如下所示。

    mysql> select 2&&3,0&&1,0&&null,1 and null;
    +------+------+---------+------------+
    | 2&&3 | 0&&1 | 0&&null | 1 and null |
    +------+------+---------+------------+
    |    1 |    0 |       0 |       NULL |
    +------+------+---------+------------+
    1 row in set (0.01 sec)

    10.3.3 逻辑或

    逻辑与通常用于判断两个值或多个值的有效性,如果所有值都是真返回 1,否则返回 0。逻辑与使用 AND 或者&&表示。例如,对非 0 值、0 值和 NULL 值分别作逻辑与运算。
    一旦有个非0值,出来就是非0值

    在这mysql> select 2 or 3,2 or 0;
    +--------+--------+
    | 2 or 3 | 2 or 0 |
    +--------+--------+
    |      1 |      1 |
    +--------+--------+
    1 row in set (0.00 sec)

    10.3.4 逻辑异或

    两个非 NULL 值的操作数,如果两者都是 0 或者都是非 0,则返回 0;如果一个为 0, 另一个为非 0,则返回结果为 1;当任意一个值为 NULL 时,返回值为 NULL。例如,对非0 值、0 值和 NULL 值分别作逻辑异或运算,具体操作如下所示。
    有null结果就会为null。

    mysql> select 0 xor 3,0 xor 0,0 xor null,1 xor null;
    +---------+---------+------------+------------+
    | 0 xor 3 | 0 xor 0 | 0 xor null | 1 xor null |
    +---------+---------+------------+------------+
    |       1 |       0 |       NULL |       NULL |
    +---------+---------+------------+------------+
    1 row in set (0.00 sec)
    

    10.4 位运算符

    位运算符实际上是对二进制数进行计算的运算符。MySQL 内位运算会先将操作数变成二进制格式,然后进行位运算,最后在将计算结果从二进制变回到十进制格式,方便用户查看。

    在这里插入图片描述
    对数字进行按位与、或和取反运算,先换算成二进制数,再比较

    mysql> select 10&15,10|15,10^15,5 &~1;
    +-------+-------+-------+-------+
    | 10&15 | 10|15 | 10^15 | 5 &~1 |
    +-------+-------+-------+-------+
    |    10 |    15 |     5 |     4 |
    +-------+-------+-------+-------+
    1 row in set (0.00 sec)

    对数字进行左移位运算,向左移动位数,空缺处补0

    mysql> select 1<<2;
    +------+
    | 1<<2 |
    +------+
    |    4 |
    +------+
    1 row in set (0.00 sec)

    转换成二进制进行运算
    1是 0001
    左移2位 0100 =4

    对数字进行右移位运算,向右移动位数,多余的位数直接删除

    mysql> select 15>>2;
    +-------+
    | 15>>2 |
    +-------+
    |     3 |
    +-------+
    1 row in set (0.00 sec)

    转换成二进制进行运算
    15是 1111
    右移2位 0011 =3

    10.5 运算符的优先级

    以上不管哪种运算符,在使用过程中都有优先级问题。运算符的优先级决定了不同的运 算符在计算过程中的先后顺序。级别高的运算符会先进行计算,如果运算符的级别相同, MySQL 会按照顺序从左到右依次进行计算。如果不确定所使用的运算符的优先级,可以使用()改变优先级。

    在这里插入图片描述

    展开全文
  • SQL子查询、相关子查询

    千次阅读 2018-10-21 17:52:35
    子查询 子查询是嵌套在其他查询中...3、在WHERE子句中使用子查询,应该保证SELECT语句具有与WHERE子句中相同数目的列。 4、通常子查询将返回单个列并且与单个列进行匹配,但如果需要也可以使用多个列。 语法举例...

    子查询

    子查询是嵌套在其他查询中的查询。子查询总是从内向外处理。

    注意:

    1、在使用子查询时尽量把子查询分解为多行并且适当进行缩进,能极大的简化子查询的使用。

    2、不能嵌套太多的子查询,这样会降低性能。

    3、在WHERE子句中使用子查询,应该保证SELECT语句具有与WHERE子句中相同数目的列。

    4、通常子查询将返回单个列并且与单个列进行匹配,但如果需要也可以使用多个列。

    语法举例:

    city表中 CountryCode 列中开头包含 A 或 B 的 序号,并将符合要求的信息全部输出

    SELECT *
    FROM city
    WHERE ID IN(
    	SELECT ID
    	FROM city
    	WHERE CountryCode REGEXP '[A|B]'
    	ORDER BY ID
    );

    相关子查询

    相关子查询是涉及外部查询的子查询。

    执行过程: 
    (1)从外层查询中取出一个元组,将元组相关列的值传给内层查询。 
    (2)执行内层查询,得到子查询操作的值。 
    (3)外查询根据子查询返回的结果或结果集得到满足条件的行。 
    (4)然后外层查询取出下一个元组重复做步骤1-3,直到外层的元组全部处理完毕。  

    语法举例

    查询Booka表中大于该类图书价格平均值的图书信息SElECT 图书名,出版社,类编号,价格 

    SELECT FROM Books As a
      WHERE 价格 >
      (
        SELECT AVG(价格)
        FROM Books AS b
        WHERE a.类编号=b.类编号
      )

     

    展开全文
  • SQL Server为工具,讲解SQL语言的应用,提供了近500个曲型应用,读者可以随查随用,深入讲解SQL语言的各种查询语句,详细介绍数据库设计及管理,详细讲解存储过程、解发器和游标等知识,讲解了SQL语言在高级语言中...
  • 一 视图 VIEW视图是个虚表,如果经常要做一些固定的查询,可以...举例如下二 子查询 SQL中嵌套查询,不同于视图,子查询只在当前SQL中使用,不能被其他SQL引用。SQL 子查询比较直接的理解是,1)嵌套在SQL语句SQL...

    0ab39e44daee63b136652849ce565359.png

    一 视图 VIEW

    视图是个虚表,如果经常要做一些固定的查询,可以使用视图。视图依赖主表,主表修改,视图会跟着更新。但是视图不能太多,否则会影响效率,而且视图只能读取,不能更新。视图建立后,可以当一个只读的表使用,如果不用了就可以删除。

    举例如下

    2b626b9b4a6794d46627fabaa622e2bd.png

    a2a350ee4bba5187571c2ec9bb3c4b46.png

    二 子查询

    SQL中嵌套查询,不同于视图,子查询只在当前SQL中使用,不能被其他SQL引用。SQL 子查询比较直接的理解是,1)嵌套在SQL语句的SQL查询 2) SQL是临时表,外层SQL执行结束后就不在存在 3)先运行子查询,生成结果,作为临时表,结果被调用。4)子查询可以放在in any all where 中使用,构成更加复杂的子查询。

    比如: 根据成绩表找到每个课程中成绩最低的学生。 方法是先从成绩表中找到最低成绩,然后找到学号,最后对应到学生姓名

    9e3c22131e7889e675695600630fec1c.png
    成绩表结构

    首先要根据课程号找到最低分数,这里需要用到Group by

    2c1838881299400ecc08ed0261e4e9f9.png

    此处,不能通过简单加上学号这列而一次性找到符合条件的学号,因为group by 操作的时候并没有加入学号这个变量,所以MySQL 会随机匹配的学号,所以结果是错误的,如图

    cddba595228230288e9c94cf600687e3.png

    为了能够匹配正确的结果, 需要把这两个查询分开写,再合并如下图所示

    24b31f1fdcd9727db4977ce7bf544455.png
    原表数据

    f21111c5f43cb005bf6116434ba964a5.png

    Any All

    子查询:首先要配合比较运算符使用,any all 需要和逻辑判断组合在一起。

    下面两个查询显示的是查询比0002 课程号任意成绩高和所有成绩高的成绩的学号

    8d0ba4669215568c4e64a213867df522.png

    24efbdf1d5bf88f20beb3836553297f3.png

    【注意事项】子查询能够解决比较复杂问题,但是子查询本身会让SQL增加运行开销,所以一般不要嵌套太多,而且嵌套太多逻辑容易混乱,不便于排查错误。此外,子查询返回的是集合,集合是不能进行数学运算的,逻辑判断符号右侧只能放子查询结果,数学运算可以放到左边。

    三 标量子查询

    标量子查询在子查询上限制返回且只能返回一个单一数值,而不是一个集合。这种查询成为标量子查询,因此标量子查询的返回值可以和比价运算符使用,可以参考前文子查询的注意事项,二者返回的结果是不同的。

    6a90c0f4b9b7dc79159e7fc6ba99f462.png
    单向标量子查询

    d36cf88e0db9ff0a02a63b7cfbee8485.png
    双向标量子查询

    上图中两个子查询返回的都是单一结果,所以可以直接用于逻辑判断。标量子查询因为返回单一值,所以可以用于select, where等位置。标量子查询不能返回多行结果,但是在复杂查询中如果需要用到单一值时可以用。

    四 关联子查询

    关联子查询用于跨表查询或者分组后组内查询,在一个表里操作不能得到结果的时候需要用到,关联子查询用于组内,所以返回是集合,子查询的别名也在子查询内有效。每个变量的作用域是非常需要关注的地方,有可能SQL 报错就是因为这个问题。

    比如题目要求:查询每个课程中大于对应课程的平均成绩的学生。下图子查询中的变量在外层查询是未定义的变量,出错了。

    5c8b4b4d955fc168478cdf1c5b773d36.png

    正确的SQL如下:

    1fe5493b16ded82b0fa6a804d5e728b8.png

    简单说,子查询看成一个表,需要把两个表关联起来查询,这样就比较好理解了。

    五 如何使用SQL解决问题

    1.理解和重新表述问题,把问题量化流程化

    2. 写出分析思路

    3.分步写出SQL 语句,得出结果。

    4. 正确排查错误,从业务流到SQL语句,子查询和外层查询分别检查。

    展开全文
  • 1、视图:视图名代表SQL语句的查询结果,在书写sql的过程中将经常使用的查询创建为视图...注意事项:不能往视图中插入数据2、子查询:在select语句中嵌套select语句,嵌套的select 语句就是子查询。from子查询:把查...

    1、视图:视图名代表SQL语句的查询结果,在书写sql的过程中将经常使用的查询创建为视图,创建视图后,使用视图名代替语句,提高书写效率。

    创建视图举例:在查询界面书写视图定义语句

    13d852e35941690fb393f5b0f96e4098.png

    创建视图之后,运行选中的语句使用到了视图的名称,这个视图存储就是上面创建视图的语句。

    892878c577e8e63c9ec14899f02cc41a.png

    注意事项:不能往视图中插入数据

    7ddbb3ee630df2dfc4d9bf13c45a9099.png

    2、子查询:在select语句中嵌套select语句,嵌套的select 语句就是子查询。

    from子查询:把查询结果当成临时表,供外层查询语句查询。

    where型子查询:把查询的结果作为外层查询的比较条件。

    in子查询:仅返回一个数据列,这个数据列的值将供外层查询语句进行比较。

    any子查询:只要满足内层子查询中的任意一个比较条件,就返回一个结果作为外层查询条件。

    all子查询:外部查询需同时满足所有子查询返回的结果。

    比较运算符子查询:子查询中可以使用的比较运算符如 “>” “<” “= ” “!=”

    exists子查询:把外层的查询结果,拿到内层,看内层是否成立,简单来说后面的返回true,外层(也就是前面的语句)才会执行,否则不执行。

    3、sqlzoo练习

    ①查询人口比俄罗斯多的国家

    第一步:查询俄罗斯的人口数

    select population

    from world

    where name = 'Russia'

    第二步:将俄罗斯的人口数作为查询条件查询国家名字

    select name

    from world

    where population > (select population

    from world

    where name = 'Russia');

    ②查询人均GDP大于英国的欧洲国家

    select name

    from world

    where gdp/population >(select gdp/population as 'Per Capita GDP'

    from world

    where name = 'United Kingdom' )

    and continent = 'Europe';

    ③查询澳大利亚或阿根廷所在洲的国家和洲名,按国家排序

    select name, continent

    from world

    where continent in (select continent

    from world

    where name in('Argentina','Australia'))

    order by name;

    ④查询人数多于加拿大少于波兰的国家和人口数

    select name,population

    from world

    where population > (select population

    from world

    where name = 'Canada')

    and

    population < (select population

    from world

    where name = 'Poland');

    ⑤查询欧洲国家及人口占比(德国人口数为基准)

    select name,concat(round(population*100/

    (select population

    from world

    where name = 'Germany') ,0),'%') as percentage

    from world

    where continent = 'Europe';

    ⑥查询gdp比欧洲所有国家都高的国家

    select name

    from world

    where gdp > all (select gdp

    from world

    where continent = 'Europe'

    and gdp > 0) ;

    ⑦查询每个洲面积最大的国家,列出洲名,国家,面积

    select continent,name,area

    from world as a

    where area >= all (select area

    from world as b

    where a.continent = b.continent);

    ⑧查询每洲按字母排序的第一个国家,列出洲名,国家

    select continent,name

    from world as a

    where name =(select name

    from world as b

    where a.continent =b.continent

    order by name

    limit 1);

    ⑨查询所有国家的人口数都小于等于25000000的国家,列出国家,洲名,人口数

    select name,continent,population

    from world as a

    where 25000000 >= all (select population

    from world as b

    where a.continent = b.continent);

    ⑩查询人口数比同一洲中的任意国家人口的三倍还多的国家,列出国家,洲名

    select name,continent

    from world as a

    where population/3 >= all (select population

    from world as b

    where a.continent = b.continent

    and a.name != b.name);

    总结:

    1、不能对any、all子查询的结果进行计算,any,all返回的是一组数,例如题目10,不能书写为population >= 3*all(...)。

    2、对空值进行比较运算会报错,与空值进行比较,返回的结果为unknow,在进行运算时需要将空值进行处理,例如题目6如果不是用gdp>0处理空值,语句将会报错。

    展开全文
  • SQL——相关子查询和不相关子查询

    千次阅读 2019-11-03 18:24:41
    SQL中经常使用在“FROM/WHERE”字句中包含一个形如“SELECT-FROM-WHERE”的查询块,这样的查询块称为子查询或嵌套查询,包含子查询语句称为父查询或外部查询。 子查询分为相关子查询和不相关子查询 接下来将举例...
  • WITH AS 不同于 临时表,也不同于 视图,举例: WITH StuTemp AS ( SELECT * FROM T_Students WHERE grade='一年级' ...with...as 包含了一段sql查询语句,如上例:从学生表T_Students表取出年级等于“...
  • 1 视图什么是视图视图中存放的是SQL语句,客户端使用...select 查询语句;视图语句中的视图列名与select查询语句中的列名对应;举例:create view 按性别汇总(性别,人数) AS select 性别,count(*)as 人数 from studen...
  • SQL查询语句,连接查询知识总结。| 一 . 有哪些连接查询连接查询包括外连接:LEFT JOIN、RIGHT JOIN、FULL JOIN,以及内连接:INNER JOIN。本文重点总结LEFT JOIN,其他连接查询不一一举例。| 二 . 左连接LEFT JOIN1...
  • MySQL 运维 - 高阶SQL语句

    万次阅读 多人点赞 2021-04-16 12:49:23
    MySQL 运维 - 高阶SQL语句按单字段排序多字段排序or/and嵌套/多条件查询不重复记录指定多字段去重对结果进行分组结合排序语法限制条目结果设置别名AS作为连接语句通配符子查询子查询-别名子查询-exists试图[类似与...
  • 子查询不仅可以嵌套在SELECT语句中用以构造父查询的条件,也可以嵌套在INSERT语句中用以生成要插入的批量数据 插入子查询结果的INSERT语句格式为: # 插入子查询结果 INSERT INTO <表名> [(<属性列1>[,&...
  • SQL语句如何优化?

    2020-11-22 11:07:20
    2、尽量减少子查询,使用关联查询(left join,right join,inner join)替代 3、减少使用IN或者NOT IN ,使用exists,not exists或者关联查询语句替代 4、or 的查询尽量用 union或者union all 代替(在确
  • Oracle的SQL语句中,With查询语句不是以select开头,而是以with关键字开头。 with...as语句增加了SQL 的可读性,构造子查询,结构会更加...的SQL语句举例:with sql_conc_waits as (select sql_id, substr(sql_text...
  • 通俗的讲就是查询中有查询,SQL语句中有多个select语句。 2.什么地方可以嵌入子查询? SELECT 列 (不在标准之内) FROM 表 (可以嵌入,作为表存在) WHERE 条件 (可以嵌入,作为条件存在) 3. 举例说明 ...
  • 本次内容目录:视图子查询标量子查询关联子查询SQL解决业务问题函数一、视图视图本身不存放数据,它存放的是SQL查询语句。使用视图时,系统会运行视图里的SQL查询语句,创建出一张临时表。1、如何创建视图?create...
  • 何为子查询子查询时嵌入在其他SQL语句中的SELECT语句,也称嵌套查询 举例:查询和SMITH是同一个职位的员工 //这是在where子句中使用子查询 Select * From emp Where job = (select job from emp where ...
  • 子查询:嵌套在其它查询中的查询语句。(又称为内部查询) 主查询:包含其它子查询的查询称为主查询。(又称外部查询) 子查询分为两类: 相关子查询 非相关子查询 在主查询中,每查询一条记录,需要重新做一次子...
  • Oracle的SQL语句中,With查询语句不是以select开头,而是以with关键字开头。 with...as语句增加了SQL 的可读性,构造子查询,结构会更加...的SQL语句举例:with sql_conc_waits as (select sql_id, substr(sql_text...
  • SQL语句的小技巧

    2020-06-05 13:51:04
     SQL的写法无非就是几种,关联查询,子查询,分组函数,各种函数的使用  1.首先根据要做的需求,先分析一下,需要用到哪些查询,例如要用到关联查询,就先把用到的表列出来,比如a,b,c三个表就先写出来,select * from a,b,...
  • 文章目录一般格式:总结:1....嵌套查询 —— 在WHERE中嵌套一个完整的子查询11.集合查询 —— UNION、INTERSECT、EXCEPT举例展示:三个关系表一、查询指定列1. 查询全体学生的学号与姓名。2. 查询全体学
  • 前言:开发常用的关系型数据库mysql,mssql,postgre,oracle,简单的增删改查的SQL语句都与标准SQL兼容,这个不用讲,那么对于迭代查询(不严格的叫法:递归查询)每种数据库都不一样,对于标准SQL语句支持最好的是...
  • JPA解决sql查询过多的问题

    千次阅读 2019-01-14 10:34:30
     关于JPA、hibernate“臭名昭著”的n+1次查询导致的性能问题 问题重现举例查询列表页面,当查询涉及多表关联时,即页面...实际:JPA会发送多个sql完成,第一条语句查询主表,后面发送n条语句查询子表,即所谓...
  • 前言:开发常用的关系型数据库MySQL,mssql,postgre,Oracle,简单的增删改查的SQL语句都与标准SQL兼容,这个不用讲,那么对于迭代查询(不严格的叫法:递归查询)每种数据库都不一样,对于标准SQL语句支持最好的是...
  • 子查询是嵌套在 SQL 语句中的另一个SELECT 语句 ①多列子查询 主查询与子查询返回的多个列进行比较 --成对比较举例,多列子查询 --查询与141号或174号员工的manager_id和department_id相同的其他员工的employee_...
  • [b]写HQL时,除了where条件里可以用子查询,其它地方,如select、from面都不允许写子查询语句,如果要在select后面写子查询的话,可以用formula属性来写,如果要在from后面和用子查询则不能用HQL了,改用纯SQL(...)。...
  • 之前的学习的所有SELECT语句都是简单查询,只从单个数据库表中检索数据的单条语句SQL还允许建立子查询:嵌套在其他查询中的查询 举例:表orderitems只存储客户的ID和物品信息。实际的客户信息存储在customers表...
  • 关联子查询与嵌套子查询

    千次阅读 2010-01-18 21:07:00
    今天优化了一个sql语句,感觉速度好像是快了点,自己想想觉得也是,下面给出类似的例子,工作中的表就不拿来举例了。实际我们平常都在凭着自己的感觉在写SQL,其实跳出那个圈子你会发现能写出更好的。 一、先给出我...
  • Update 关联子查询

    千次阅读 2010-12-01 10:44:00
    、Oralce、SQL Server三种数据库中的写法不尽相同,本文将为您分别举例说明异同,供您参考,希望对您有所帮助。 Oralce和DB2都支持的语法: UPDATE A  SET (A1, A2, A3) = (SELECT B1, B2, B3 ...
  • sql执行顺序[转]

    2011-10-27 23:07:35
    1)sql语句从根本上也是逐行处理的 2)sql语句各部分的执行顺序:   FROM clause WHERE clause ...GROUP BY clause ...3)关联子查询中,外部查询中的每一行被一次一行的...4)关联子查询举例: select * from...

空空如也

空空如也

1 2 3 4 5
收藏数 99
精华内容 39
关键字:

sql子查询语句举例