MySQL 常用命令(2)

170 阅读3分钟

MySQL 常用命令(1)

MySQL GROUP BY 语句

分组

GROUP BY 语句根据一个或多个列对结果集进行分组。

在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

先创建个表

use runoob;
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,
  `signin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登录次数',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
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');
SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;

使用 WITH ROLLUP

WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。

SELECT name, SUM(signin) as signin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;
+--------+--------------+
| name   | signin_count |
+--------+--------------+
| 小丽 |            2 |
| 小明 |            7 |
| 小王 |            7 |
| NULL   |           16 |
+--------+--------------+
SELECT coalesce(name, '总数'), SUM(signin) as signin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;
+--------------------------+--------------+
| coalesce(name, '总数') | signin_count |
+--------------------------+--------------+
| 小丽                   |            2 |
| 小明                   |            7 |
| 小王                   |            7 |
| 总数                   |           16 |
+--------------------------+--------------+

MySQL 连接的使用

JOIN 按照功能大致分为如下三类:

  • INNER JOIN(内连接,或等值连接) :获取两个表中字段匹配关系的记录。
  • LEFT JOIN(左连接): 获取左表所有记录,即使右表没有对应匹配的记录。
  • RIGHT JOIN(右连接):  与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

2 张表

SELECT * FROM tcount_tbl;
+---------------+--------------+ 
| runoob_author | runoob_count | 
+---------------+--------------+ 
| 菜鸟教程      | 10 | 
| RUNOOB.COM    | 20 | 
| Google        | 22 | 
+---------------+--------------+
SELECT * from runoob_tbl; 
+-----------+---------------+---------------+-----------------+ 
| runoob_id | runoob_title | runoob_author | submission_date | 
+-----------+---------------+---------------+-----------------+ 
| 1         | 学习 PHP     | 菜鸟教程       | 2017-04-12 | 
| 2         | 学习 MySQL   | 菜鸟教程       | 2017-04-12 | 
| 3         | 学习 Java    | RUNOOB.COM     | 2015-05-01 | 
| 4         | 学习 Python  | RUNOOB.COM     | 2016-03-06 | 
| 5         | 学习 C       | FK             | 2017-04-05 | 
+-----------+---------------+---------------+-----------------+

INNER JOIN

SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
等价于
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a, tcount_tbl b WHERE a.runoob_author = b.runoob_author;
+-------------+-----------------+----------------+ 
| a.runoob_id | a.runoob_author | b.runoob_count | 
+-------------+-----------------+----------------+ 
| 1 | 菜鸟教程 | 10 | 
| 2 | 菜鸟教程 | 10 | 
| 3 | RUNOOB.COM | 20 | 
| 4 | RUNOOB.COM | 20 | 
+-------------+-----------------+----------------+

LEFT JOIN

SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author; 
+-------------+-----------------+----------------+ 
| a.runoob_id | a.runoob_author | b.runoob_count | 
+-------------+-----------------+----------------+ 
| 1 | 菜鸟教程 | 10 | 
| 2 | 菜鸟教程 | 10 | 
| 3 | RUNOOB.COM | 20 | 
| 4 | RUNOOB.COM | 20 | 
| 5 | FK | NULL |
+-------------+-----------------+----------------+

RIGHT JOIN

SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a RIGHT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author; 
+-------------+-----------------+----------------+ 
| a.runoob_id | a.runoob_author | b.runoob_count | 
+-------------+-----------------+----------------+ 
| 1 | 菜鸟教程 | 10 | 
| 2 | 菜鸟教程 | 10 | 
| 3 | RUNOOB.COM | 20 | 
| 4 | RUNOOB.COM | 20 | 
| NULL | NULL | 22 | 
+-------------+-----------------+----------------+

MySQL NULL 值处理

SELECT * FROM runoob_test_tbl WHERE runoob_count IS NULL;
SELECT * from runoob_test_tbl WHERE runoob_count IS NOT NULL;

MySQL 正则表达式

MySQL中使用 REGEXP 操作符来进行正则表达式匹配。

查找name字段中以'st'为开头的所有数据:

SELECT name FROM person_tbl WHERE name REGEXP '^st';

查找name字段中以'ok'为结尾的所有数据:

SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

查找name字段中包含'mar'字符串的所有数据:

SELECT name FROM person_tbl WHERE name REGEXP 'mar';

查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据:

SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

ALTER命令

当我们需要修改数据表名或者修改数据表字段时,就需要使用到 MySQL ALTER 命令。

删除,添加或修改表字段

ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT;
-- 指定新增字段的位置
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT FIRST;
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT AFTER c;

如果数据表中只剩余一个字段则无法使用DROP来删除字段。

修改字段类型及名称

ALTER TABLE testalter_tbl MODIFY c CHAR(10);
ALTER TABLE testalter_tbl CHANGE i j BIGINT;
ALTER TABLE testalter_tbl CHANGE j j INT;

修改字段默认值

ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;

修改表名

ALTER TABLE testalter_tbl RENAME TO alter_tbl;