设为首页 收藏本站
查看: 2056|回复: 0

[经验分享] MySQL专题6之MySQL LIKE子句、MySQL UNION语句、MySQL排序和分组

[复制链接]

尚未签到

发表于 2018-10-2 12:34:48 | 显示全部楼层 |阅读模式
  1、MySQL LIKE子句
  -  我们知道在MySQL中使用SQL SELECT命令来读取数据,同时我们可以在SELECT语句中使用WHERE子句来获取指定的记录。
  -  WHERE子句中可以使用等号 = 来设定获取数据的条件,如runoob_author="RUNOOB.COM"。
  -  但是有时候我们需要获取runoob_author字段含有"COM"字符的所有记录,这时我们就需要在WHERE子句中使用SQL LIKE子句。
  -  SQL LIKE子句中使用百分号%字符来表示任意字符,类似于UNIX正则表达式中的星号*。
  -  如果没有使用百分号 % ,LIKE子句与等号 = 的效果相同。
  -  以下是SQL SELECT 语句使用LIKE子句从数据表中读取数据的通用语法:
SELECT field1, field2,...fieldN  
FROM table_name
  
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
  -  你可以在WHERE子句中指定任何条件。
  -  你可以在WHERE子句中使用LIKE子句。
  -  你可以使用LIKE子句代替等号 = 。
  -  LIKE通常与 % 一同使用,类似于一个元字符的搜索。
  -  你可以使用AND或者OR指定一个或者多个条件。
  -  你可以在DELETE或者UPDATE命令中使用WHERE...LIKE子句来指定条件。
  -  以下是我们将runoob_tbl表中获取runoob_author字段中以COM为结尾的所有记录:
mysql> use RUNOOB;  
Database changed
  
mysql> SELECT * from runoob_tbl  WHERE runoob_author LIKE '%COM';
  
+-----------+---------------+---------------+-----------------+
  
| runoob_id | runoob_title  | runoob_author | submission_date |
  
+-----------+---------------+---------------+-----------------+
  
| 3         | 学习 Java   | RUNOOB.COM    | 2015-05-01      |
  
| 4         | 学习 Python | RUNOOB.COM    | 2016-03-06      |
  
+-----------+---------------+---------------+-----------------+
  
2 rows in set (0.01 sec)
  2、MySQL UNION操作符
  -  MySQL UNION操作符用于连接两个以上的SELECT语句的结果组合到一个结果集合中。多个SELECT语句会删除重复的数据。MySQL UNION操作符语法格式为:
SELECT expression1, expression2, ... expression_n  
FROM tables
  
[WHERE conditions]
  
UNION [ALL | DISTINCT]
  
SELECT expression1, expression2, ... expression_n
  
FROM tables
  
[WHERE conditions];
  -  expression1,expression2,...expression_n为要检索的列。
  -  tables:要检索的数据表。
  -  WHERE conditions:可选,检索条件。
  -  DISTINCT:可选,删除结果集中重复的数据。默认情况下UNION操作符已经删除重复数据,所以DISTINCT修饰符对结果没啥影响。
  -  ALL:可选,返回所有结果集,包含重复数据。
  -  演示数据库:下面是选自"Websites"表的数据:
mysql> SELECT * FROM Websites;  
+----+--------------+---------------------------+-------+---------+
  
| id | name         | url                       | alexa | country |
  
+----+--------------+---------------------------+-------+---------+
  
| 1  | Google       | https://www.google.cm/    | 1     | USA     |
  
| 2  | 淘宝          | https://www.taobao.com/   | 13    | CN      |
  
| 3  | 菜鸟教程      | http://www.runoob.com/    | 4689  | CN      |
  
| 4  | 微博          | http://weibo.com/         | 20    | CN      |
  
| 5  | Facebook     | https://www.facebook.com/ | 3     | USA     |
  
| 7  | stackoverflow | http://stackoverflow.com/ |   0 | IND     |
  
+----+---------------+---------------------------+-------+---------+
  -  下面是"apps"APP的数据:
mysql> SELECT * FROM apps;  
+----+------------+-------------------------+---------+
  
| id | app_name   | url                     | country |
  
+----+------------+-------------------------+---------+
  
|  1 | QQ APP     | http://im.qq.com/       | CN      |
  
|  2 | 微博 APP | http://weibo.com/       | CN      |
  
|  3 | 淘宝 APP | https://www.taobao.com/ | CN      |
  
+----+------------+-------------------------+---------+
  
3 rows in set (0.00 sec)
  -  下面的SQL语句从“Websites”和'apps"表中选取所有不同的country(只有不同的值):
SELECT country FROM Websites  
UNION
  
SELECT country FROM apps
  
ORDER BY country;
  -  执行以上SQL输出结果为:
DSC0000.jpg

  -  下面的SQL语句使用UNION ALL从"Websites"和"apps"表中选取所有的中国(CN)的数据(也有重复的值):
SELECT country, name FROM Websites  
WHERE country='CN'
  
UNION ALL
  

  SELECT country, app_name FROM apps
  
WHERE country='CN'
  
ORDER BY
  country;
  -  执行以上SQL输出结果如下:
DSC0001.jpg

  3、MySQL排序
  -  我们知道从MySQL表中使用SQL SELECT语句来读取数据。
  -  如果我们需要对读取的数据进行排序,我们就可以使用MySQL的ORDER BY子句来设定你想按那种方式来进行排序,再返回搜索结果。以下是SQL SELECT语句使用ORDER BY子句将查询数据排序后再返回数据的语法:
SELECT field1, field2,...fieldN table_name1, table_name2...  
ORDER BY field1, [field2...] [ASC [DESC]]
  -  你可以使用任何字段作为排序的条件,从而返回排序后的查询结果。
  -  你可以设定多个字段来排序。
  -  你可以使用ASC或者DESC关键字来设置查询结果是按升序或者降序排列。默认情况下,它是按照升序进行排序的。
  -  你可以添加WHERE ...LIKE子句来设置条件。
  -  以下将在SQL SELECT语句中使用ORDER BY子句来读取MySQL数据表runoob_tbl中的数据:(升序以及降序)
mysql> use RUNOOB;  
Database changed
  
mysql> SELECT * from runoob_tbl ORDER BY submission_date ASC;
  
+-----------+---------------+---------------+-----------------+
  
| runoob_id | runoob_title  | runoob_author | submission_date |
  
+-----------+---------------+---------------+-----------------+
  
| 3         | 学习 Java   | RUNOOB.COM    | 2015-05-01      |
  
| 4         | 学习 Python | RUNOOB.COM    | 2016-03-06      |
  
| 1         | 学习 PHP    | 菜鸟      | 2017-04-12      |
  
| 2         | 学习 MySQL  | 菜鸟      | 2017-04-12      |
  
+-----------+---------------+---------------+-----------------+
  
4 rows in set (0.01 sec)
  

  
mysql> SELECT * from runoob_tbl ORDER BY submission_date DESC;
  
+-----------+---------------+---------------+-----------------+
  
| runoob_id | runoob_title  | runoob_author | submission_date |
  
+-----------+---------------+---------------+-----------------+
  
| 1         | 学习 PHP    | 菜鸟      | 2017-04-12      |
  
| 2         | 学习 MySQL  | 菜鸟      | 2017-04-12      |
  
| 4         | 学习 Python | RUNOOB.COM    | 2016-03-06      |
  
| 3         | 学习 Java   | RUNOOB.COM    | 2015-05-01      |
  
+-----------+---------------+---------------+-----------------+
  
4 rows in set (0.01 sec)
  4、MySQL GROUP BY语句
  -  GROUP BY语句根据一个或者多个列对结果集进行分组。
  -  在分组的列上我们可以使用COUNT,SUM,AVG等函数。GROUP BY语法如下:
SELECT column_name, function(column_name)  
FROM table_name
  
WHERE column_name operator value
  
GROUP BY column_name;
  -  示例使用到以下表结构以及数据,使用前我们可以将以下数据导入数据库中:
SET NAMES utf8;  
SET FOREIGN_KEY_CHECKS = 0;
  

  
-- ----------------------------
  
--  Table structure for `employee_tbl`
  
-- ----------------------------
  
DROP TABLE IF EXISTS `employee_tbl`;
  
CREATE TABLE `employee_tbl` (
  
  `id` int(11) NOT NULL,
  
  `name` char(10) NOT NULL DEFAULT '',
  
  `date` datetime NOT NULL,
  
  `singin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登录次数',
  
  PRIMARY KEY (`id`)
  
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  

  
-- ----------------------------
  
--  Records of `employee_tbl`
  
-- ----------------------------
  
BEGIN;
  
INSERT INTO `employee_tbl` VALUES ('1', '小明', '2016-04-22 15:25:33', '1'), ('2', '小王', '2016-04-20 15:25:47', '3'), ('3', '小丽', '2016-04-19 15:26:02', '2'), ('4', '小王', '2016-04-07 15:26:14', '4'), ('5', '小明', '2016-04-11 15:26:40', '4'), ('6', '小明', '2016-04-04 15:26:54', '2');
  
COMMIT;
  

  
SET FOREIGN_KEY_CHECKS = 1;
  -  导入成功后,执行以下SQL语句:
mysql> set names utf8;  
mysql> SELECT * FROM employee_tbl;
  
+----+--------+---------------------+--------+
  
| id | name   | date                | singin |
  
+----+--------+---------------------+--------+
  
|  1 | 小明 | 2016-04-22 15:25:33 |      1 |
  
|  2 | 小王 | 2016-04-20 15:25:47 |      3 |
  
|  3 | 小丽 | 2016-04-19 15:26:02 |      2 |
  
|  4 | 小王 | 2016-04-07 15:26:14 |      4 |
  
|  5 | 小明 | 2016-04-11 15:26:40 |      4 |
  
|  6 | 小明 | 2016-04-04 15:26:54 |      2 |
  
+----+--------+---------------------+--------+
  
6 rows in set (0.00 sec)
  -  接下来我们使用GROUP BY语句将数据表按名字进行分组,并统计每个人有多少条记录:
mysql> SELECT name, COUNT(*) FROM   employee_tbl GROUP BY name;  
+--------+----------+
  
| name   | COUNT(*) |
  
+--------+----------+
  
| 小丽 |        1 |
  
| 小明 |        3 |
  
| 小王 |        2 |
  
+--------+----------+
  
3 rows in set (0.01 sec)
  -  使用WITH ROLLUP:WITH ROLLUP可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT)。
  -  例如我们将以上的数据表按名字进行分组,再统计每个人登录的次数:
ysql> SELECT name, SUM(singin) as singin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;  
+--------+--------------+
  
| name   | singin_count |
  
+--------+--------------+
  
| 小丽 |            2 |
  
| 小明 |            7 |
  
| 小王 |            7 |
  
| NULL   |           16 |
  
+--------+--------------+
  
4 rows in set (0.00 sec)
  -  其中记录NULL表示所有人的登录次数。
  -  我们可以使用coalesce来设置一个可以取代NULL的名字,coalesce语法:
select coalesce(a,b,c);  -  参数说明,如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a、b、c都为null,则返回为null(没意义)。以下实例中如果名字为空我们使用总数代替:
mysql> SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;  
+--------------------------+--------------+
  
| coalesce(name, '总数') | singin_count |
  
+--------------------------+--------------+
  
| 小丽                   |            2 |
  
| 小明                   |            7 |
  
| 小王                   |            7 |
  
| 总数                   |           16 |
  
+--------------------------+--------------+
  
4 rows in set (0.01 sec)



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-607563-1-1.html 上篇帖子: mysql DNS反向解析 下篇帖子: mysql+MHA+keepalived-Loading
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表