Mysql之select查询

单表查询


语法:

# SELECT  [DISTINCT(去重)]  字段1,字段2... FROM 表名
#     WHERE 条件
#     GROUP BY field  分组
#     HAVING 筛选
#     ORDER BY field  排序
#     LIMIT 限制条数

查询常见用法:

# 创建测试表

# table lol
+----+--------------+--------+------+------------+-----------------+-----------------------------------------------------------+-------+
| id | name         | sex    | age  | date_time  | county          | count_comment                                             | price |
+----+--------------+--------+------+------------+-----------------+-----------------------------------------------------------+-------+
|  1 | 盖伦         | 男     |   25 | 2017-08-09 | 德玛西亚        | 德玛西亚是一个实力雄厚、奉公守法的国家                    |  3150 |
|  2 | 赵信         | 男     |   28 | 2017-10-11 | 德玛西亚        | 德玛西亚是一个实力雄厚、奉公守法的国家                    |  3150 |
|  3 | VN           | 女     |   18 | 2017-10-11 | 德玛西亚        | 德玛西亚是一个实力雄厚、奉公守法的国家                    |  6300 |
|  4 | 嘉文四世     | 男     |   25 | 2017-08-11 | 德玛西亚        | 德玛西亚是一个实力雄厚、奉公守法的国家                    |  4800 |
|  5 | 菲兹         | 无性   |  500 | 2017-03-10 | 德玛西亚        | 德玛西亚是一个实力雄厚、奉公守法的国家                    |  4800 |
|  6 | 金克斯       | 女     |   18 | 2012-12-12 | 祖安            | 祖安是一片庞大的地下城区                                  |  6300 |
|  7 | 布里茨       | 无性   |   99 | 2013-03-10 | 祖安            | 祖安是一片庞大的地下城区                                  |  3150 |
|  8 | 沃里克       | 男     |   25 | 2013-11-11 | 祖安            | 祖安是一片庞大的地下城区                                  |  4180 |
|  9 | 迦娜         | 女     |   18 | 2016-04-08 | 祖安            | 祖安是一片庞大的地下城区                                  |  6300 |
| 10 | 艾克         | 男     |   35 | 2014-04-04 | 祖安            | 祖安是一片庞大的地下城区                                  |  6300 |
| 11 | 凯特琳       | 女     |   18 | 2014-10-09 | 皮尔特沃夫      | 皮尔特沃夫是一座繁荣进步的城市                            |  4180 |
| 12 | 伊泽瑞尔     | 男     |   21 | 2011-11-11 | 皮尔特沃夫      | 皮尔特沃夫是一座繁荣进步的城市                            |  3150 |
| 13 | 杰斯         | 男     |   33 | 2011-07-01 | 皮尔特沃夫      | 皮尔特沃夫是一座繁荣进步的城市                            |  1000 |
| 14 | 蔚           | 女     |   18 | 2011-11-11 | 皮尔特沃夫      | 皮尔特沃夫是一座繁荣进步的城市                            |  4180 |
| 15 | 奥丽安娜     | 无性   |   15 | 2018-01-04 | 皮尔特沃夫      | 皮尔特沃夫是一座繁荣进步的城市                            |  1500 |
| 16 | 伊芙琳       | 女     |   18 | 2015-11-09 | 暗影岛          | 暗影岛的这片土地曾经是环境优美的岛屿                      |  6300 |
| 17 | 蕾奥娜       | 女     |   15 | 2014-10-09 | 巨神峰          | 巨神峰符文大陆的世界之巅                                  |  4800 |
| 18 | 黛安娜       | 女     |   15 | 2014-08-19 | 巨神峰          | 巨神峰符文大陆的世界之巅                                  |  4800 |
| 19 | 潘森         | 男     |   25 | 2017-04-10 | 巨神峰          | 巨神峰符文大陆的世界之巅                                  |  3100 |
| 20 | 阿慈尔       | 男     | 1000 | 2017-03-10 | 恕瑞玛          | 恕瑞玛帝国曾经是一个繁荣昌盛的文明                        |  6300 |
| 21 | 阿木木       | 无性   |  400 | 2017-12-01 | 恕瑞玛          | 恕瑞玛帝国曾经是一个繁荣昌盛的文明                        |  3100 |
| 22 | 艾瑞利亚     | 女     |   25 | 2014-01-01 | 艾欧尼亚        | NULL                                                      |  3000 |
| 23 | 易           | 男     |   45 | 2017-10-11 | 艾欧尼亚        | NULL                                                      |  1500 |
+----+--------------+--------+------+------------+-----------------+-----------------------------------------------------------+-------+

# 创建表 lol
create table lol(
    id int primary key auto_increment,
    name char(6) not null,
    sex enum('', '', '无性'),
    age int,
    date_time date,
    county char(10),
    count_comment char(25),
    price int not null
);


# 插入数据 
insert into lol(name, sex, age, date_time, county, count_comment, price) values
    ('盖伦', '', 25, '2017-08-09', '德玛西亚', '德玛西亚是一个实力雄厚、奉公守法的国家', 3150),
    ('赵信', '', 28, '2017-10-11', '德玛西亚', '德玛西亚是一个实力雄厚、奉公守法的国家', 3150),
    ('VN', '', 18, '2017-10-11', '德玛西亚', '德玛西亚是一个实力雄厚、奉公守法的国家', 6300),
    ('嘉文四世', '', 25, '2017-08-11', '德玛西亚', '德玛西亚是一个实力雄厚、奉公守法的国家', 4800),
    ('菲兹', '无性', 500, '2017-03-10', '德玛西亚', '德玛西亚是一个实力雄厚、奉公守法的国家', 4800),
    ('金克斯', '', 18, '2012-12-12', '祖安', '祖安是一片庞大的地下城区', 6300),
    ('布里茨', '无性', 99, '2013-03-10', '祖安', '祖安是一片庞大的地下城区', 3150),
    ('沃里克', '', 25, '2013-11-11', '祖安', '祖安是一片庞大的地下城区', 4180),
    ('迦娜', '', 18, '2016-04-08', '祖安', '祖安是一片庞大的地下城区', 6300),
    ('艾克', '', 35, '2014-04-04', '祖安', '祖安是一片庞大的地下城区', 6300),
    ('凯特琳', '', 18, '2014-10-09', '皮尔特沃夫', '皮尔特沃夫是一座繁荣进步的城市', 4180),
    ('伊泽瑞尔', '', 21, '2011-11-11', '皮尔特沃夫', '皮尔特沃夫是一座繁荣进步的城市', 3150),
    ('杰斯', '', 33, '2011-07-01', '皮尔特沃夫', '皮尔特沃夫是一座繁荣进步的城市', 1000),
    ('', '', 18, '2011-11-11', '皮尔特沃夫', '皮尔特沃夫是一座繁荣进步的城市', 4180),
    ('奥丽安娜', '无性', 15, '2018-01-04', '皮尔特沃夫', '皮尔特沃夫是一座繁荣进步的城市', 1500),
    ('伊芙琳', '', 18, '2015-11-09', '暗影岛', '暗影岛的这片土地曾经是环境优美的岛屿', 6300),
    ('蕾奥娜', '', 15, '2014-10-09', '巨神峰', '巨神峰符文大陆的世界之巅', 4800),
    ('黛安娜', '', 15, '2014-08-19', '巨神峰', '巨神峰符文大陆的世界之巅', 4800),
    ('潘森', '', 25, '2017-04-10', '巨神峰', '巨神峰符文大陆的世界之巅', 3100),
    ('阿慈尔', '', 1000, '2017-03-10', '恕瑞玛', '恕瑞玛帝国曾经是一个繁荣昌盛的文明', 6300),
    ('阿木木', '无性', 400, '2017-12-01', '恕瑞玛', '恕瑞玛帝国曾经是一个繁荣昌盛的文明', 3100);
    
insert into lol(name, sex, age, date_time, county,price) values
    ('艾瑞利亚', '', 25, '2014-01-01', '艾欧尼亚', 3000),
    ('', '', 45, '2017-10-11', '艾欧尼亚', 1500);
准备工作
mysql> create table lol(
    ->     id int primary key auto_increment,
    ->     name char(6) not null,
    ->     sex enum('', '', '无性'),
    ->     age int,
    ->     date_time date,
    ->     county char(10),
    ->     count_comment char(25),
    ->     price int not null
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> insert into lol(name, sex, age, date_time, county, count_comment, price) values
    ->     ('盖伦', '', 25, '2017-08-09', '德玛西亚', '德玛西亚是一个实力雄厚、奉公守法的国家', 3150),
    ->     ('赵信', '', 28, '2017-10-11', '德玛西亚', '德玛西亚是一个实力雄厚、奉公守法的国家', 3150),
    ->     ('VN', '', 18, '2017-10-11', '德玛西亚', '德玛西亚是一个实力雄厚、奉公守法的国家', 6300),
    ->     ('嘉文四世', '', 25, '2017-08-11', '德玛西亚', '德玛西亚是一个实力雄厚、奉公守法的国家', 4800),
    ->     ('菲兹', '无性', 500, '2017-03-10', '德玛西亚', '德玛西亚是一个实力雄厚、奉公守法的国家', 4800),
    ->     ('金克斯', '', 18, '2012-12-12', '祖安', '祖安是一片庞大的地下城区', 6300),
    ->     ('布里茨', '无性', 99, '2013-03-10', '祖安', '祖安是一片庞大的地下城区', 3150),
    ->     ('沃里克', '', 25, '2013-11-11', '祖安', '祖安是一片庞大的地下城区', 4180),
    ->     ('迦娜', '', 18, '2016-04-08', '祖安', '祖安是一片庞大的地下城区', 6300),
    ->     ('艾克', '', 35, '2014-04-04', '祖安', '祖安是一片庞大的地下城区', 6300),
    ->     ('凯特琳', '', 18, '2014-10-09', '皮尔特沃夫', '皮尔特沃夫是一座繁荣进步的城市', 4180),
    ->     ('伊泽瑞尔', '', 21, '2011-11-11', '皮尔特沃夫', '皮尔特沃夫是一座繁荣进步的城市', 3150),
    ->     ('杰斯', '', 33, '2011-07-01', '皮尔特沃夫', '皮尔特沃夫是一座繁荣进步的城市', 1000),
    ->     ('', '', 18, '2011-11-11', '皮尔特沃夫', '皮尔特沃夫是一座繁荣进步的城市', 4180),
    ->     ('奥丽安娜', '无性', 15, '2018-01-04', '皮尔特沃夫', '皮尔特沃夫是一座繁荣进步的城市', 1500),
    ->     ('伊芙琳', '', 18, '2015-11-09', '暗影岛', '暗影岛的这片土地曾经是环境优美的岛屿', 6300),
    ->     ('蕾奥娜', '', 15, '2014-10-09', '巨神峰', '巨神峰符文大陆的世界之巅', 4800),
    ->     ('黛安娜', '', 15, '2014-08-19', '巨神峰', '巨神峰符文大陆的世界之巅', 4800),
    ->     ('潘森', '', 25, '2017-04-10', '巨神峰', '巨神峰符文大陆的世界之巅', 3100),
    ->     ('阿慈尔', '', 1000, '2017-03-10', '恕瑞玛', '恕瑞玛帝国曾经是一个繁荣昌盛的文明', 6300),
    ->     ('阿木木', '无性', 400, '2017-12-01', '恕瑞玛', '恕瑞玛帝国曾经是一个繁荣昌盛的文明', 3100);
Query OK, 21 rows affected (0.02 sec)
Records: 21  Duplicates: 0  Warnings: 0

mysql> insert into lol(name, sex, age, date_time, county,price) values
    ->     ('艾瑞利亚', '', 25, '2014-01-01', '艾欧尼亚', 3000),
    ->     ('', '', 45, '2017-10-11', '艾欧尼亚', 1500);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from lol;
+----+--------------+--------+------+------------+-----------------+-----------------------------------------------------------+-------+
| id | name         | sex    | age  | date_time  | county          | count_comment                                             | price |
+----+--------------+--------+------+------------+-----------------+-----------------------------------------------------------+-------+
|  1 | 盖伦         | 男     |   25 | 2017-08-09 | 德玛西亚        | 德玛西亚是一个实力雄厚、奉公守法的国家                    |  3150 |
|  2 | 赵信         | 男     |   28 | 2017-10-11 | 德玛西亚        | 德玛西亚是一个实力雄厚、奉公守法的国家                    |  3150 |
|  3 | VN           | 女     |   18 | 2017-10-11 | 德玛西亚        | 德玛西亚是一个实力雄厚、奉公守法的国家                    |  6300 |
|  4 | 嘉文四世     | 男     |   25 | 2017-08-11 | 德玛西亚        | 德玛西亚是一个实力雄厚、奉公守法的国家                    |  4800 |
|  5 | 菲兹         | 无性   |  500 | 2017-03-10 | 德玛西亚        | 德玛西亚是一个实力雄厚、奉公守法的国家                    |  4800 |
|  6 | 金克斯       | 女     |   18 | 2012-12-12 | 祖安            | 祖安是一片庞大的地下城区                                  |  6300 |
|  7 | 布里茨       | 无性   |   99 | 2013-03-10 | 祖安            | 祖安是一片庞大的地下城区                                  |  3150 |
|  8 | 沃里克       | 男     |   25 | 2013-11-11 | 祖安            | 祖安是一片庞大的地下城区                                  |  4180 |
|  9 | 迦娜         | 女     |   18 | 2016-04-08 | 祖安            | 祖安是一片庞大的地下城区                                  |  6300 |
| 10 | 艾克         | 男     |   35 | 2014-04-04 | 祖安            | 祖安是一片庞大的地下城区                                  |  6300 |
| 11 | 凯特琳       | 女     |   18 | 2014-10-09 | 皮尔特沃夫      | 皮尔特沃夫是一座繁荣进步的城市                            |  4180 |
| 12 | 伊泽瑞尔     | 男     |   21 | 2011-11-11 | 皮尔特沃夫      | 皮尔特沃夫是一座繁荣进步的城市                            |  3150 |
| 13 | 杰斯         | 男     |   33 | 2011-07-01 | 皮尔特沃夫      | 皮尔特沃夫是一座繁荣进步的城市                            |  1000 |
| 14 | 蔚           | 女     |   18 | 2011-11-11 | 皮尔特沃夫      | 皮尔特沃夫是一座繁荣进步的城市                            |  4180 |
| 15 | 奥丽安娜     | 无性   |   15 | 2018-01-04 | 皮尔特沃夫      | 皮尔特沃夫是一座繁荣进步的城市                            |  1500 |
| 16 | 伊芙琳       | 女     |   18 | 2015-11-09 | 暗影岛          | 暗影岛的这片土地曾经是环境优美的岛屿                      |  6300 |
| 17 | 蕾奥娜       | 女     |   15 | 2014-10-09 | 巨神峰          | 巨神峰符文大陆的世界之巅                                  |  4800 |
| 18 | 黛安娜       | 女     |   15 | 2014-08-19 | 巨神峰          | 巨神峰符文大陆的世界之巅                                  |  4800 |
| 19 | 潘森         | 男     |   25 | 2017-04-10 | 巨神峰          | 巨神峰符文大陆的世界之巅                                  |  3100 |
| 20 | 阿慈尔       | 男     | 1000 | 2017-03-10 | 恕瑞玛          | 恕瑞玛帝国曾经是一个繁荣昌盛的文明                        |  6300 |
| 21 | 阿木木       | 无性   |  400 | 2017-12-01 | 恕瑞玛          | 恕瑞玛帝国曾经是一个繁荣昌盛的文明                        |  3100 |
| 22 | 艾瑞利亚     | 女     |   25 | 2014-01-01 | 艾欧尼亚        | NULL                                                      |  3000 |
| 23 | 易           | 男     |   45 | 2017-10-11 | 艾欧尼亚        | NULL                                                      |  1500 |
+----+--------------+--------+------+------------+-----------------+-----------------------------------------------------------+-------+
23 rows in set (0.00 sec)
步骤
# 简单查询 
mysql> select id,name,sex from lol;   # 字段显示
+----+--------------+--------+
| id | name         | sex    |
+----+--------------+--------+
|  1 | 盖伦         | 男     |
|  2 | 赵信         | 男     |
|  3 | VN           | 女     |
|  4 | 嘉文四世     | 男     |
|  5 | 菲兹         | 无性   |
|  6 | 金克斯       | 女     |
|  7 | 布里茨       | 无性   |
|  8 | 沃里克       | 男     |
|  9 | 迦娜         | 女     |
| 10 | 艾克         | 男     |
| 11 | 凯特琳       | 女     |
| 12 | 伊泽瑞尔     | 男     |
| 13 | 杰斯         | 男     |
| 14 | 蔚           | 女     |
| 15 | 奥丽安娜     | 无性   |
| 16 | 伊芙琳       | 女     |
| 17 | 蕾奥娜       | 女     |
| 18 | 黛安娜       | 女     |
| 19 | 潘森         | 男     |
| 20 | 阿慈尔       | 男     |
| 21 | 阿木木       | 无性   |
| 22 | 艾瑞利亚     | 女     |
| 23 | 易           | 男     |
+----+--------------+--------+
23 rows in set (0.00 sec)

mysql> select * from lol;   # 2. * 所有字段都显示
+----+--------------+--------+------+------------+-----------------+-----------------------------------------------------------+-------+
| id | name         | sex    | age  | date_time  | county          | count_comment                                             | price |
+----+--------------+--------+------+------------+-----------------+-----------------------------------------------------------+-------+
|  1 | 盖伦         | 男     |   25 | 2017-08-09 | 德玛西亚        | 德玛西亚是一个实力雄厚、奉公守法的国家                    |  3150 |
|  2 | 赵信         | 男     |   28 | 2017-10-11 | 德玛西亚        | 德玛西亚是一个实力雄厚、奉公守法的国家                    |  3150 |
|  3 | VN           | 女     |   18 | 2017-10-11 | 德玛西亚        | 德玛西亚是一个实力雄厚、奉公守法的国家                    |  6300 |
|  4 | 嘉文四世     | 男     |   25 | 2017-08-11 | 德玛西亚        | 德玛西亚是一个实力雄厚、奉公守法的国家                    |  4800 |
|  5 | 菲兹         | 无性   |  500 | 2017-03-10 | 德玛西亚        | 德玛西亚是一个实力雄厚、奉公守法的国家                    |  4800 |
|  6 | 金克斯       | 女     |   18 | 2012-12-12 | 祖安            | 祖安是一片庞大的地下。。。

# disinct 去重
mysql> select distinct county from lol; 
+-----------------+
| county          |
+-----------------+
| 德玛西亚        |
| 祖安            |
| 皮尔特沃夫      |
| 暗影岛          |
| 巨神峰          |
| 恕瑞玛          |
| 艾欧尼亚        |
+-----------------+
7 rows in set (0.00 sec)

# 四则运算用法 * / + -
mysql> select name, price*2 from lol; 
+--------------+---------+
| name         | price*2 |
+--------------+---------+
| 盖伦         |    6300 |
| 赵信         |    6300 |
| VN           |   12600 |
| 嘉文四世     |    9600 |
| 菲兹         |    9600 |
| 金克斯       |   12600 |
| 布里茨       |    6300 |
| 沃里克       |    8360 |
| 迦娜         |   12600 |
| 艾克         |   12600 |
| 凯特琳       |    8360 |
| 伊泽瑞尔     |    6300 |
| 杰斯         |    2000 |
| 蔚           |    8360 |
| 奥丽安娜     |    3000 |

#定义显示格式
CONCAT() 函数用于连接字符串
CONCAT_WS() 第一个参数为分隔符

mysql> select concat('名字:', name,'     ','国家: ',county) from lol;
+---------------------------------------------------+
| concat('名字:', name,'     ','国家: ',county)     |
+---------------------------------------------------+
| 名字:盖伦     国家: 德玛西亚                      |
| 名字:赵信     国家: 德玛西亚                      |
| 名字:VN     国家: 德玛西亚                        |
| 名字:嘉文四世     国家: 德玛西亚                  |
| 名字:菲兹     国家: 德玛西亚                      |
| 名字:金克斯     国家: 祖安                        |
| 名字:布里茨     国家: 祖安                        |
| 名字:沃里克     国家: 祖安                        |
| 名字:迦娜     国家: 祖安                          |
| 名字:艾克     国家: 祖安                          |
| 名字:凯特琳     国家: 皮尔特沃夫                  |
| 名字:伊泽瑞尔     国家: 皮尔特沃夫                |
| 名字:杰斯     国家: 皮尔特沃夫                    |
| 名字:蔚     国家: 皮尔特沃夫                      |
| 名字:奥丽安娜     国家: 皮尔特沃夫                |
| 名字:伊芙琳     国家: 暗影岛                      |
| 名字:蕾奥娜     国家: 巨神峰                      |
| 名字:黛安娜     国家: 巨神峰                      |
| 名字:潘森     国家: 巨神峰                        |
| 名字:阿慈尔     国家: 恕瑞玛                      |
| 名字:阿木木     国家: 恕瑞玛                      |
| 名字:艾瑞利亚     国家: 艾欧尼亚                  |
| 名字:易     国家: 艾欧尼亚                        |
+---------------------------------------------------+
23 rows in set (0.00 sec)

mysql> select concat_ws(':', name,county) from lol;
+------------------------------+
| concat_ws(':', name,county)  |
+------------------------------+
| 盖伦:德玛西亚                |
| 赵信:德玛西亚                |
| VN:德玛西亚                  |
| 嘉文四世:德玛西亚            |
| 菲兹:德玛西亚                |
| 金克斯:祖安                  |
| 布里茨:祖安                  |
| 沃里克:祖安                  |
| 迦娜:祖安                    |
| 艾克:祖安                    |
| 凯特琳:皮尔特沃夫            |
| 伊泽瑞尔:皮尔特沃夫          |
| 杰斯:皮尔特沃夫              |
| 蔚:皮尔特沃夫                |
| 奥丽安娜:皮尔特沃夫          |
| 伊芙琳:暗影岛                |
| 蕾奥娜:巨神峰                |
| 黛安娜:巨神峰                |
| 潘森:巨神峰                  |
| 阿慈尔:恕瑞玛                |
| 阿木木:恕瑞玛                |
| 艾瑞利亚:艾欧尼亚            |
| 易:艾欧尼亚                  |
+------------------------------+
23 rows in set (0.00 sec)

# 别名 as
mysql> select name 名字, county 国家 from lol;
+--------------+-----------------+
| 名字 | 国家 |
+--------------+-----------------+
| 盖伦 | 德玛西亚 |
| 赵信 | 德玛西亚 |
| VN | 德玛西亚 |
| 嘉文四世 | 德玛西亚 |
| 菲兹 | 德玛西亚 |
| 金克斯 | 祖安 |
| 布里茨 | 祖安 |
| 沃里克 | 祖安 |
| 迦娜 | 祖安 |
| 艾克 | 祖安 |
| 凯特琳 | 皮尔特沃夫 |
| 伊泽瑞尔 | 皮尔特沃夫 |
| 杰斯 | 皮尔特沃夫 |
| 蔚 | 皮尔特沃夫 |
| 奥丽安娜 | 皮尔特沃夫 |
| 伊芙琳 | 暗影岛 |
| 蕾奥娜 | 巨神峰 |
| 黛安娜 | 巨神峰 |
| 潘森 | 巨神峰 |
| 阿慈尔 | 恕瑞玛 |
| 阿木木 | 恕瑞玛 |
| 艾瑞利亚 | 艾欧尼亚 |
| 易 | 艾欧尼亚 |
+--------------+-----------------+
23 rows in set (0.00 sec)

mysql> select name as 名字, county as 国家 from lol;
+--------------+-----------------+
| 名字 | 国家 |
+--------------+-----------------+
| 盖伦 | 德玛西亚 |
| 赵信 | 德玛西亚 |
| VN | 德玛西亚 |
| 嘉文四世 | 德玛西亚 |
| 菲兹 | 德玛西亚 |
| 金克斯 | 祖安 |
| 布里茨 | 祖安 |
| 沃里克 | 祖安 |
| 迦娜 | 祖安 |
| 艾克 | 祖安 |
| 凯特琳 | 皮尔特沃夫 |
| 伊泽瑞尔 | 皮尔特沃夫 |
| 杰斯 | 皮尔特沃夫 |
| 蔚 | 皮尔特沃夫 |
| 奥丽安娜 | 皮尔特沃夫 |
| 伊芙琳 | 暗影岛 |
| 蕾奥娜 | 巨神峰 |
| 黛安娜 | 巨神峰 |
| 潘森 | 巨神峰 |
| 阿慈尔 | 恕瑞玛 |
| 阿木木 | 恕瑞玛 |
| 艾瑞利亚 | 艾欧尼亚 |
| 易 | 艾欧尼亚 |
+--------------+-----------------+
23 rows in set (0.00 sec)

where 约束:

where字句中可以使用:

1. 比较运算符:> < >= <= <> !=
2. between 80 and 100 值在10到20之间
3. in(80,90,100) 值是10或20或30
4. like 'egon%'
    pattern可以是%或_,
    %表示任意多字符
    _表示一个字符 
5. 逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not

# 1. 单条件查询
mysql> select name from lol where id=1;
+--------+
| name   |
+--------+
| 盖伦   |
+--------+
1 row in set (0.00 sec)

# 多条件查询 and or not
mysql> select name,age from lol where price=6300 and age=18;
+-----------+------+
| name      | age  |
+-----------+------+
| VN        |   18 |
| 金克斯    |   18 |
| 迦娜      |   18 |
| 伊芙琳    |   18 |
+-----------+------+
4 rows in set (0.00 sec)

mysql> select name,age from lol where price=6300 or age=18;
+-----------+------+
| name      | age  |
+-----------+------+
| VN        |   18 |
| 金克斯    |   18 |
| 迦娜      |   18 |
| 艾克      |   35 |
| 凯特琳    |   18 |
| 蔚        |   18 |
| 伊芙琳    |   18 |
| 阿慈尔    | 1000 |
+-----------+------+
8 rows in set (0.00 sec)

mysql> select name,count_comment from lol where not count_comment is null;
+--------------+-----------------------------------------------------------+
| name         | count_comment                                             |
+--------------+-----------------------------------------------------------+
| 盖伦         | 德玛西亚是一个实力雄厚、奉公守法的国家                    |
| 赵信         | 德玛西亚是一个实力雄厚、奉公守法的国家                    |
| VN           | 德玛西亚是一个实力雄厚、奉公守法的国家                    |
| 嘉文四世     | 德玛西亚是一个实力雄厚、奉公守法的国家                    |
| 菲兹         | 德玛西亚是一个实力雄厚、奉公守法的国家                    |
| 金克斯       | 祖安是一片庞大的地下城区                                  |
| 布里茨       | 祖安是一片庞大的地下城区                                  |
| 沃里克       | 祖安是一片庞大的地下城区                                  |
| 迦娜         | 祖安是一片庞大的地下城区                                  |
| 艾克         | 祖安是一片庞大的地下城区                                  |
| 凯特琳       | 皮尔特沃夫是一座繁荣进步的城市                            |
| 伊泽瑞尔     | 皮尔特沃夫是一座繁荣进步的城市                            |
| 杰斯         | 皮尔特沃夫是一座繁荣进步的城市                            |
| 蔚           | 皮尔特沃夫是一座繁荣进步的城市                            |
| 奥丽安娜     | 皮尔特沃夫是一座繁荣进步的城市                            |
| 伊芙琳       | 暗影岛的这片土地曾经是环境优美的岛屿                      |
| 蕾奥娜       | 巨神峰符文大陆的世界之巅                                  |
| 黛安娜       | 巨神峰符文大陆的世界之巅                                  |
| 潘森         | 巨神峰符文大陆的世界之巅                                  |
| 阿慈尔       | 恕瑞玛帝国曾经是一个繁荣昌盛的文明                        |
| 阿木木       | 恕瑞玛帝国曾经是一个繁荣昌盛的文明                        |
+--------------+-----------------------------------------------------------+
21 rows in set (0.00 sec)

# 关键字 between and 
mysql> select name,price from lol where price between 4800 and 6300;
+--------------+-------+
| name         | price |
+--------------+-------+
| VN           |  6300 |
| 嘉文四世     |  4800 |
| 菲兹         |  4800 |
| 金克斯       |  6300 |
| 迦娜         |  6300 |
| 艾克         |  6300 |
| 伊芙琳       |  6300 |
| 蕾奥娜       |  4800 |
| 黛安娜       |  4800 |
| 阿慈尔       |  6300 |
+--------------+-------+
10 rows in set (0.00 sec)

# 关键字 is null (判断某个字段是否为NULL不能用等号,需要用IS)
mysql> select name,count_comment from lol where count_comment='';   # 用这种方式并不能判断字段内容是否为空
Empty set (0.00 sec)

mysql> select name,count_comment from lol where count_comment is null;
+--------------+---------------+
| name         | count_comment |
+--------------+---------------+
| 艾瑞利亚     | NULL          |
| 易           | NULL          |
+--------------+---------------+
2 rows in set (0.00 sec)

# 关键字 in 集合查询
mysql> select name,date_time from lol where date_time in
    -> ('2017-10-11', '2014-10-09', '2012-12-12');
+-----------+------------+
| name      | date_time  |
+-----------+------------+
| 赵信      | 2017-10-11 |
| VN        | 2017-10-11 |
| 金克斯    | 2012-12-12 |
| 凯特琳    | 2014-10-09 |
| 蕾奥娜    | 2014-10-09 |
| 易        | 2017-10-11 |
+-----------+------------+
6 rows in set (0.00 sec)

# 关键字like 模糊查询 %(任意所有字符)   _(任意一个字符)
mysql> select * from lol where name like '金%';
+----+-----------+------+------+------------+--------+--------------------------------------+-------+
| id | name      | sex  | age  | date_time  | county | count_comment                        | price |
+----+-----------+------+------+------------+--------+--------------------------------------+-------+
|  6 | 金克斯    | 女   |   18 | 2012-12-12 | 祖安   | 祖安是一片庞大的地下城区             |  6300 |
+----+-----------+------+------+------------+--------+--------------------------------------+-------+
1 row in set (0.00 sec)

mysql> select * from lol where name like '金克_';
+----+-----------+------+------+------------+--------+--------------------------------------+-------+
| id | name      | sex  | age  | date_time  | county | count_comment                        | price |
+----+-----------+------+------+------------+--------+--------------------------------------+-------+
|  6 | 金克斯    | 女   |   18 | 2012-12-12 | 祖安   | 祖安是一片庞大的地下城区             |  6300 |
+----+-----------+------+------+------------+--------+--------------------------------------+-------+
1 row in set (0.00 sec)

mysql> select * from lol where name like '___';
+----+-----------+--------+------+------------+-----------------+--------------------------------------------------------+-------+
| id | name      | sex    | age  | date_time  | county          | count_comment                                          | price |
+----+-----------+--------+------+------------+-----------------+--------------------------------------------------------+-------+
|  6 | 金克斯    | 女     |   18 | 2012-12-12 | 祖安            | 祖安是一片庞大的地下城区                               |  6300 |
|  7 | 布里茨    | 无性   |   99 | 2013-03-10 | 祖安            | 祖安是一片庞大的地下城区                               |  3150 |
|  8 | 沃里克    | 男     |   25 | 2013-11-11 | 祖安            | 祖安是一片庞大的地下城区                               |  4180 |
| 11 | 凯特琳    | 女     |   18 | 2014-10-09 | 皮尔特沃夫      | 皮尔特沃夫是一座繁荣进步的城市                         |  4180 |
| 16 | 伊芙琳    | 女     |   18 | 2015-11-09 | 暗影岛          | 暗影岛的这片土地曾经是环境优美的岛屿                   |  6300 |
| 17 | 蕾奥娜    | 女     |   15 | 2014-10-09 | 巨神峰          | 巨神峰符文大陆的世界之巅                               |  4800 |
| 18 | 黛安娜    | 女     |   15 | 2014-08-19 | 巨神峰          | 巨神峰符文大陆的世界之巅                               |  4800 |
| 20 | 阿慈尔    | 男     | 1000 | 2017-03-10 | 恕瑞玛          | 恕瑞玛帝国曾经是一个繁荣昌盛的文明                     |  6300 |
| 21 | 阿木木    | 无性   |  400 | 2017-12-01 | 恕瑞玛          | 恕瑞玛帝国曾经是一个繁荣昌盛的文明                     |  3100 |
+----+-----------+--------+------+------------+-----------------+--------------------------------------------------------+-------+
9 rows in set (0.00 sec)

group by 分组查询:

#1、首先明确一点:分组发生在where之后,即分组是基于where之后得到的记录而进行的

#2、分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等

#3.  可以按照任意字段分组,但是分组完毕后,比如group by post,只能查看post字段,如果想查看组内信息,需要借助于聚合函数
#查看MySQL 5.7默认的sql_mode如下:
mysql> select @@global.sql_mode;
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

#!!!注意
ONLY_FULL_GROUP_BY的语义就是确定select target list中的所有列的值都是明确语义,简单的说来,在ONLY_FULL_GROUP_BY模式下,target list中的值要么是来自于聚集函数的结果,要么是来自于group by list中的表达式的值。


#设置sql_mole如下操作(我们可以去掉ONLY_FULL_GROUP_BY模式):
mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
!!!SQL_MODE设置!!!
# 使用 group by

mysql> select county from lol group by county;
+-----------------+
| county          |
+-----------------+
| 巨神峰          |
| 德玛西亚        |
| 恕瑞玛          |
| 暗影岛          |
| 皮尔特沃夫      |
| 祖安            |
| 艾欧尼亚        |
+-----------------+
7 rows in set (0.00 sec)

mysql> select county,name from lol group by county;
+-----------------+--------------+
| county          | name         |
+-----------------+--------------+
| 巨神峰          | 蕾奥娜       |
| 德玛西亚        | 盖伦         |
| 恕瑞玛          | 阿慈尔       |
| 暗影岛          | 伊芙琳       |
| 皮尔特沃夫      | 凯特琳       |
| 祖安            | 金克斯       |
| 艾欧尼亚        | 艾瑞利亚     |
+-----------------+--------------+
7 rows in set (0.00 sec)
# 如上 你会发现 name字段显示有问题,默认都是组内的第一条记录,但其实这是没有意义的 可以用sql_mode 设置为严格模式,再使用这种查法就会报错
#强调:聚合函数聚合的是组的内容,若是没有分组,则默认一组

# count(), max(), min(), avg(), sum(),  group_concat()

# count()
mysql> select county,count(id) from lol group by county;
+-----------------+-----------+
| county          | count(id) |
+-----------------+-----------+
| 巨神峰          |         3 |
| 德玛西亚        |         5 |
| 恕瑞玛          |         2 |
| 暗影岛          |         1 |
| 皮尔特沃夫      |         5 |
| 祖安            |         5 |
| 艾欧尼亚        |         2 |
+-----------------+-----------+
7 rows in set (0.00 sec)

# max()
mysql> select county,max(price) from lol group by county;
+-----------------+------------+
| county          | max(price) |
+-----------------+------------+
| 巨神峰          |       4800 |
| 德玛西亚        |       6300 |
| 恕瑞玛          |       6300 |
| 暗影岛          |       6300 |
| 皮尔特沃夫      |       4180 |
| 祖安            |       6300 |
| 艾欧尼亚        |       3000 |
+-----------------+------------+
7 rows in set (0.00 sec)

# min()
mysql> select county,min(price) from lol group by county;
+-----------------+------------+
| county          | min(price) |
+-----------------+------------+
| 巨神峰          |       3100 |
| 德玛西亚        |       3150 |
| 恕瑞玛          |       3100 |
| 暗影岛          |       6300 |
| 皮尔特沃夫      |       1000 |
| 祖安            |       3150 |
| 艾欧尼亚        |       1500 |
+-----------------+------------+
7 rows in set (0.00 sec)

# avg()
mysql> select county,avg(price) from lol group by county;
+-----------------+------------+
| county          | avg(price) |
+-----------------+------------+
| 巨神峰          |  4233.3333 |
| 德玛西亚        |  4440.0000 |
| 恕瑞玛          |  4700.0000 |
| 暗影岛          |  6300.0000 |
| 皮尔特沃夫      |  2802.0000 |
| 祖安            |  5246.0000 |
| 艾欧尼亚        |  2250.0000 |
+-----------------+------------+
7 rows in set (0.00 sec)

# sum()
mysql> select county,sum(price) from lol group by county;
+-----------------+------------+
| county          | sum(price) |
+-----------------+------------+
| 巨神峰          |      12700 |
| 德玛西亚        |      22200 |
| 恕瑞玛          |       9400 |
| 暗影岛          |       6300 |
| 皮尔特沃夫      |      14010 |
| 祖安            |      26230 |
| 艾欧尼亚        |       4500 |
+-----------------+------------+
7 rows in set (0.00 sec)

# group_concat()
mysql> select county,group_concat(name) from lol group by county;
+-----------------+------------------------------------------------+
| county          | group_concat(name)                             |
+-----------------+------------------------------------------------+
| 巨神峰          | 蕾奥娜,黛安娜,潘森                             |
| 德玛西亚        | 盖伦,赵信,VN,嘉文四世,菲兹                     |
| 恕瑞玛          | 阿慈尔,阿木木                                  |
| 暗影岛          | 伊芙琳                                         |
| 皮尔特沃夫      | 奥丽安娜,蔚,杰斯,伊泽瑞尔,凯特琳               |
| 祖安            | 金克斯,布里茨,沃里克,迦娜,艾克                 |
| 艾欧尼亚        | 艾瑞利亚,易                                    |
+-----------------+------------------------------------------------+
7 rows in set (0.00 sec)
聚合函数

having 过滤:

# having 与 where区别

# 1. where 执行优先级在 group by 之前, having在group by 之后
# 2. 因为having发生在分组之后,所以只能使用聚合函数
mysql> select county,max(price) from lol group by county having max(price)=6300;
+--------------+------------+
| county       | max(price) |
+--------------+------------+
| 德玛西亚     |       6300 |
| 恕瑞玛       |       6300 |
| 暗影岛       |       6300 |
| 祖安         |       6300 |
+--------------+------------+
4 rows in set (0.00 sec)

mysql> select county,max(price) from lol group by county having price=6300;  
ERROR 1054 (42S22): Unknown column 'price' in 'having clause'
# 如上可以看出 如果不使用聚合函数的话 ,会报错
实例

distinct 去重:

# 注意
# 1. 执行到distinct这个关键字时,意味着字段信息已经找到, 并且生成了虚拟表
# 2. 优先级比distinct低的关键字只能按照这个虚拟表在做规则。
mysql> select distinct county as 国家 from lol;
+-----------------+
| 国家            |
+-----------------+
| 德玛西亚        |
| 祖安            |
| 皮尔特沃夫      |
| 暗影岛          |
| 巨神峰          |
| 恕瑞玛          |
| 艾欧尼亚        |
+-----------------+
7 rows in set (0.00 sec)

# 验证
mysql> select distinct county as 国家 from lol order by 国家 asc;
+-----------------+
| 国家            |
+-----------------+
| 巨神峰          |
| 德玛西亚        |
| 恕瑞玛          |
| 暗影岛          |
| 皮尔特沃夫      |
| 祖安            |
| 艾欧尼亚        |
+-----------------+
7 rows in set (0.00 sec)
# 如上 , order by可以用国家进行排序,就证明order by 发生在distinct之后
实例

order by 查询排序:

# asc(升序) desc (降序)
mysql> select id,name from lol order by id asc;
+----+--------------+
| id | name         |
+----+--------------+
|  1 | 盖伦         |
|  2 | 赵信         |
|  3 | VN           |
|  4 | 嘉文四世     |
|  5 | 菲兹         |
|  6 | 金克斯       |
|  7 | 布里茨       |
|  8 | 沃里克       |
|  9 | 迦娜         |
....
mysql> select id,name from lol order by id; # 默认是升序
+----+--------------+
| id | name         |
+----+--------------+
|  1 | 盖伦         |
|  2 | 赵信         |
|  3 | VN           |
|  4 | 嘉文四世     |
|  5 | 菲兹         |
|  6 | 金克斯       |
|  7 | 布里茨       |
|  8 | 沃里克       |
|  9 | 迦娜         |
| 10 | 艾克         |
| 11 | 凯特琳       |
| 12 | 伊泽瑞尔     |
...
mysql> select id,name from lol order by id desc;
+----+--------------+
| id | name         |
+----+--------------+
| 23 | 易           |
| 22 | 艾瑞利亚     |
| 21 | 阿木木       |
| 20 | 阿慈尔       |
| 19 | 潘森         |
| 18 | 黛安娜       |
| 17 | 蕾奥娜       |
| 16 | 伊芙琳       |
| 15 | 奥丽安娜     |
| 14 | 蔚           |
| 13 | 杰斯         |
| 12 | 伊泽瑞尔     |
| 11 | 凯特琳       |
| 10 | 艾克         |
|  9 | 迦娜         |
...

# 多列查询
# 先按照 age进行升序,如果age相同按照price进行升序,如果price相同按照name进行降序
mysql> select name,age,price from lol order by age, price, name desc;
+--------------+------+-------+
| name         | age  | price |
+--------------+------+-------+
| 奥丽安娜     |   15 |  1500 |
| 黛安娜       |   15 |  4800 |
| 蕾奥娜       |   15 |  4800 |
| 蔚           |   18 |  4180 |
| 凯特琳       |   18 |  4180 |
| 金克斯       |   18 |  6300 |
| 迦娜         |   18 |  6300 |
| 伊芙琳       |   18 |  6300 |
| VN           |   18 |  6300 |
| 伊泽瑞尔     |   21 |  3150 |
| 艾瑞利亚     |   25 |  3000 |
...

limit 限制查询的记录数:

# 示例
mysql> select name,county from lol limit 3;
+--------+--------------+
| name   | county       |
+--------+--------------+
| 盖伦   | 德玛西亚     |
| 赵信   | 德玛西亚     |
| VN     | 德玛西亚     |
+--------+--------------+
3 rows in set (0.00 sec)

# 设置 起始路径与步长
# select 字段 from 表名 limit 起始 步长
mysql> select id,name,county from lol limit 0, 3;
+----+--------+--------------+
| id | name   | county       |
+----+--------+--------------+
|  1 | 盖伦   | 德玛西亚     |
|  2 | 赵信   | 德玛西亚     |
|  3 | VN     | 德玛西亚     |
+----+--------+--------------+
3 rows in set (0.00 sec)

mysql> select id,name,county from lol limit 3, 3;
+----+--------------+--------------+
| id | name         | county       |
+----+--------------+--------------+
|  4 | 嘉文四世     | 德玛西亚     |
|  5 | 菲兹         | 德玛西亚     |
|  6 | 金克斯       | 祖安         |
+----+--------------+--------------+
3 rows in set (0.00 sec)

mysql> select id,name,county from lol limit 6, 3;
+----+-----------+--------+
| id | name      | county |
+----+-----------+--------+
|  7 | 布里茨    | 祖安   |
|  8 | 沃里克    | 祖安   |
|  9 | 迦娜      | 祖安   |
+----+-----------+--------+
3 rows in set (0.00 sec)

regexp正则方式查询:

mysql> select id,name,county from lol where name regexp '^金';
+----+-----------+--------+
| id | name      | county |
+----+-----------+--------+
|  6 | 金克斯    | 祖安   |
+----+-----------+--------+
1 row in set (0.00 sec)

mysql> select id,name,county from lol where county regexp '亚$';
+----+--------------+--------------+
| id | name         | county       |
+----+--------------+--------------+
|  1 | 盖伦         | 德玛西亚     |
|  2 | 赵信         | 德玛西亚     |
|  3 | VN           | 德玛西亚     |
|  4 | 嘉文四世     | 德玛西亚     |
|  5 | 菲兹         | 德玛西亚     |
| 22 | 艾瑞利亚     | 艾欧尼亚     |
| 23 | 易           | 艾欧尼亚     |
+----+--------------+--------------+
7 rows in set (0.00 sec)

mysql> select name,date_time from lol where date_time regexp '1{2}';
+--------------+------------+
| name         | date_time  |
+--------------+------------+
| 赵信         | 2017-10-11 |
| VN           | 2017-10-11 |
| 嘉文四世     | 2017-08-11 |
| 沃里克       | 2013-11-11 |
| 伊泽瑞尔     | 2011-11-11 |
| 杰斯         | 2011-07-01 |
| 蔚           | 2011-11-11 |
| 伊芙琳       | 2015-11-09 |
| 易           | 2017-10-11 |
+--------------+------------+
9 rows in set (0.00 sec)
# 对字符串匹配的方式

# 1. where name = 'xxx'  
# 2. where name like 'xxx'  (%/_)
# 3. where name regexp 'xxx'

关键字的执行优先级:

  from -> where -> group by -> having -> distinct -> order by -> limit

多表查询


#建表
create table department(
id int,
name varchar(20) 
);

create table employee(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int
);

#插入数据
insert into department values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营');

insert into employee(name,sex,age,dep_id) values
('egon','male',18,200),
('alex','female',48,201),
('wupeiqi','male',38,201),
('yuanhao','female',28,202),
('liwenzhou','male',18,200),
('jingliyang','female',18,204)
;


#查看表结构和数据
mysql> desc department;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+

mysql> desc employee;
+--------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-----------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
| sex | enum('male','female') | NO | | male | |
| age | int(11) | YES | | NULL | |
| dep_id | int(11) | YES | | NULL | |
+--------+-----------------------+------+-----+---------+----------------+

mysql> select * from department;
+------+--------------+
| id | name |
+------+--------------+
| 200 | 技术 |
| 201 | 人力资源 |
| 202 | 销售 |
| 203 | 运营 |
+------+--------------+

mysql> select * from employee;
+----+------------+--------+------+--------+
| id | name | sex | age | dep_id |
+----+------------+--------+------+--------+
| 1 | egon | male | 18 | 200 |
| 2 | alex | female | 48 | 201 |
| 3 | wupeiqi | male | 38 | 201 |
| 4 | yuanhao | female | 28 | 202 |
| 5 | liwenzhou | male | 18 | 200 |
| 6 | jingliyang | female | 18 | 204 |
+----+------------+--------+------+--------+
准备工作

多表连接查询

#重点:外链接语法

SELECT 字段列表
    FROM 表1 INNER|LEFT|RIGHT JOIN 表2
    ON 表1.字段 = 表2.字段;


# INNER 内链接 只连接匹配的行
# LEFT 左连接 优先显示左表全部记录
# RIGHT 右连接 优先显示右表全部记录

交叉连接(不适合任何匹配条件, 生成笛卡儿积)

mysql> select * from employee,department;
+----+------------+--------+------+--------+------+--------------+
| id | name       | sex    | age  | dep_id | id   | name         |
+----+------------+--------+------+--------+------+--------------+
|  1 | egon       | male   |   18 |    200 |  200 | 技术         |
|  1 | egon       | male   |   18 |    200 |  201 | 人力资源     |
|  1 | egon       | male   |   18 |    200 |  202 | 销售         |
|  1 | egon       | male   |   18 |    200 |  203 | 运营         |
|  2 | alex       | female |   48 |    201 |  200 | 技术         |
|  2 | alex       | female |   48 |    201 |  201 | 人力资源     |
|  2 | alex       | female |   48 |    201 |  202 | 销售         |
|  2 | alex       | female |   48 |    201 |  203 | 运营         |
|  3 | wupeiqi    | male   |   38 |    201 |  200 | 技术         |
|  3 | wupeiqi    | male   |   38 |    201 |  201 | 人力资源     |
|  3 | wupeiqi    | male   |   38 |    201 |  202 | 销售         |
|  3 | wupeiqi    | male   |   38 |    201 |  203 | 运营         |
|  4 | yuanhao    | female |   28 |    202 |  200 | 技术         |
|  4 | yuanhao    | female |   28 |    202 |  201 | 人力资源     |
|  4 | yuanhao    | female |   28 |    202 |  202 | 销售         |
|  4 | yuanhao    | female |   28 |    202 |  203 | 运营         |
|  5 | liwenzhou  | male   |   18 |    200 |  200 | 技术         |
|  5 | liwenzhou  | male   |   18 |    200 |  201 | 人力资源     |
|  5 | liwenzhou  | male   |   18 |    200 |  202 | 销售         |
|  5 | liwenzhou  | male   |   18 |    200 |  203 | 运营         |
|  6 | jingliyang | female |   18 |    204 |  200 | 技术         |
|  6 | jingliyang | female |   18 |    204 |  201 | 人力资源     |
|  6 | jingliyang | female |   18 |    204 |  202 | 销售         |
|  6 | jingliyang | female |   18 |    204 |  203 | 运营         |
+----+------------+--------+------+--------+------+--------------+
View Code

内连接(INNER JOIN)

#找两张表共有的部分,相当于利用条件从笛卡尔积结果中筛选出了正确的结果
#department没有204这个部门,因而employee表中关于204这条员工信息没有匹配出来
mysql> select employee.id,employee.name,employee.age,employee.sex,department.name from employee inner join department on employee.dep_id=department.id; 
+----+-----------+------+--------+--------------+
| id | name      | age  | sex    | name         |
+----+-----------+------+--------+--------------+
|  1 | egon      |   18 | male   | 技术         |
|  2 | alex      |   48 | female | 人力资源     |
|  3 | wupeiqi   |   38 | male   | 人力资源     |
|  4 | yuanhao   |   28 | female | 销售         |
|  5 | liwenzhou |   18 | male   | 技术         |
+----+-----------+------+--------+--------------+

#上述sql等同于
mysql> select employee.id,employee.name,employee.age,employee.sex,department.name from employee,department where employee.dep_id=department.id;
View Code

外连接->左连接(LEFT JOIN)

#以左表为准,即找出所有员工信息,当然包括没有部门的员工
#本质就是:在内连接的基础上增加左边有右边没有的结果
mysql> select employee.id,employee.name,department.name as depart_name from employee left join department on employee.dep_id=department.id;
+----+------------+--------------+
| id | name       | depart_name  |
+----+------------+--------------+
|  1 | egon       | 技术         |
|  5 | liwenzhou  | 技术         |
|  2 | alex       | 人力资源     |
|  3 | wupeiqi    | 人力资源     |
|  4 | yuanhao    | 销售         |
|  6 | jingliyang | NULL         |
+----+------------+--------------+
View Code

外连接->右连接(RIGHT JOIN)

#以右表为准,即找出所有部门信息,包括没有员工的部门
#本质就是:在内连接的基础上增加右边有左边没有的结果
mysql> select employee.id,employee.name,department.name as depart_name from employee right join department on employee.dep_id=department.id;
+------+-----------+--------------+
| id   | name      | depart_name  |
+------+-----------+--------------+
|    1 | egon      | 技术         |
|    2 | alex      | 人力资源     |
|    3 | wupeiqi   | 人力资源     |
|    4 | yuanhao   | 销售         |
|    5 | liwenzhou | 技术         |
| NULL | NULL      | 运营         |
+------+-----------+--------------+
View Code

全外连接(UNION)

全外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果
#注意:mysql不支持全外连接 full JOIN
#强调:mysql可以使用此种方式间接实现全外连接
select * from employee left join department on employee.dep_id = department.id
union
select * from employee right join department on employee.dep_id = department.id
;
#查看结果
+------+------------+--------+------+--------+------+--------------+
| id   | name       | sex    | age  | dep_id | id   | name         |
+------+------------+--------+------+--------+------+--------------+
|    1 | egon       | male   |   18 |    200 |  200 | 技术         |
|    5 | liwenzhou  | male   |   18 |    200 |  200 | 技术         |
|    2 | alex       | female |   48 |    201 |  201 | 人力资源     |
|    3 | wupeiqi    | male   |   38 |    201 |  201 | 人力资源     |
|    4 | yuanhao    | female |   28 |    202 |  202 | 销售         |
|    6 | jingliyang | female |   18 |    204 | NULL | NULL         |
| NULL | NULL       | NULL   | NULL |   NULL |  203 | 运营         |
+------+------------+--------+------+--------+------+--------------+

#注意 union与union all的区别:union会去掉相同的纪录
View Code

符合条件连接查询

#示例1:以内连接的方式查询employee和department表,并且employee表中的age字段值必须大于25,即找出公司所有部门中年龄大于25岁的员工
select employee.name,employee.age from employee,department
    where employee.dep_id = department.id
    and age > 25;

#示例2:以内连接的方式查询employee和department表,并且以age字段的升序方式显示
select employee.id,employee.name,employee.age,department.name from employee,department
    where employee.dep_id = department.id
    and age > 25
    order by age asc;
View Code

子查询:

#1:子查询是将一个查询语句嵌套在另一个查询语句中。
#2:内层查询语句的查询结果,可以为外层查询语句提供查询条件。
#3:子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字
#4:还可以包含比较运算符:= 、 !=、> 、<等

IN

#查询employee表,但dep_id必须在department表中出现过
select * from employee
    where dep_id in
        (select id from department);
View Code

比较运算符

#比较运算符:=、!=、>、>=、<、<=、<>
#查询平均年龄在25岁以上的部门名
select id,name from department
    where id in 
        (select dep_id from employee group by dep_id having avg(age) > 25);

#查看技术部员工姓名
select name from employee
    where dep_id in 
        (select id from department where name='技术');

#查看不足1人的部门名
select name from department
    where id in 
        (select dep_id from employee group by dep_id having count(id) <=1);
View Code

EXISTS

# EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回# 查询的记录。
# 而是返回一个真假值。True或False
# 当返回True时,外层查询语句将进行查询;当返回值为False时,外层查询语# 句不进行查询

#department表中存在dept_id=203,Ture
mysql> select * from employee
    ->     where exists
    ->         (select id from department where id=200);
+----+------------+--------+------+--------+
| id | name       | sex    | age  | dep_id |
+----+------------+--------+------+--------+
|  1 | egon       | male   |   18 |    200 |
|  2 | alex       | female |   48 |    201 |
|  3 | wupeiqi    | male   |   38 |    201 |
|  4 | yuanhao    | female |   28 |    202 |
|  5 | liwenzhou  | male   |   18 |    200 |
|  6 | jingliyang | female |   18 |    204 |
+----+------------+--------+------+--------+

#department表中存在dept_id=205,False
mysql> select * from employee
    ->     where exists
    ->         (select id from department where id=204);
Empty set (0.00 sec)
View Code
原文地址:https://www.cnblogs.com/wangyuanming/p/7731892.html