Mysql之select查询
单表查询
语法:
# SELECT [DISTINCT(去重)] 字段1,字段2... FROM 表名 # WHERE 条件 # GROUP BY field 分组 # HAVING 筛选 # ORDER BY field 排序 # LIMIT 限制条数
查询常见用法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 创建测试表 # 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);
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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字段,如果想查看组内信息,需要借助于聚合函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#查看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';
# 使用 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 设置为严格模式,再使用这种查法就会报错
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#强调:聚合函数聚合的是组的内容,若是没有分组,则默认一组 # 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发生在分组之后,所以只能使用聚合函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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低的关键字只能按照这个虚拟表在做规则。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
多表查询
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#建表 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 右连接 优先显示右表全部记录
交叉连接(不适合任何匹配条件, 生成笛卡儿积)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 | 运营 | +----+------------+--------+------+--------+------+--------------+
内连接(INNER JOIN)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#找两张表共有的部分,相当于利用条件从笛卡尔积结果中筛选出了正确的结果 #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;
外连接->左连接(LEFT JOIN)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#以左表为准,即找出所有员工信息,当然包括没有部门的员工 #本质就是:在内连接的基础上增加左边有右边没有的结果 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 | +----+------------+--------------+
外连接->右连接(RIGHT JOIN)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#以右表为准,即找出所有部门信息,包括没有员工的部门 #本质就是:在内连接的基础上增加右边有左边没有的结果 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 | 运营 | +------+-----------+--------------+
全外连接(UNION)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
全外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果 #注意: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会去掉相同的纪录
符合条件连接查询:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#示例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;
子查询:
#1:子查询是将一个查询语句嵌套在另一个查询语句中。 #2:内层查询语句的查询结果,可以为外层查询语句提供查询条件。 #3:子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字 #4:还可以包含比较运算符:= 、 !=、> 、<等
IN
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#查询employee表,但dep_id必须在department表中出现过 select * from employee where dep_id in (select id from department);
比较运算符
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#比较运算符:=、!=、>、>=、<、<=、<> #查询平均年龄在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);
EXISTS
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 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)