企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
总结一下MySQL常用命令。适用于Windows。 \[括号内是可选内容\] 本篇博客按照菜鸟教程MySQL篇进行整理,主要是按照基础操作进行划分。要想完整学习SQL语句,建议看SQL篇:*[SQL 教程 | 菜鸟教程 (runoob.com)](https://links.jianshu.com/go?to=https%3A%2F%2Fwww.runoob.com%2Fsql%2Fsql-tutorial.html)* (菜鸟教程MySQL篇害人不浅 但是SQL篇还行 不建议直接看这上面的MySQL) 如果你致力于JavaWeb的开发并需要用到Java操作数据库,能看懂SQL语句就行了,JPA都不需要你亲自手写SQL语句(来自某花了一周时间才会写SQL的作者)。 # 零、数据库管理 **1.连接数据库**:(在cmd窗口下)`mysql -u <用户名> -p <密码>` **2.创建用户**:`CREATE USER '<用户名>'@'<主机名>' IDENTIFIED BY '<密码>'` **3.用户授权**:`GRANT <权限> ON <数据库名>.<表名> TO ‘<用户名>’@‘<主机名>’` 注:要授予所有权限,可以用ALL # 一、操作数据库 **1.查看所有数据库**:`SHOW DATABASES` **查看创建数据库时详细信息**:`SHOW CREATE DATABASE <数据库名>` **2.创建数据库**:`CREATE DATABASE <数据库名>` **3.删除数据库**:`DROP DATABASE <数据库名>` **4.选择数据库**:`USE <数据库名>` # 二、操作表 ## (一)表的基本操作 **1.查看某个数据库下的所有表**:`SHOW TABLES` **查看表的详细细节/结构**:`DESC <表名>` **2.创建数据表**:`CREATE TABLE <表名> (<列名1> <数据类型1> [AUTO_INCREMENT] [NOT NULL] [DEFAULT <默认值>] [PRIMARY KEY], <列名2> <数据类型2>, ...)` **注**:CREATE TABLE时后面加的参数(AUTO\_INCREMENT, NOT NULL, DEFAULT等等均可以在MODIFY/CHANGE添加),这些参数称为**约束**。 (1) AUTO\_INCREMENT表示自增。 (2)NOT NULL表示添加数据时,该字段不能为空。 (3)PRIMARY KEY用于定义主键,用于索引。如果有联合主键,也可以写成该形式: `CREATE TABLE <表名> (<列名1> <数据类型1>, <列名2> <数据类型2>, ..., PRIMARY KEY(列名1, 列名2, ...))`。 主键不能为空,不能重复。主键索引是唯一索引的特殊类型。 设置主键后,用`INSERT INTO`语句插入重复数据将报错。用`INSERT IGNORE INTO`插入重复数据将自动跳过重复数据,不报错,但会提示Warning。 (4)DEFAULT用于设定默认值。 **3.删除数据表**:`DROP TABLE <表名>` **4.复制表的结构到新表**:`CREATE TABLE <新表> LIKE <旧表>` **复制表的数据与结构**:`CREATE TABLE <新表> SELECT * FROM <旧表>` **复制表的所有结构,包括索引**:可以用`SHOW CREATE TABLE <表名>`查看创建数据表语句,然后创建一相同结构、索引的表,最后用`INSERT INTO ... SELECT * FROM ...`语句复制表内容。 **5.对重复数据操作**:占个坑,可见链接*[MySQL 处理重复数据 | 菜鸟教程 (runoob.com)](https://links.jianshu.com/go?to=https%3A%2F%2Fwww.runoob.com%2Fmysql%2Fmysql-handling-duplicates.html)*。 ## (二)临时表 临时表只在当前连接可用。关闭连接,MySQL将自动删除临时表。 要创建临时表,只需将TABLE替换为TEMPORARY TABLE。 删除临时表不需要加TEMPORARY。 # 三、操作表内数据 **1.插入数据**:`INSERT INTO <表名> (<字段1>, <字段2>, ...) VALUES (<值1>, <值2>,...)` **2.查询数据**:`SELECT <字段1>, <字段2>,... FROM <表1> <表2> [WHERE Clause] [LIMIT N] [OFFSET M]` **注**:(1) 可用星号\*代替字段,表示查找表的所有字段数据 (2) LIMIT表示返回的记录数,OFFSET表示查询数据记录的偏移量。 **3.修改/更新表内数据**:`UPDATE <表名> SET <字段1> = <数据1>, <字段2> = <数据2>,... [WHERE Clause]` **4.删除表内某个数据**:`DELETE FROM <表名> [WHERE Clause]` **删除整个表,然后重新构建表**:`TRUNCATE <表名>` # 四、修饰用子句 这些子句/符号可以用于查询数据SELECT、删除数据DELETE和修改数据UPDATE。包含的子句及其优先级关系如下图: ![](https://img.kancloud.cn/3f/12/3f12f532b56d3671501b457949ade398_669x576.jpg) 子句执行顺序,摘自菜鸟教程 这里只列写其中几种。 ## (一)WHERE子句 WHERE用于过滤记录。可用于WHERE的操作符如下图: ![](https://img.kancloud.cn/12/0c/120c36403b2c63e36080129a9a017ae1_575x407.jpg) WHERE中操作符,摘自菜鸟教程 同时,可以用AND和OR指定一个或多个条件。如:`WHERE ID = 10000 AND NAME = ‘TOM’`。 查询多个表的字段,要在字段前加上表名,即表名.字段。 **注意**:想要判断数据是否为空,用`IS NULL`或`IS NOT NULL`。 ## (二)LIKE子句 LIKE子句使得WHERE可以设定模糊条件。 语法格式:`WHERE <字段1> LIKE <条件1> AND <字段2> = <条件2>`。 LIKE常用符号: **1.%**,表示任意个字符。 **2.\_**,表示单个字符。 样例如下图: ![](https://img.kancloud.cn/99/01/9901d504ace73edca38e191cbf0b4ac1_363x370.jpg) LIKE子句样例,摘自菜鸟教程笔记 常用的就是&和\_,也有其他符号(MySQL支持正则表达式的匹配),这里占个坑,以后弄明白了来填。 ## (三)UNION组合 UNION用于将多个SELECT语句的结果组合到一个结果中,其中的重复数据将不显示。 语法格式:`SELECT <字段1> <字段2> FROM <表1> [WHERE Clause] UNION [ALL] SELECT <字段1> <字段2> FROM <表2> [WHERE Clause]`,其中`[ALL]`表示返回所有结果,包括重复数据。 UNION前后查询的字段不一定要相同,但两侧列数一致。 ## (四)ORDER BY排序 ORDER BY用于设定字段的查询结果按某种方式排序输出。 语法格式:`SELECT <字段1> <字段2> FROM <表1> <表2> ORDER BY <字段a> [ASC/DESC], <字段b> [ASC/DESC]`,其中ASC(升序)为默认值,DESC(降序)可选。 ## (五)GROUP BY分组 1.GROUP BY语句可根据一个或多个列对查询结果分组。在被分组的列上用函数修饰。 语法格式:`SELECT <字段1>, fucktion(<字段2>) [AS <字符>] FROM <表名> GROUP BY <字段1>`,运行后将按照字段1对function 运算后的结果进行分组并输出。AS后的字符是分组输出后列的别名,用于重命名。 具体使用可以见链接:[SQL中GROUP BY用法示例 - 简书 (jianshu.com)](https://www.jianshu.com/p/8b135d373df1) 2.在GROUP BY后可加HAVING,对GROUP BY分组后的对象进行筛选过滤。 ## (六) JOIN连接多个表 JOIN分为四类:INNER JOIN,LEFT JOIN,RIGHT JOIN,CROSS JOIN。 首先谈谈内连接与外连接。 **内连接**:连接结果仅包含符合连接条件(WHERE/INNER JOIN中ON后面的内容)的行。参与连接的两表都应符合连接条件。查询结果列出被连接表符合连接条件要求列出的所有列。 **外连接**:外连接就是在内连接的基础上,加上基准表没有显示的对应项进行显示,即使没显示的对应项不符合连接条件。 接下来说一说这四个JOIN。 0.MySQL没有FULL JOIN,取而代之的是UNION。 1.INNER JOIN:获取两表中字段匹配关系的记录。语法格式:`SELECT <字段a1> <字段a2> <字段b1> <字段b2> FROM <表a> INNER JOIN <表b> ON <表a>.<字段a1> = <表b>.字段<b1>` INNER JOIN也可以用WHERE实现,即`SELECT <字段a1> <字段a2> <字段b1> <字段b2> FROM <表a>, <表b> WHERE <表a>.<字段a1> = <表b>.字段<b1>`但使用WHERE会在某些时候会损失查询性能。 2.LEFT JOIN:从左表读取全部数据,即使右表没有对应数据。即以左表为基准表。 3.RIGHT JOIN:从右表读取全部数据,即使左表没有对应数据。即以右表为基准表。 4.CROSS JOIN:返回左表的所有行,每行与右表的所有行进行全组合。与不加WHERE修饰的SELECT语句等价。 (好混乱555) # 五、事务 事务用于执行成批的SQL语句,如INSERT,UPDATE,DELETE等。在MySQL中,只有使用Innodb引擎的数据库才支持事务。 **1.开启事务**:`BEGIN` **2.确认事务**:`COMMIT` **3.事务回滚**:`ROLLBACK`,结束事务并撤销未COMMIT的所有语句。 **回滚至某保存点**:`ROLLBACK TO <保存点名>` **4.在事务中建立保存点**:`SAVEPOINT [<保存点名>]` **删除保存点**:`RELEASE SAVEPOINT <保存点名>`(一定要加保存点!) # 六、ALTER命令 **1.删除字段**:`ALTER TABLE <表名> DROP <字段>` **2.添加字段**:`ALTER TABLE <表名> ADD <字段> <数据类型> [FIRST/AFTER <字段>]` **3.仅修改字段数据类型**:`ALTER TABLE <表名> MODIFY <字段名> <新数据类型> []` **修改字段名和数据类型**:`ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>` **注**:此处也可以添加CREATE TABLE时用的约束。 **4.修改字段默认值**:`ALTER TABLE <表名> ALTER <字段> SET DEFAULT <默认值>` **删除字段默认值**:`ALTER TABLE <表名> ALTER DROP <字段> DEFAULT` **5.修改表名**:`ALTER TABLE <旧表名> RENAME <新表名>` # 七、索引 索引是对表内某列数据建立索引文件,以便提高查询效率。 **索引长度**:当数据类型为CHAR/VARCHAR时,可以声明索引长度,将针对前length个字符建立索引;当数据类型为BLOB或TEXT时,必须声明索引长度length。 **声明索引长度的方法**:`<列名>(length)` 如:`CREATE INDEX name_index ON test(name(5))` ## (一)普通索引 **1.在某表上创建索引**:`CREATE INDEX <索引名> ON <表名>(<列名>)` **2.修改表结构时添加索引**:`ALTER TABLE <表名> ADD INDEX <索引名>(<列名>)` **3.创建表时直接指定索引**:类似建表时加在最后的PRIMARY KEY,在括号内的最后加`INDEX <索引名> (<列名>)` 例如:`INDEX index_username (username(5))`:在CREATE TABLE test中,对test表中的username列建立索引,长度为5. **4.删除索引**:`DROP INDEX <索引名> ON <表名>` 如:`DROP INDEX index_username ON test` ## (二)唯一索引 唯一索引要求索引列的值唯一。允许有多个空值。 声明唯一索引,只需将所有INDEX替换为UNIQUE INDEX。 # 八、函数与运算符 函数:*[MySQL 函数 | 菜鸟教程 (runoob.com)](https://links.jianshu.com/go?to=https%3A%2F%2Fwww.runoob.com%2Fmysql%2Fmysql-functions.html)* 运算符:*[MySQL 运算符 | 菜鸟教程 (runoob.com)](https://links.jianshu.com/go?to=https%3A%2F%2Fwww.runoob.com%2Fmysql%2Fmysql-operator.html)*