MySQL
MySQL
参考:
命令

连接与配置
mysql [-h localhost] [-P 3306] -u root -p//登录mysql
set names utf8//设置编码
exit//退出mysql
库操作
SHOW - 查询
SHOW DATABASES//显示所有数据库SHOW DATABASE()//显示当前数据库USE RUNOOB//切换数据库
CREATE - 创建
1 | CREATE DATABASE [IF NOT EXISTS] 数据库名 |
CREATE DATABASE IF NOT EXISTS mydatabase//创建新数据库CREATE DATABASE mydatabase//创建新数据库CREATE DATABASE mydatabase DEFAULT CHARACTER SET utf8mb4//创建新数据库,指定默认字符集为utf8mb4CREATE DATABASE mydatabase DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci//创建新数据库,指定默认字符集为utf8mb4,默认排序规则为utf8mb4_general_ci
DROP - 删除
1 | DROP DATABASE [IF EXISTS] 数据库名 //删除数据库 |
DROP DATABASE mydatabase//删除数据库DROP DATABASE IF EXISTS mydatabase//删除数据库
ALTER - 修改
1 | ALTER DATABASE 数据库名 [DEFAULT CHARACTER SET 字符集名] [DEFAULT COLLATE 排序规则]`//修改数据库编码 |
ALTER DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci//修改数据库编码(其实加不加DEFAULT都可以)ALTER DATABASE mydatabase DEFAULT CHARACTER SET utf8mb4//修改数据库默认编码ALTER DATABASE mydatabase DEFAULT COLLATE utf8mb4_general_ci//修改数据库默认排序规则
表操作
SHOW - 查询
SHOW TABLES//显示所有表SHOW TABLE STATUS//显示所有表的状态
DESC 表名//显示表结构
SHOW CREATE TABLE 表名//显示创建表的语句
CREATE - 创建
1 | CREATE TABLE IF NOT EXISTS 表名 ( |
数据类型:


1 | CREATE TABLE IF NOT EXISTS users ( |
ALTER - 修改
1 | ALTER TABLE 表名 ADD 列名 数据类型 [COMMENT '列注释'] [约束] |
ALTER TABLE Websites CHANGE name site_name VARCHAR(255)//修改表名ALTER TABLE Websites CHANGE url site_url VARCHAR(255)//修改表字段名ALTER TABLE Websites CHANGE age site_age TINYINT UNSIGNED COMMENT '年龄'//修改表字段名,数据类型,注释ALTER TABLE student MODIFY id INT UNSIGNED AUTO_INCREMENT//修改表字段名,数据类型,自增ALTER TABLE student COMMENT '学生信息表'//修改表注释
DROP - 删除
1 | DROP TABLE [IF EXISTS] 表名 |
DROP TABLE IF EXISTS Websites//删除表
数据操作
INSERT - 添加
1 | INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...) --指定字段添加数据 |
INSERT INTO Websites (name, url, alexa, country) VALUES ('Google', 'https://www.google.com', 1, 'USA')//向Websites表中插入数据INSERT INTO Websites (name, url, alexa, country) VALUES ('RUNOOB', 'https://www.runoob.com', 13, 'CN')//向Websites表中插入数据
UPDATE - 修改
1 | UPDATE 表名 SET 列1 = 值1, 列2 = 值2, ... [WHERE 条件] |
UPDATE Websites SET name='Google' WHERE id=1//将id为1的数据的name更新为GoogleUPDATE Websites SET name='Google', url='https://www.google.com' WHERE id=1//将id为1的数据的name和url更新为Google和https://www.google.com
DELETE - 删除
1 | DELETE FROM 表名 WHERE 条件 |
DELETE FROM Websites WHERE id=1//删除id为1的数据DELETE FROM Websites WHERE id=2//删除id为2的数据
查询操作
1 | SELECT 列名1, 列名2, ... FROM 表名 WHERE 条件 GROUP BY 列名1, 列名2 HAVING 分组后过滤条件 ORDER BY 列名1 [ASC|DESC], 列名2 [ASC|DESC] LIMIT 数量 |
起始索引从0开始,且等于(页码-1)*每页记录数,查询记录数为-1时,表示查询所有数据。
- 默认排序方式为升序,即ASC。如果需要降序排列,则需要使用DESC关键字。
WHERE 和 HAVING的区别:
WHERE是在查询数据之前对数据进行过滤,而HAVING是在查询数据之后对数据进行过滤。WHERE不能用于聚合函数,而HAVING可以用于聚合函数。
聚合函数:
- 聚合函数可以对一列进行计算,并返回计算结果。
- 聚合函数通常与 SELECT 语句一起使用,用于对查询结果进行统计分析。
| 函数 | 功能 |
|---|---|
| COUNT | 计算指定列的行数 |
| SUM | 计算指定列的总和 |
| AVG | 计算指定列的平均值 |
| MAX | 计算指定列的最大值 |
| MIN | 计算指定列的最小值 |
SELECT COUNT(*) FROM Websites//查询Websites表的行数SELECT SUM(age) FROM Websites//查询Websites表的age列的总和SELECT AVG(age) FROM Websites//查询Websites表的age列的平均值SELECT MAX(age) FROM Websites//查询Websites表的age列的最大值SELECT MIN(age) FROM Websites//查询Websites表的age列的最小值
SELECT * FROM Websites//查询所有数据SELECT * FROM Websites WHERE id=1//查询id为1的数据
SELECT * FROM Websites WHERE id=1 AND name='Google'//查询id为1且name为Google的数据SELECT * FROM Websites WHERE id=1 OR name='Google'//查询id为1或name为Google的数据
SELECT * FROM Websites WHERE id=1,2,3//查询id为1,2,3的数据SELECT * FROM Websites WHERE id IN (1,2,3)//查询id为1,2,3的数据SELECT * FROM Websites WHERE id NOT IN (1,2,3)//查询id不为1,2,3的数据SELECT * FROM Websites WHERE id BETWEEN 1 AND 10//查询id在1到10之间的数据
SELECT * FROM Websites WHERE id LIKE '%Google%'//查询name中包含Google的数据SELECT * FROM Websites WHERE id LIKE 'Google%'//查询name以Google开头的数据SELECT * FROM Websites WHERE id LIKE '%Google'//查询name以Google结尾的数据
SELECT * FROM Websites WHERE id=1 ORDER BY name//查询id为1的数据并按name排序SELECT * FROM Websites WHERE id=1 ORDER BY name DESC//查询id为1的数据并按name倒序排序SELECT row1,row2 FROM Websites WHERE id=1 ORDER BY name DESC//查询id为1的数据并按name倒序排序,只返回row1,row2列
SELECT * FROM Websites WHERE id=1 GROUP BY name//查询id为1的数据并按name分组SELECT * FROM Websites WHERE id=1 HAVING COUNT(*) > 1//查询id为1的数据并按name分组后筛选出数量大于1的数据
SELECT * FROM Websites WHERE id=1 LIMIT 10//查询id为1的数据并限制返回10条数据SELECT * FROM Websites WHERE id=1 LIMIT 10 OFFSET 20//查询id为1的数据并限制返回10条数据,从第20条开始
SELECT * FROM Websites WHERE id=1 UNION SELECT * FROM Websites WHERE id=2//查询id为1或2的数据并去重SELECT * FROM Websites WHERE id=1 UNION ALL SELECT * FROM Websites WHERE id=2//查询id为1或2的数据并保留重复数据
用户操作
USE mysql//切换到mysql数据库SELECT * FROM userSELECT Host, User FROM mysql.user//查询用户
CREATE USER '用户名newuser'@'主机名localhost' IDENTIFIED BY '密码password'//创建用户CREATE USER '用户名newuser'@ '%' IDENTIFIED BY '密码password'//创建用户,主机名%表示任意主机ALTER USER '用户名newuser'@'主机名localhost' IDENTIFIED [WITH mysql_native_password] BY '新密码newpassword'//修改用户密码DROP USER '用户名newuser'@'主机名localhost'//删除用户
| 权限 | 说明 |
|---|---|
| ALL,ALL PRIVILEGES | 所有权限 |
| SELECT | 查询权限 |
| INSERT | 插入权限 |
| UPDATE | 更新权限 |
| DELETE | 删除权限 |
| ALTER | 修改权限 |
| DROP | 删除权限 |
| CREATE | 创建权限 |
SHOW GRANTS FOR '用户名newuser'@'主机名localhost'//显示用户权限GRANT 权限 ON 数据库名.表名 TO '用户名newuser'@'主机名localhost'//授予用户权限GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost' WITH GRANT OPTION//授予用户所有权限REVOKE 权限 ON 数据库名.表名 FROM '用户名newuser'@'主机名localhost'//撤销用户权限FLUSH PRIVILEGES;//刷新权限
函数
字符串函数
| 函数 | 功能 |
|---|---|
| LENGTH(str) | 返回字符串的长度 |
| CONCAT(str1,str2,…) | 连接字符串 |
| UPPER(str) | 转换为大写 |
| LOWER(str) | 转换为小写 |
| LEFT(str,len) | 从左开始截取字符串 |
| RIGHT(str,len) | 从右开始截取字符串 |
| LPAD(str,len,padstr) | 用指定字符串从左开始填充字符串 |
| RPAD(str,len,padstr) | 用指定字符串从右开始填充字符串 |
| SUBSTRING(str,pos,len) | 截取字符串 |
| REPLACE(str,from_str,to_str) | 替换字符串 |
| TRIM(str) | 去掉字符串两边的空格 |
| REVERSE(str) | 反转字符串 |
SELECT CONCAT('Hello','World')//连接字符串UPDATE emp SET workno = LPAD(workno,4,'0')//更新emp表workno字段,不足4位的前面补0
数值函数
| 函数 | 功能 |
|---|---|
| ROUND(x) | 四舍五入 |
| ROUND(x,y) | 保留y位小数 |
| TRUNCATE(x,y) | 保留y位小数,不进行四舍五入 |
| RAND() | 随机数(0-1) |
| MOD(x,y) | 求余(x%y) |
| FLOOR(x) | 向下取整 |
| CEIL(x) | 向上取整 |
SELECT ROUND(1.5)//四舍五入SELECT ROUND(1.5,1)//保留1位小数SELECT TRUNCATE(1.5,1)//保留1位小数,不进行四舍五入SELECT RAND()//随机数(0-1)SELECT MOD(10,3)//求余(10%3)SELECT FLOOR(1.5)//向下取整SELECT CEIL(1.5)//向上取整
日期函数
| 函数 | 功能 |
|---|---|
| NOW() | 当前日期时间 |
| CURDATE() | 当前日期 |
| CURTIME() | 当前时间 |
| YEAR(date) | 年份 |
| MONTH(date) | 月份 |
| DAY(date) | 日期 |
| DATE_ADD(date,INTERVAL expr(目标时间) type(时间单位)) | 日期相加 |
| DATE_SUB(date,INTERVAL expr type) | 日期相减 |
| DATEDIFF(date1,date2) | 日期相减(天数) |
| TIMEDIFF(time1,time2) | 时间相减(天数) |
SELECT NOW()//当前日期时间SELECT CURDATE()//当前日期SELECT CURTIME()//当前时间SELECT YEAR(NOW())//当前年份SELECT DATE_ADD(NOW(),INTERVAL 70 DAY)//当前日期加1年SELECT DATE_SUB(NOW(),INTERVAL 1 YEAR)//当前日期减1年SELECT DATEDIFF('2020-1-1','2021-1-1')//日期相减(天数)SELECT TIMEDIFF('10:00:00','9:00:00')//时间相减(天数)SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s')//格式化日期时间SELECT DATE_FORMAT(NOW(),'%Y-%m-%d')//格式化日期SELECT name,DATEDIFF(NOW(),birth) FROM people WHERE datediff(NOW(),birth)>60//查询年龄大于60岁的人
流程函数
| 函数 | 功能 |
|---|---|
| IF(expr,v1,v2) | 如果expr为真,返回v1,否则返回v2 |
| IFNULL(expr,v1) | 如果expr不为空,返回expr,否则返回v1 |
| CASE WHEN expr THEN v1 WHEN expr THEN v2 ELSE v3 END | 如果expr为真,返回v1,如果expr为假,返回v2,否则返回v3 |
| CASE expr WHEN v1 THEN r1 ELSE r2 END | 如果expr=v1, 返回r1, 否则返回r2 |
SELECT IF(FALSE,'OK','ERROR')//返回ERRORSELECT IFNULL('OK','ERROR')//返回OKSELECT IFNULL(NULL,'ERROR')//返回ERRORSELECT CASE 1 WHEN 1 THEN 'OK' ELSE 'ERROR' END//返回OKSELECT CASE 2 WHEN 1 THEN 'OK' ELSE 'ERROR' END//返回ERROR
1 | SELECT |
1 | SELECT |
约束
| 约束 | 说明 |
|---|---|
| PRIMARY KEY | 主键,唯一且非空 |
| NOT NULL | 非空 |
| UNIQUE | 唯一 |
| CHECK(表达式) | 检查约束 |
| DEFAULT 值 | 默认值 |
| FOREIGN KEY | 外键 |
其他
- CREATE INDEX - 创建索引(搜索键)
1 | CREATE INDEX index_name |
CREATE INDEX idx_name ON Websites (name)//在Websites表的name字段创建索引CREATE INDEX idx_url ON Websites (url)//在Websites表的url字段创建索引
- DROP INDEX - 删除索引
1 | DROP INDEX index_name |
DROP INDEX idx_name ON Websites//删除Websites表的name字段索引DROP INDEX idx_url ON Websites//删除Websites表的url字段索引
HAVING - 用于对分组后的结果集进行筛选
JOIN - 用于将两个或多个表的记录结合起来
1 | SELECT column_name(s) |
- LEFT JOIN - 左连接
1 | SELECT column_name(s) |
- RIGHT JOIN - 右连接
1 | SELECT column_name(s) |
- FULL JOIN - 全连接
1 | SELECT column_name(s) |
- UNION - 用于合并两个或多个 SELECT 语句的结果集
1 | SELECT column_name(s) FROM table_name1 |
参考
https://www.runoob.com/sql/sql-tutorial.html
https://www.runoob.com/mysql/mysql-tutorial.html
未完待续…


