MySQL专题6之MySQL LIKE子句、MySQL UNION语句、MySQL排序和分组
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 ] 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_tblWHERE 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
UNION
SELECT expression1, expression2, ... expression_n
FROM tables
;
-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输出结果为:
-下面的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输出结果如下:
3、MySQL排序
-我们知道从MySQL表中使用SQL SELECT语句来读取数据。
-如果我们需要对读取的数据进行排序,我们就可以使用MySQL的ORDER BY子句来设定你想按那种方式来进行排序,再返回搜索结果。以下是SQL SELECT语句使用ORDER BY子句将查询数据排序后再返回数据的语法:
SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, ]
-你可以使用任何字段作为排序的条件,从而返回排序后的查询结果。
-你可以设定多个字段来排序。
-你可以使用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 FROMemployee_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 FROMemployee_tbl GROUP BY name WITH ROLLUP;
+--------------------------+--------------+
| coalesce(name, '总数') | singin_count |
+--------------------------+--------------+
| 小丽 | 2 |
| 小明 | 7 |
| 小王 | 7 |
| 总数 | 16 |
+--------------------------+--------------+
4 rows in set (0.01 sec)
页:
[1]