tedwhy 发表于 2018-10-23 12:03:15

Mysql 笔记之SQL语句及查询语句详解

  Mysql 笔记之SQL语句及查询语句详解
  DDL DATABASE | SCHEMA , TABLE , INDEX
  BTREE    全指匹配    左前缀   列前缀范围匹配
  HASH   等值比较   =    IN()
  索引加速查询降低修改
  查询操作 DML
  INSERT INTO       UPDATE      DELETE
  查看INSERT 的帮助信息如下
  MariaDB [(none)]> HELP INSERT;
  Name: 'INSERT'
  Description:
  Syntax:
  1、第一种INSERT 使用方法
  INSERT tbl_name [(col_name,...)]
  {VALUES | VALUE} ({expr | DEFAULT},...),(...),...批量插入
  Mysql基于默认,
  2、第二种INSERT 使用方法
  INSERT tbl_name SET col_name={expr | DEFAULT}, ...通常一次插入一ci
  3、第三种INSERT 使用方法
  INSERT tbl_name [(col_name,...)]
  SELECT ...
  [ ON DUPLICATE KEY UPDATE
  col_name=expr
  [, col_name=expr] ... ]

  例题创建表 tmp8 >  MariaDB > CREATE TABLE tmp8(id INT(11) AUTO_INCREMENT PRIMARY KEY,name CHAR(20),gender ENUM('m','f'));
  Query OK, 0 rows affected (0.01 sec)
  第一种方法
  MariaDB > INSERT INTO tmp8 VALUES(NULL,'lin chong', 'm'),(NULL,'Wu song','m'),(NULL,'Sun erniang','f');
  Query OK, 3 rows affected (0.01 sec)
  Records: 3Duplicates: 0Warnings: 0
  MariaDB > SELECT * FROM tmp8;
  +----+-------------+--------+

  |>  +----+-------------+--------+
  |1 | lin chong   | m      |
  |2 | Wu song   | m      |
  |3 | Sun erniang | f      |
  +----+-------------+--------+
  3 rows in set (0.00 sec)
  第一种方法
  MariaDB > INSERT INTO tmp8 (name,gender)VALUES('Yang zhi','m');
  Query OK, 1 row affected (0.01 sec)
  MariaDB > SELECT * FROM tmp8;
  +----+-------------+--------+

  |>  +----+-------------+--------+
  |1 | lin chong   | m      |
  |2 | Wu song   | m      |
  |3 | Sun erniang | f      |
  |4 | Yang zhi    | m      |
  +----+-------------+--------+
  4 rows in set (0.00 sec)
  第二中插入方法 set
  MariaDB > INSERT INTO tmp8 SET name='Li kui',gender='m';
  Query OK, 1 row affected (0.01 sec)
  MariaDB > SELECT * FROM tmp8;
  +----+-------------+--------+

  |>  +----+-------------+--------+
  |1 | lin chong   | m      |
  |2 | Wu song   | m      |
  |3 | Sun erniang | f      |
  |4 | Yang zhi    | m      |
  |5 | Li kui      | m      |
  +----+-------------+--------+
  5 rows in set (0.00 sec)
  使用第一种方法再加两位女英雄
  MariaDB > INSERT INTO tmp8( name,gender) VALUES('Gu dasao','f'),('Hu sanmiang','f');
  Query OK, 2 rows affected (0.00 sec)
  Records: 2Duplicates: 0Warnings: 0
  MariaDB > SELECT * FROM tmp8;
  +----+-------------+--------+

  |>  +----+-------------+--------+
  |1 | lin chong   | m      |
  |2 | Wu song   | m      |
  |3 | Sun erniang | f      |
  |4 | Yang zhi    | m      |
  |5 | Li kui      | m      |
  |6 | Gu dasao    | f      |
  |7 | Hu sanmiang | f      |
  +----+-------------+--------+
  7 rows in set (0.00 sec)
  再创建个表tmp7
  MariaDB > CREATE TABLE tmp7 (id INT(11)AUTO_INCREMENT PRIMARY KEY,name CHAR(30),gender ENUM('m','f'));
  Query OK, 0 rows affected (0.02 sec)
  MariaDB > INSERT INTO tmp7 VALUES(NULL,'Zhu geliang','m'),(NULL,'Hang yueying','f');
  Query OK, 2 rows affected (0.01 sec)
  Records: 2Duplicates: 0Warnings: 0
  MariaDB > SELECT * FROM tmp7;
  +----+--------------+--------+

  |>  +----+--------------+--------+
  |1 | Zhu geliang| m      |
  |2 | Hang yueying | f      |
  +----+--------------+--------+
  2 rows in set (0.00 sec)
  第三种查找tmp8的gender=‘f’的所有人添加到tmp7中
  MariaDB > INSERT INTO tmp7(name,gender) SELECT * FROM tmp8 WHERE gender='f';
  ERROR 1136 (21S01): Column count doesn't match value count at row 1
  报错了,    下面才可以
  MariaDB > INSERT INTO tmp7(name,gender) SELECT name,gender FROM tmp8 WHERE gender='f';
  Query OK, 3 rows affected (0.01 sec)
  Records: 3Duplicates: 0Warnings: 0
  MariaDB > SELECT * FROM tmp7;
  +----+---------------+--------+

  |>  +----+---------------+--------+
  |1 | Zhu geliang   | m      |
  |2 | Huang yueying | f      |
  |3 | Sun erniang   | f      |
  |4 | Gu dasao      | f      |
  |5 | Hu sanmiang   | f      |
  +----+---------------+--------+
  5 rows in set (0.00 sec)
  UPDATE
  MariaDB > HELP UPDATE;
  Name: 'UPDATE'
  Description:
  Syntax:
  Single-table syntax:
  UPDATE table_reference
  SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
  
  
  
  单表操作
  判断某字段值为空IS NULL   不为空IS NOT NULL
  把ClassID为空的行的年龄改为70
  MariaDB > UPDATE students SET Age=70 WHERE>
  Query OK, 4 rows affected (0.01 sec)
  Rows matched: 4Changed: 4Warnings: 0
  MariaDB > SELECT * FROM students;
  +-------+---------------+-----+--------+---------+-----------+

  | StuID | Name          | Age | Gender |>  +-------+---------------+-----+--------+---------+-----------+
  |   1 | Shi Zhongyu   |22 | M      |       2 |         3 |
  |   2 | Shi Potian    |22 | M      |       1 |         7 |
  |   3 | Xie Yanke   |53 | M      |       2 |      16 |
  |   4 | Ding Dian   |32 | M      |       4 |         4 |
  |   5 | Yu Yutong   |26 | M      |       3 |         1 |
  |   6 | Shi Qing      |46 | M      |       5 |      NULL |
  |   7 | Xi Ren      |19 | F      |       3 |      NULL |
  |   8 | Lin Daiyu   |17 | F      |       7 |      NULL |
  |   9 | Ren Yingying|20 | F      |       6 |      NULL |
  |    10 | Yue Lingshan|19 | F      |       3 |      NULL |
  |    11 | Yuan Chengzhi |23 | M      |       6 |      NULL |
  |    12 | Wen Qingqing|19 | F      |       1 |      NULL |
  |    13 | Tian Boguang|33 | M      |       2 |      NULL |
  |    14 | Lu Wushuang   |17 | F      |       3 |      NULL |
  |    15 | Duan Yu       |19 | M      |       4 |      NULL |
  |    16 | Xu Zhu      |21 | M      |       1 |      NULL |
  |    17 | Lin Chong   |25 | M      |       4 |      NULL |
  |    18 | Hua Rong      |23 | M      |       7 |      NULL |
  |    19 | Xue Baochai   |18 | F      |       6 |      NULL |
  |    20 | Diao Chan   |19 | F      |       7 |      NULL |
  |    21 | Huang Yueying |22 | F      |       6 |      NULL |
  |    22 | Xiao Qiao   |20 | F      |       1 |      NULL |
  |    23 | Ma Chao       |23 | M      |       4 |      NULL |
  |    24 | Xu Xian       |70 | M      |    NULL |      NULL |
  |    25 | Sun Dasheng   |70 | M      |    NULL |      NULL |
  |    26 | Hong qigong   |70 | M      |    NULL |      NULL |
  |    27 | Yi Deng       |70 | M      |    NULL |      NULL |
  +-------+---------------+-----+--------+---------+-----------+
  27 rows in set (0.00 sec)
  找出年龄小于等于20的
  MariaDB > SELECT * FROM students WHERE Age  +-------+--------------+-----+--------+---------+-----------+
  |   7 | Xi Ren       |19 | F      |       3 |      NULL |
  |   8 | Lin Daiyu    |17 | F      |       7 |      NULL |
  |   9 | Ren Yingying |20 | F      |       6 |      NULL |
  |    10 | Yue Lingshan |19 | F      |       3 |      NULL |
  |    12 | Wen Qingqing |19 | F      |       1 |      NULL |
  |    14 | Lu Wushuang|17 | F      |       3 |      NULL |
  |    15 | Duan Yu      |19 | M      |       4 |      NULL |
  |    19 | Xue Baochai|18 | F      |       6 |      NULL |
  |    20 | Diao Chan    |19 | F      |       7 |      NULL |
  |    22 | Xiao Qiao    |20 | F      |       1 |      NULL |
  +-------+--------------+-----+--------+---------+-----------+
  10 rows in set (0.00 sec)
  把年龄小于18的ClassID改成3
  MariaDB > UPDATE students SET>
  Query OK, 1 row affected (0.01 sec)
  Rows matched: 2Changed: 1Warnings: 0
  再次查看
  MariaDB > SELECT * FROM students WHERE Age  +-------+--------------+-----+--------+---------+-----------+
  |   7 | Xi Ren       |19 | F      |       3 |      NULL |
  |   8 | Lin Daiyu    |17 | F      |       3 |      NULL |
  |   9 | Ren Yingying |20 | F      |       6 |      NULL |
  |    10 | Yue Lingshan |19 | F      |       3 |      NULL |
  |    12 | Wen Qingqing |19 | F      |       1 |      NULL |
  |    14 | Lu Wushuang|17 | F      |       3 |      NULL |
  |    15 | Duan Yu      |19 | M      |       4 |      NULL |
  |    19 | Xue Baochai|18 | F      |       6 |      NULL |
  |    20 | Diao Chan    |19 | F      |       7 |      NULL |
  |    22 | Xiao Qiao    |20 | F      |       1 |      NULL |
  +-------+--------------+-----+--------+---------+-----------+
  10 rows in set (0.00 sec)
  使用ORDER BY 默认升序排列,LIMIT限制前几行
  MariaDB > UPDATE students SET>
  Query OK, 3 rows affected (0.07 sec)
  Rows matched: 3Changed: 3Warnings: 0
  MariaDB > SELECT * FROM students WHERE Age  +-------+--------------+-----+--------+---------+-----------+
  |   8 | Lin Daiyu    |17 | F      |       4 |      NULL |
  |    14 | Lu Wushuang|17 | F      |       4 |      NULL |
  |    19 | Xue Baochai|18 | F      |       4 |      NULL |
  |   7 | Xi Ren       |19 | F      |       3 |      NULL |
  |    10 | Yue Lingshan |19 | F      |       3 |      NULL |
  |    12 | Wen Qingqing |19 | F      |       1 |      NULL |
  |    15 | Duan Yu      |19 | M      |       4 |      NULL |
  |    20 | Diao Chan    |19 | F      |       7 |      NULL |
  +-------+--------------+-----+--------+---------+-----------+
  8 rows in set (0.01 sec)
  按年龄逆序排ORDER BY Age DESC
  MariaDB > UPDATE students SET>
  Query OK, 2 rows affected (0.00 sec)
  Rows matched: 2Changed: 2Warnings: 0
  MariaDB > SELECT * FROM students WHERE Age  +-------+--------------+-----+--------+---------+-----------+
  |   7 | Xi Ren       |19 | F      |       5 |      NULL |
  |    10 | Yue Lingshan |19 | F      |       5 |      NULL |
  |    12 | Wen Qingqing |19 | F      |       1 |      NULL |
  |    15 | Duan Yu      |19 | M      |       4 |      NULL |
  |    20 | Diao Chan    |19 | F      |       7 |      NULL |
  |    19 | Xue Baochai|18 | F      |       4 |      NULL |
  |   8 | Lin Daiyu    |17 | F      |       4 |      NULL |
  |    14 | Lu Wushuang|17 | F      |       4 |      NULL |
  +-------+--------------+-----+--------+---------+-----------+
  MariaDB > HELP DELETE;
  Name: 'DELETE'
  Description:
  Syntax:
  Single-table syntax:
  DELETE FROM tbl_name
  
  
  
  Multiple-table syntax:
  DELETE
  tbl_name[.*] [, tbl_name[.*]] ...
  FROM table_references
  
  Or:
  DELETE
  FROM tbl_name[.*] [, tbl_name[.*]] ...
  USING table_references
  
  删除年龄大于60的用户
  MariaDB > DELETE FROM students WHERE Age>60;
  Query OK, 4 rows affected (0.01 sec)
  MariaDB > SELECT * FROM students ORDER BY Age;
  +-------+---------------+-----+--------+---------+-----------+

  | StuID | Name          | Age | Gender |>  +-------+---------------+-----+--------+---------+-----------+
  |    14 | Lu Wushuang   |17 | F      |       4 |      NULL |
  |   8 | Lin Daiyu   |17 | F      |       4 |      NULL |
  |    19 | Xue Baochai   |18 | F      |       4 |      NULL |
  |    15 | Duan Yu       |19 | M      |       4 |      NULL |
  |    10 | Yue Lingshan|19 | F      |       5 |      NULL |
  |   7 | Xi Ren      |19 | F      |       5 |      NULL |
  |    20 | Diao Chan   |19 | F      |       7 |      NULL |
  |    12 | Wen Qingqing|19 | F      |       1 |      NULL |
  |   9 | Ren Yingying|20 | F      |       6 |      NULL |
  |    22 | Xiao Qiao   |20 | F      |       1 |      NULL |
  |    16 | Xu Zhu      |21 | M      |       1 |      NULL |
  |    21 | Huang Yueying |22 | F      |       6 |      NULL |
  |   1 | Shi Zhongyu   |22 | M      |       2 |         3 |
  |   2 | Shi Potian    |22 | M      |       1 |         7 |
  |    23 | Ma Chao       |23 | M      |       4 |      NULL |
  |    18 | Hua Rong      |23 | M      |       7 |      NULL |
  |    11 | Yuan Chengzhi |23 | M      |       6 |      NULL |
  |    17 | Lin Chong   |25 | M      |       4 |      NULL |
  |   5 | Yu Yutong   |26 | M      |       3 |         1 |
  |   4 | Ding Dian   |32 | M      |       4 |         4 |
  |    13 | Tian Boguang|33 | M      |       2 |      NULL |
  |   6 | Shi Qing      |46 | M      |       5 |      NULL |
  |   3 | Xie Yanke   |53 | M      |       2 |      16 |
  +-------+---------------+-----+--------+---------+-----------+
  23 rows in set (0.00 sec)
  删除按年龄排序前三行
  MariaDB > DELETE FROM students ORDER BY Age LIMIT 3;
  Query OK, 3 rows affected (0.00 sec)
  MariaDB > SELECT * FROM students ORDER BY Age;
  +-------+---------------+-----+--------+---------+-----------+

  | StuID | Name          | Age | Gender |>  +-------+---------------+-----+--------+---------+-----------+
  |    12 | Wen Qingqing|19 | F      |       1 |      NULL |
  |    10 | Yue Lingshan|19 | F      |       5 |      NULL |
  |   7 | Xi Ren      |19 | F      |       5 |      NULL |
  |    15 | Duan Yu       |19 | M      |       4 |      NULL |
  |    20 | Diao Chan   |19 | F      |       7 |      NULL |
  |   9 | Ren Yingying|20 | F      |       6 |      NULL |
  |    22 | Xiao Qiao   |20 | F      |       1 |      NULL |
  |    16 | Xu Zhu      |21 | M      |       1 |      NULL |
  |    21 | Huang Yueying |22 | F      |       6 |      NULL |
  |   1 | Shi Zhongyu   |22 | M      |       2 |         3 |
  |   2 | Shi Potian    |22 | M      |       1 |         7 |
  |    11 | Yuan Chengzhi |23 | M      |       6 |      NULL |
  |    18 | Hua Rong      |23 | M      |       7 |      NULL |
  |    23 | Ma Chao       |23 | M      |       4 |      NULL |
  |    17 | Lin Chong   |25 | M      |       4 |      NULL |
  |   5 | Yu Yutong   |26 | M      |       3 |         1 |
  |   4 | Ding Dian   |32 | M      |       4 |         4 |
  |    13 | Tian Boguang|33 | M      |       2 |      NULL |
  |   6 | Shi Qing      |46 | M      |       5 |      NULL |
  |   3 | Xie Yanke   |53 | M      |       2 |      16 |
  +-------+---------------+-----+--------+---------+-----------+
  20 rows in set (0.00 sec)
  MariaDB > SHOW GLOBAL VARIABLES LIKE 'query_cache%';
  +------------------------------+----------+
  | Variable_name                | Value    |
  +------------------------------+----------+
  | query_cache_limit            | 1048576|
  | query_cache_min_res_unit   | 4096   |
  | query_cache_size             | 16777216 |
  | query_cache_strip_comments   | OFF      |
  | query_cache_type             | ON       |
  | query_cache_wlock_invalidate | OFF      |
  +------------------------------+----------+
  6 rows in set (0.01 sec)
  查缓存,,    只要大于1的正数表示启用查询缓存的功能
  MariaDB > SELECT @@GLOBAL.query_cache_size;
  +---------------------------+
  | @@GLOBAL.query_cache_size |
  +---------------------------+
  |                  16777216 |
  +---------------------------+
  1 row in set (0.00 sec)
  查询当前时间
  MariaDB > SELECT CURRENT_TIME();
  +----------------+
  | CURRENT_TIME() |
  +----------------+
  | 18:25:45       |
  +----------------+
  1 row in set (0.00 sec)
  或者
  MariaDB > SELECT NOW();
  +---------------------+
  | NOW()               |
  +---------------------+
  | 2014-08-30 18:26:54 |
  +---------------------+
  1 row in set (0.00 sec)
  MariaDB > SELECT @@GLOBAL.query_cache_type;
  +---------------------------+
  | @@GLOBAL.query_cache_type |
  +---------------------------+
  | ON                        |
  +---------------------------+
  1 row in set (0.00 sec)
  有三种情况DEMAND 表示按需缓存,意思是只有明确写明要缓存结果的SELECT语句的结果才会进行缓存。
  注意几乎所有的缓存中,缓存的内容都是key-value格式
  Key:查询语句的hash码;
  Value:查询语句的执行result
  缓存就是提高性能的。
  客户端------》查询缓存------》客户端;
  客户端------》查询缓存-----》解析器-------》预处理器-------》查询优化器-------》查询执行引擎-------》存储引擎(处理数据)--------》查询执行引擎-------》客户端
  分组的目的就是聚合的,聚合后可处理如求平均值
  SELECT values_to_diplay-------投影表示挑选出字段的,过滤列的
  FROM table_name
  WHERE expression   ----   挑选选择符合条件的行
  GROUP BY how_to_group
  HAVING expression
  ORDER BY how_to_sort
  LIMIT row_count;
  WHERE可使用算数运算符,关系运算符
  如
  MariaDB > SELECT Name,Age FROM students;   红色的挑选出列
  +---------------+-----+
  | Name          | Age |
  +---------------+-----+
  | Shi Zhongyu   |22 |
  | Shi Potian    |22 |
  | Xie Yanke   |53 |
  | Ding Dian   |32 |
  | Yu Yutong   |26 |
  | Shi Qing      |46 |
  | Xi Ren      |19 |
  | Ren Yingying|20 |
  | Yue Lingshan|19 |
  | Yuan Chengzhi |23 |
  | Wen Qingqing|19 |
  | Tian Boguang|33 |
  | Duan Yu       |19 |
  | Xu Zhu      |21 |
  | Lin Chong   |25 |
  | Hua Rong      |23 |
  | Diao Chan   |19 |
  | Huang Yueying |22 |
  | Xiao Qiao   |20 |
  | Ma Chao       |23 |
  +---------------+-----+
  20 rows in set (0.00 sec)
  字段别名
  MariaDB > SELECT Name AS student,age FROM students;
  +---------------+-----+
  | student       | age |
  +---------------+-----+
  | Shi Zhongyu   |22 |
  | Shi Potian    |22 |
  | Xie Yanke   |53 |
  | Ding Dian   |32 |
  | Yu Yutong   |26 |
  | Shi Qing      |46 |
  | Xi Ren      |19 |
  | Ren Yingying|20 |
  | Yue Lingshan|19 |
  | Yuan Chengzhi |23 |
  | Wen Qingqing|19 |
  | Tian Boguang|33 |
  | Duan Yu       |19 |
  | Xu Zhu      |21 |
  | Lin Chong   |25 |
  | Hua Rong      |23 |
  | Diao Chan   |19 |
  | Huang Yueying |22 |
  | Xiao Qiao   |20 |
  | Ma Chao       |23 |
  +---------------+-----+
  20 rows in set (0.00 sec)
  DISTINCT    对应相同的值只显示一次
  MariaDB > SELECT DISTINCT AGE FROM students;
  +-----+
  | AGE |
  +-----+
  |22 |
  |53 |
  |32 |
  |26 |
  |46 |
  |19 |
  |20 |
  |23 |
  |33 |
  |21 |
  |25 |
  +-----+
  11 rows in set (0.00 sec)
  BETWEEN。。AND。。范围
  IN表示存在性测试指定范围内存在性。 IN(10,100,1000)后接列表,
  IS NULL    ///////    ISNOTNULL
  LIKE 可以使用通配符
  RLIKE          可使用正则表达式
  事例
  MariaDB > SELECT Name,Age FROM students WHERE Name LIKE 's%';
  +-------------+-----+
  | Name      | Age |
  +-------------+-----+
  | Shi Zhongyu |22 |
  | Shi Potian|22 |
  | Shi Qing    |46 |
  +-------------+-----+
  3 rows in set (0.00 sec)
  MariaDB > SELECT Name,Age FROM students WHERE Name RLIKE '^s.*u$';
  +-------------+-----+
  | Name      | Age |
  +-------------+-----+
  | Shi Zhongyu |22 |
  +-------------+-----+
  1 row in set (0.00 sec)
  逻辑操作符andor   not
  GROUP BY 做分组
  MariaDB > SELECT>
  +---------+----------+

  |>  +---------+----------+
  |       1 |20.5000 |
  |       2 |36.0000 |
  |       3 |26.0000 |
  |       4 |24.7500 |
  |       5 |28.0000 |
  |       6 |21.6667 |
  |       7 |21.0000 |
  +---------+----------+
  7 rows in set (0.08 sec)
  MariaDB > SELECT>
  +---------+----------+

  |>  +---------+----------+
  |       2 |36.0000 |
  |       3 |26.0000 |
  |       5 |28.0000 |
  +---------+----------+
  3 rows in set (0.00 sec)
  MariaDB > SELECT>
  GROUP BY :做聚合计算是使用,表示根据指定的字段,对符合条件的行做分组,而后对每分组做聚合计算;   聚合计算AVG()平局数;SUM()求和;MAX()最大;   MIN()   COUNT()统计个数。
  HAVING: 对聚合计数做过滤。
  ORDER BY 指定字段排序可以有多个。
  MariaDB > SELECT>
  +---------+----------------+

  |>  +---------+----------------+
  |       1 |            4 |
  |       2 |            3 |
  |       3 |            1 |
  |       4 |            4 |
  |       5 |            3 |
  |       6 |            3 |
  |       7 |            2 |
  +---------+----------------+
  7 rows in set (0.02 sec)
  MariaDB > SELECT>
  +---------+----------+

  |>  +---------+----------+
  |       1 |       82 |
  |       2 |      108 |
  |       3 |       26 |
  |       4 |       99 |
  |       5 |       84 |
  |       6 |       65 |
  |       7 |       42 |
  +---------+----------+
  7 rows in set (0.02 sec)
  使用HAVING
  MariaDB > SELECT>
  +---------+----------+

  |>  +---------+----------+
  |       1 |       82 |
  |       2 |      108 |
  |       4 |       99 |
  |       5 |       84 |
  +---------+----------+
  4 rows in set (0.01 sec)
  按名字排序
  MariaDB > SELECT Name,Age FROM students ORDER BY Name;
  +---------------+-----+
  | Name          | Age |
  +---------------+-----+
  | Diao Chan   |19 |
  | Ding Dian   |32 |
  | Duan Yu       |19 |
  | Hua Rong      |23 |
  | Huang Yueying |22 |
  | Lin Chong   |25 |
  | Ma Chao       |23 |
  | Ren Yingying|20 |
  | Shi Potian    |22 |
  | Shi Qing      |46 |
  | Shi Zhongyu   |22 |
  | Tian Boguang|33 |
  | Wen Qingqing|19 |
  | Xi Ren      |19 |
  | Xiao Qiao   |20 |
  | Xie Yanke   |53 |
  | Xu Zhu      |21 |
  | Yu Yutong   |26 |
  | Yuan Chengzhi |23 |
  | Yue Lingshan|19 |
  +---------------+-----+
  20 rows in set (0.01 sec)
  按年龄
  MariaDB > SELECT Name,Age FROM students ORDER BY Age;
  +---------------+-----+
  | Name          | Age |
  +---------------+-----+
  | Wen Qingqing|19 |
  | Yue Lingshan|19 |
  | Xi Ren      |19 |
  | Duan Yu       |19 |
  | Diao Chan   |19 |
  | Ren Yingying|20 |
  | Xiao Qiao   |20 |
  | Xu Zhu      |21 |
  | Huang Yueying |22 |
  | Shi Zhongyu   |22 |
  | Shi Potian    |22 |
  | Yuan Chengzhi |23 |
  | Hua Rong      |23 |
  | Ma Chao       |23 |
  | Lin Chong   |25 |
  | Yu Yutong   |26 |
  | Ding Dian   |32 |
  | Tian Boguang|33 |
  | Shi Qing      |46 |
  | Xie Yanke   |53 |
  +---------------+-----+
  20 rows in set (0.00 sec)
  都是升序可以后接DESC 降序
  使用LIMIT 4,3表示隔四个取三个
  MariaDB > SELECT Name,Age FROM students ORDER BY Age LIMIT 4,3;
  +--------------+-----+
  | Name         | Age |
  +--------------+-----+
  | Diao Chan    |19 |
  | Ren Yingying |20 |
  | Xiao Qiao    |20 |
  +--------------+-----+
  3 rows in set (0.00 sec)
  SELECT 执行时先执行 FROM(判断表)再执行WHERE 而后GROUP BY 分组和HAVING过滤,若GROUP BY 和HAVING不存在则执行ORDER BY(排序) 如果排序不存在最后执行投影SELECT   最最后才LIMIT
  如下事例先判断表而后条件WHERE 最后才投影
  MariaDB > SELECT Name,Age FROM students WHERE Age>30;
  +--------------+-----+
  | Name         | Age |
  +--------------+-----+
  | Xie Yanke    |53 |
  | Ding Dian    |32 |
  | Shi Qing   |46 |
  | Tian Boguang |33 |
  +--------------+-----+
  4 rows in set (0.00 sec)
  join 多表查询
  连接查询   事先将两张表相应的join操作,而后根据join的结果做查询
  CROSS JOIN交叉连接   笛卡尔积
  INNER JOIN内部连接
  OUTER JOIN外部连接,(左外右外)以其中一个表为基准
  NATURAL JOIN   等值连接
  如果OUTER JOIN 以左表为基准则LEFT OUTER JOIN右表没有的为空。以右表为基准

  SELECT students.name,>  下面是等值链接
http://home.51cto.com/thumb.php?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M00/54/32/wKioL1R77rOBCGkwAACMYqjHJjM632.jpg
  先下面是交叉链接这种操作很危险谨慎
http://home.51cto.com/thumb.php?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M00/54/34/wKiom1R77ivg76vVAAFjaZ3UjMs766.jpg
  下面有个表 teachers
http://home.51cto.com/thumb.php?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M00/54/32/wKioL1R77rTjx3HlAACIfTDqSXU688.jpg
  找到 students和teachers表中学生名和对应的老师的名字。
http://home.51cto.com/thumb.php?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M01/54/32/wKioL1R77rSTEQ0QAACzf6amM-o859.jpg
  左外连接
http://home.51cto.com/thumb.php?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M01/54/34/wKiom1R77iuis-KhAAD8-4zsqCI005.jpg
  右外连接
http://home.51cto.com/thumb.php?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M02/54/32/wKioL1R77rTjNz7UAACdB5QQVlk708.jpg
  子查询:查询中嵌套着查询
  基于某查询语句的结果再次进行的查询
  用于WHERE子句的子查询
  1、用于比较表达式中的子查询
  要求子查询只能返回单个结果;
  2、用于IN中的子查询
  判断是否存在于指定的列表中
  3、用于EXISTS中子查询
  SELECT Name,Age FROM students WHERE Age > (SELECT AVG(Age) FROM students);
  查找表students 中平均年龄
  MariaDB > SELECT AVG(Age) FROM students;
  +----------+
  | AVG(Age) |
  +----------+
  |25.3000 |
  +----------+
  1 row in set (0.37 sec)
  使用子查询查找students中年龄大于平均年龄的同学
  MariaDB > SELECT Name AS students FROM students WHERE Age > (SELECT AVG(Age) FROM students);
  +--------------+
  | students   |
  +--------------+
  | Xie Yanke    |
  | Ding Dian    |
  | Yu Yutong    |
  | Shi Qing   |
  | Tian Boguang |
  +--------------+
  5 rows in set (0.00 sec)
  2、用于IN中的子查询,判断是否存在于指定的列表中。
  查出老师的编号使之与学生相同编号的学生的名字
  MariaDB > SELECT Name FROM students WHERE StuID IN (SELECT TID FROM teachers);
  +-------------+
  | Name      |
  +-------------+
  | Shi Zhongyu |
  | Shi Potian|
  | Xie Yanke   |
  | Ding Dian   |
  +-------------+
  4 rows in set (0.14 sec)
  3、用于EXISTS中子查询
  用于FROM中的子查询:
  SELECT alias.col,... FROM (SELECT statement) AS alias WHERE clause
  例如:SELECT s.Name FROM (SELECT * FROM students WHERE Age > 20) AS s WHERE s.Name LIKE 's%';
  联合查询:
  SELECT statement UNION SELECT statement
  将两外或多个返回值字段相同的查询的结果合并输出;
  MariaDB > SELECT Name,Age FROM teachers WHERE Age >=40;
  +---------------+-----+
  | Name          | Age |
  +---------------+-----+
  | Song Jiang    |45 |
  | Zhang Sanfeng |94 |
  | Miejue Shitai |77 |
  | Lin Chaoying|93 |
  +---------------+-----+
  4 rows in set (0.00 sec)
  MariaDB > SELECT Name,Age FROM students WHERE Age >=40;
  +-----------+-----+
  | Name      | Age |
  +-----------+-----+
  | Xie Yanke |53 |
  | Shi Qing|46 |
  +-----------+-----+
  2 rows in set (0.00 sec)
  MariaDB > SELECT Name,Age FROM students WHERE Age >= 40 UNION SELECT Name,Age FROM teachers WHERE Age >= 40;
  +---------------+-----+
  | Name          | Age |
  +---------------+-----+
  | Xie Yanke   |53 |
  | Shi Qing      |46 |
  | Song Jiang    |45 |
  | Zhang Sanfeng |94 |
  | Miejue Shitai |77 |
  | Lin Chaoying|93 |
  +---------------+-----+
  6 rows in set (0.05 sec)
  视图:VIEW
  存储下来的SELECT语句,此语句有名称;此名称表示的对象类似表;
  虚表:视图
  基表:视图中的查询语句针对其进行查询的表
  CREATE VIEW view_name AS SELECT statement;
  DROP VIEW view_name;
  MariaDB > CREATE VIEW stus AS SELECT StuID,Name,Age,Gender FROMstudents;
  Query OK, 0 rows affected (0.10 sec)
  MariaDB > SHOW TABLES;
  +-------------------+
  | Tables_in_hellodb |
  +-------------------+

  |>  | coc               |
  | courses         |
  | scores            |
  | students          |
  | stus            |
  | teachers          |
  | tmp1            |
  | toc               |
  +-------------------+
  9 rows in set (0.01 sec)
  MariaDB > SELECT * FROM stus;
  +-------+---------------+-----+--------+
  | StuID | Name          | Age | Gender |
  +-------+---------------+-----+--------+
  |   1 | Shi Zhongyu   |22 | M      |
  |   2 | Shi Potian    |22 | M      |
  |   3 | Xie Yanke   |53 | M      |
  |   4 | Ding Dian   |32 | M      |
  |   5 | Yu Yutong   |26 | M      |
  |   6 | Shi Qing      |46 | M      |
  |   7 | Xi Ren      |19 | F      |
  |   9 | Ren Yingying|20 | F      |
  |    10 | Yue Lingshan|19 | F      |
  |    11 | Yuan Chengzhi |23 | M      |
  |    12 | Wen Qingqing|19 | F      |
  |    13 | Tian Boguang|33 | M      |
  |    15 | Duan Yu       |19 | M      |
  |    16 | Xu Zhu      |21 | M      |
  |    17 | Lin Chong   |25 | M      |
  |    18 | Hua Rong      |23 | M      |
  |    20 | Diao Chan   |19 | F      |
  |    21 | Huang Yueying |22 | F      |
  |    22 | Xiao Qiao   |20 | F      |
  |    23 | Ma Chao       |23 | M      |
  +-------+---------------+-----+--------+
  20 rows in set (0.00 sec)
  MariaDB > SHOW TABLE STATUS LIKE 'stus'\G;
  *************************** 1. row ***************************
  Name: stus
  Engine: NULL
  Version: NULL
  Row_format: NULL
  Rows: NULL
  Avg_row_length: NULL
  Data_length: NULL
  Max_data_length: NULL
  Index_length: NULL
  Data_free: NULL
  Auto_increment: NULL
  Create_time: NULL
  Update_time: NULL
  Check_time: NULL
  Collation: NULL
  Checksum: NULL
  Create_options: NULL
  Comment: VIEW
  1 row in set (0.00 sec)
  ERROR: No query specified
  MariaDB > DROP VIEW stus;、、删除
  Query OK, 0 rows affected (0.00 sec)
  EXPLAIN:
  EXPLAIN SELECT Name,Age FROM students WHERE Name LIKE 's%' or Age > 28\G
  *************************** 1. row ***************************

  >  select_type: SIMPLE
  table: students
  type: index_merge
  possible_keys: Name,Age
  key: Name,Age
  key_len: 152,1
  ref: NULL
  rows: 7
  Extra: Using sort_union(Name,Age); Using where
  MariaDB > SELECT Name FROM students WHERE Age > 25;
  +--------------+
  | Name         |
  +--------------+
  | Xie Yanke    |
  | Ding Dian    |
  | Yu Yutong    |
  | Shi Qing   |
  | Tian Boguang |
  +--------------+
  5 rows in set (0.01 sec)
  MariaDB > EXPLAIN SELECT Name FROM students WHERE Age > 25;
  +------+-------------+----------+------+---------------+------+---------+------+------+-------------+

  |>  +------+-------------+----------+------+---------------+------+---------+------+------+-------------+
  |    1 | SIMPLE      | students | ALL| NULL          | NULL | NULL    | NULL |   20 | Using where |
  +------+-------------+----------+------+---------------+------+---------+------+------+-------------+
  1 row in set (0.07 sec)
  MariaDB > EXPLAIN SELECT Name FROM students WHERE Age > 25\G;
  *************************** 1. row ***************************

  >  select_type: SIMPLE         、、select语句的类型,这里是简单查询
  table: students         、、针对那张表
  type: ALL                。。
  possible_keys: NULL               可能会用到的索引
  key: NULL   用到的索引
  key_len: NULL      用到的索引的长度
  ref: NULL      参考性结果
  rows: 20      行数从多少航中取得
  Extra: Using where
  1 row in set (0.00 sec)
  ERROR: No query specified
  MariaDB >>创建索引
  Query OK, 0 rows affected (0.26 sec)
  Records: 0Duplicates: 0Warnings: 0
  MariaDB > EXPLAIN SELECT Name FROM students WHERE Age > 25\G;
  *************************** 1. row ***************************

  >  select_type: SIMPLE
  table: students
  type: range
  possible_keys: Age
  key: Age
  key_len: 1
  ref: NULL
  rows: 5
  Extra: Using index condition
  1 row in set (0.00 sec)
  ERROR: No query specified

  >  select_type:
  SIMPLE
  PRIMARY
  UNION
  UNION RESULT:UNION的执行结果
  SUBQUERY:
  DERIVED:用于FROM子句中的子查询;
  table:
  查询语句所关系到的表的名字;
  type: 访问到目标记录的方法
  system: 表中仅有一行;
  const: 表中至多有一行匹配;一般只有用于PRIMARY KEY或UNIQUE KEY(NOT NULL)索引时,此种结果才会出现;
  eq_ref: 类似于const,表中至多有一个匹配到的行
  ref:
  fulltext:
  ref_or_null:
  index_merge:
  unique_subquery: 通常出现于IN子查询中
  index_subquery: 类似上一个,
  range: 带有范围限制的索引;
  index: 全索引扫描
  ALL:全表扫描
  Extra:
  using where:
  using index:
  using index for group by:

页: [1]
查看完整版本: Mysql 笔记之SQL语句及查询语句详解