MySQL基本命令
基本操作
数据库和表的基本操作
创建数据库
CREATE DATABASE 数据库名;
创建表
CREATE TABLE 表名
(
字段名,数据类型,
字段名,数据类型,
.....
)
查看表结构
DESCRIBE 表名;
其中,该结构中各个字段的含义分别为:
- NULL:表示该列是否能存储 NULL 值;
- Key:表示该列是否已编制索引;
- PRI:表示该列是此表主键的一部分;
- UNI:表示该列是 UNIQUE 索引的一部分;
- MUL:表示在列中某个给定值允许出现多次;
- Default:表示该列是否有默认值,如果有的话值是多少;
- Extra:表示可以获取的与给定列有关的附加信息。
查看建表时的详细语句、存储引擎、字符编码
SHOW CREATE TABLE 表名;
使用SHOW CREATE TABLE语句,不仅仅可以返回给我们建表时所写的详细语句,而且还可以查看存储引擎和字符编码。
注:在表名后加上
\G可以改善排版
修改表名
ALTER TABLE 旧表名 RENAME 新表名;
修改字段名与字段数据类型
修改字段名
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;
注:如果不需要修改字段的数据类型,可以把新字段的数据类型设置为和原来一样,但是!千万不要空着它!
修改字段数据类型
ALTER TABLE 表名 MODIFY 字段名 数据类型;
注:修改字段类型所消耗的计算机资源远超删除并重建。所以我们遇到需要修改的字段,一般会选择删除并重建
添加与删除字段
1.添加字段
一个完整的字段包括:字段名、数据类型和完整性约束。
语法规则:
ALTER TABLE 表名 ADD 新字段名 数据类型 [约束条件] [FIRST|AFTER] 已存在字段名;
以下是在 MySQL 中常用的约束。
- NOT NULL 约束:确保某列不能有 NULL 值。
- DEFAULT 约束:当某列没有指定值时,为该列提供默认值。
- UNIQUE 约束:确保某列中的所有值是不同的。
- PRIMARY Key 约束:唯一标识数据库表中的各行/记录。
- CHECK 约束:CHECK 约束确保某列中的所有值满足一定条件。
注:只要不做
[FIRST|AFTER]的位置说明,在添加字段时MySQL会默认把新字段加入到表的最后一列。
- 不加参数,默认:新字段在最后一列
- FIRST:添加到第一列
- AFTER:添加到指定字段后
示例:
ALTER TABLE Mall_products ADD prod_country varchar(30) AFTER prod_name;
2.删除字段
ALTER TABLE 表名 DROP 字段名;
修改字段的排列位置
ALTER TABLE 表名 MODIFY 字段1 数据类型 FIRST|AFTER 字段2;
其中,字段1指要修改位置的字段,FIRST与AFTER 字段2为可选参数。
删除表的外键约束
ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名;
插入数据
假设有test_1这张表,结构为
| class_id | class_name |
|---|---|
| 则有插入数据语句 |
INSERT INTO test_1 (class_id,class_name) VALUES (1,'软件工程'); -- 不指定数据库(需要提前跳转到目标数据库)
INSERT INTO test.test_1 (class_id,class_name) VALUES (2,'高级开发'); -- 指定数据库
INSERT INTO test_1 (class_id,class_name) VALUES (1,'软件工程'),(2,'高级开发'); -- 一次插入多条数据
注:插入的数据的列数等信息要与表结构保持一致
更新数据
记住UPDATE语句三要素就能轻松掌握,它们分别是:
- 需要更新的表(table)名;
- 需要更新的字段(column)名和它的新内容(value);
- 决定更新哪一条内容(value)的过滤条件。
UPDATE 表名 SET 字段名1 = 内容1, 字段名2 = 内容2, 字段名3 = 内容3 WHERE 过滤条件;
删除数据
DELETE FROM 表名 WHERE 条件语句;
删除表中的所有行
DELETE FROM 表名;
注:TRUNCATE TABLE 语句也可以用来删除表中的所有记录。但是与 DELETE 不同的是,TRUNCATE TABLE 语句直接删除的是表,而不是表中的内容,删除结束后还会重新创建一个表。所以它的执行速度会比 DELETE 语句快。 语法为:
TRUNCATE TABLE 表名;
Select查询(Where限制条件)
带 IN 关键字的查询
IN关键字被用在WHERE语句的后边,用来过滤你所需要查询的内容。更形象的说,IN关键字的使用情形就像点名,点到谁谁就要站出来。
SELECT 字段名 FROM 表名 WHERE 字段名 IN (n1,n2,n3,...);
带NOT IN关键字的查询
加了NOT取反后,就意味着,我们要查询的是除了括号中出现内容外的所有内容。
SELECT 字段名 FROM 表名 WHERE 字段名 NOT IN (n1,n2,n3,...);
带 BETWEEN AND 的范围查询
使用关键字BETWEEN AND提取数据表中的指定数据内容。
BETWEEN AND需要两个参数支持,一个是范围的开始值,另一个就是结束值了。如果字段值满足指定的范围查询条件,就返回这些满足条件的数据内容。
SELECT 字段名 FROM 表名 WHERE 字段名 BETWEEN n1 AND n2;
带NOT BETWEEN AND关键字的查询
像上面介绍的关键字IN一样,我们还可以对关键字BETWEEN AND进行取反,表示查询指定范围之外的值。
SELECT 字段名 FROM 表名 WHERE 字段名 NOT BETWEEN n1 AND n2;
带 LIKE 的字符匹配查询
SQL语句支持很多种通配符,其中可以和LIKE一起搭配使用的就是通配符%和_了。
使用通配符%模糊匹配数据内容
百分号通配符%可以匹配任意长度的字符,甚至包括零字符。
SELECT 字段名 FROM 表名 WHERE 字段名 LIKE '字符%';
其中 % 的位置可以根据需要在字符间变化。
使用通配符_模糊匹配数据内容
下划线通配符_与百分号通配符%类似,也用于模糊匹配。但是区别在于下划线通配符_只能模糊匹配1个字符。如果你执意想用下划线通配符_匹配多个字符,那只能多用几个_咯!
SELECT 字段名 FROM 表名 WHERE 字段名 LIKE '字符_';
其中_的位置可以根据需要在字符间变化。
查询空值
关键字IS NULL检索数据表中指定的字段的空值
SELECT 字段名 FROM 表名 WHERE 字段名 IS NULL;
去除重复结果
消除数据表中重复的数据
SELECT DISTINCT 字段名 FROM 表名;
示例:
SELECT DISTINCT prod_name, prod_country, prod_price
FROM Mall_products;
带 AND 与 OR 的多条件查询
带AND关键字的多条件查询
MySQL在WHERE子句中使用AND操作符限制只有满足所有条件的查询才会被返回
SELECT 字段名 FROM 表名 WHERE 表达式1 AND 表达式2;
带OR关键字的多条件查询
与AND相反,在WHERE声明中使用OR关键字表示只需满足两个条件中的其中一个条件即可返回结果。
SELECT 字段名 FROM 表名 WHERE 表达式1 OR 表达式2;
OR 可以和 AND 一起使用。但是 AND 的优先级要高于 OR 的优先级!
在这里我们不得不提到关键字IN,它能实现与OR相同的功能。
SELECT ID, prod_name, prod_price
FROM Mall_products
WHERE ID IN('BNBG01', 'BR01');
虽然两种写法功能一样,但是我们更推荐使用 IN 关键字。因为它不仅逻辑清晰,执行的速度也会快于 OR 关键字。更重要的是,使用 IN 关键字,我们以后可以执行更加复杂的嵌套语句。
对查询结果进行排序
使用Order By子句来设定你想要按照的字段进行排序并返回结果。
SELECT 字段名 FROM 表名 ORDER BY 字段名 [ASC[DESC]];
- ASC 升序关键字(默认)
- DESC 降序关键字
分组查询
分组查询的单独使用
分组查询的关键字是Group By,查询的是每个分组中 首次出现的一条记录。
SELECT 字段名 FROM 表名 GROUP BY 字段名;
只显示每个分组中的一条记录,意义不大。一般情况下,GROUP BY都和聚合函数一起使用。
使用 LIMIT 限制查询结果的数量
在我们查询大量数据结果时,会返回很多条数据,有需要的记录可能就其中的一条或者几条。比如,实现分页功能,若每页显示10条记录,每次查询就只需要10条记录。
在MySQL中,提供了LIMIT关键字,用来限制查询结果的数量。
SELECT 字段名 FROM 表名 LIMIT [OFFSET,] 记录数;
-
第一个参数,OFFSET,可选参数,表示偏移量,如果不指定默认值为0,表示从查询结果的第一条记录开始,若偏移量为1,则从查询结果中的第二条记录开始,以此类推。
-
第二个参数,记录数,表示返回查询结果的条数。
注意Limit放到最后面,Order By写在Limit前面
查询重命名
tb_student表数据:
id name class_id
1 Emma 2
2 Mary 4
3 Allen (null)
4 Kevin 1
5 Rose 2
6 James 1
tb_class表数据:
id name
1 软件1631
2 软件1632
3 测试1631
4 测试1632
select
tb_student.name as studentName,tb_class.name as className
from tb_student
join tb_class on tb_student.class_id = tb_class.id;
查询结果:(将属性名重命名为自定义字符串)
studentName className
Kevin 软件1631
James 软件1631
Emma 软件1632
Rose 软件1632
Mary 测试1632
连接查询
1.内连接查询
仅将两个表中满足连接条件的行组合起来作为结果集,称为内连接;
表1 [inner] join 表2 on 表1.字段=表2.字段
从表1中取出每一条记录,去表2中与所有的记录进行匹配,匹配必须是某个条件在表1中与表2中相同,最终才会保留结果,否则不保留。inner 关键字可省略不写;on 表示连接条件:条件字段就是代表相同的业务含义
select tb_student.name as studentName,tb_class.name as className from tb_student join tb_class on tb_student.class_id = tb_class.id;
2.外连接查询
以某张表为主,取出里面的所有记录,然后每条与另外一张表进行连接,不管能不能匹配上条件,最终都会保留。能匹配,正确保留;不能匹配,其它表的字段都置空(null),称为外连接。
外连接查询分为左外连接查询和右外连接查询;
表1 left/right [outer] join 表2 on 表1.字段=表2.字段
- 左外连接:在内连接的基础上,还包含表1中所有不符合条件的数据行,并在其中的表2列填写 NULL;
- 右外连接:在内连接的基础上,还包含表2中所有不符合条件的数据行,并在其中的表1列填写 NULL。
左外连接
select tb_student.name as studentName,tb_class.name as className
from tb_student left join tb_class on tb_student.class_id = tb_class.id;
右外连接
select tb_student.name as studentName,tb_class.name as className
from tb_student right join tb_class on tb_student.class_id = tb_class.id;
正则表达式查询
正则表达式关键字为REGEXP,常用于where后
示例:
SELECT prod_name
FROM products
WHERE prod_name REGEXP '.000'
ORDER BY prod_name;
输出:
| prod_name |
|---|
| JetPack 1000 |
| JetPack 2000 |
与LIKE的差别:
LIKE匹配整个列。如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不被返回(除非用通配符)。
而REGEXP在列值内匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。这是一个非常重要的差别
SELECT prod_name
FROM products
WHERE prod_name LIKE '1000'
ORDER BY prod_name;
匹配不到任何内容(只能匹配值为1000的内容,而不能匹配abc1000)
正则OR匹配
# 正则进行or匹配
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name;
匹配具有特殊含义的字符
# 匹配具有特殊含义的字符
SELECT vend_name
FROM vendors
WHERE vend_name REGEXP '\\.'
ORDER BY vend_name;
解释:多数正则表达式实现使用单个反斜杠转移特殊字符,以便能使用这些字符本身。但MySQL要求两个反斜杠(MySQL自己解释一个,正则表达式库解释另一个)
预定义字符类
| 表达式 | 说明 |
|---|---|
[:alnum:] |
字母和数字 |
[:alpha:] |
字母 |
[:digit:] |
数字 |
[:lower:] |
小写字母 |
[:upper:] |
大写字母 |
[:space:] |
空白字符 |
[:punct:] |
标点符号 |
单词边界定位符
| 元字符 | 说明 | 示例(匹配独立单词) |
|---|---|---|
[[:<:]] |
匹配单词的开头边界(左单词边界) | [[:<:]]cat → 匹配 "cat" 开头的单词,不匹配 "catalog" 中的 "cat"? (视引擎而定) |
[[:>:]] |
匹配单词的结尾边界(右单词边界) | cat[[:>:]] → 匹配以 "cat" 结尾的单词 |
约束
添加主键约束
有两种方式可以添加主键约束:
- 在定义列的同时指定主键;
- 在定义完字段之后再指定主键。
添加主键
定义列的同时指定主键
CREATE TABLE t_user1 (
-> userId INT PRIMARY KEY,#PRIMARY KEY的作用是声明主键
-> name VARCHAR(32),
-> password VARCHAR(11),
-> phone VARCHAR(11),
-> email VARCHAR(32)
-> );
在定义完字段之后再指定主键
CREATE TABLE t_user1 (
userId INT,
name VARCHAR(32),
password VARCHAR(11),
phone VARCHAR(11),
email VARCHAR(32),
PRIMARY KEY (userId)
);
多字段联合主键
CREATE TABLE t_emp2
(
name VARCHAR(32),
deptId INT,
salary FLOAT,
PRIMARY KEY(name,deptId) #声明联合主键
)
添加外键约束
CONSTRAINT 外键名 FOREIGN KEY 字段名 REFERENCES 主表名(主键名)
CREATE TABLE t_dept
(
deptId INT PRIMARY KEY,
name VARCHAR(22),
location VARCHAR(50)
);
CREATE TABLE t_emp
(
id INT PRIMARY KEY,
name VARCHAR(22),
deptId INT,
CONSTRAINT fk_emp_dept1 FOREIGN KEY(deptId) REFERENCES t_dept(deptId)
# 将t_dept的deptId这个主键作为外键与t_emp的deptId属性相关联
);
唯一约束
要求该列唯一,允许为空,但是只能有一个空值。唯一约束可以确保一列或者几列不出现重复值。
场景:
定义部门表的部门名称唯一,SQL语句如下:关键词 UNIQUE。
CREATE TABLE t_dept(
id INT PRIMARY KEY,
name VARCHAR(22) UNIQUE,
location VARCHAR(50)
)
非空约束
CREATE TABLE t_dept(
id INT PRIMARY KEY,
name VARCHAR(22) NOT NULL,
location VARCHAR(50)
)
默认约束
默认约束:即给字段一个默认值。
CREATE TABLE t_emp(
id INT PRIMARY KEY,
name VARCHAR(22),
sex VARCHAR(2) DEFAULT '男'
) DEFAULT CHARSET=utf8;
如果是添加字符串型默认值要使用单引号,如果是整型则不需要加任何符号;
如果要添加的是中文默认值,则需要加上DEFAULT CHARSET=utf8;使用英文字符则不需要。
自增约束
CREATE TABLE t_tmp
(
id int PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(32)
)
函数方法
可移植性(Portable):指代码能够在多个数据库管理系统(DBMS)上运行。
- 大多数标准 SQL 语句具有较好的可移植性,不同 DBMS 之间的差异通常较小。
- 数据库函数的可移植性较差,不同 DBMS 支持的函数及其实现往往存在较大差异。
- 为了提高代码的可移植性,通常建议优先使用标准 SQL,尽量减少使用数据库专有函数。
- 但数据库函数通常性能更高,某些功能使用函数实现也更加简单、高效。
- 如果使用了数据库特有的函数,应添加必要的注释,便于后续维护和数据库迁移。
1.concat 拼接两个列(或字符)(concatenate)
SELECT CONCAT(vend_name,'(',vend_country,')') as vend_title
FROM vendors
ORDER BY vend_name;
基本语法
CONCAT(str1, str2, str3, ...)
str1、str2、str3...:要拼接的字符串或字段。- 返回值:将所有参数按顺序连接后的字符串。
2.算数运算(直接算)
SELECT prod_id,quantity,item_price,quantity*item_price AS expanded_price
FROM orderitems
WHERE order_num = 20005;
| 操作符 | 说明 |
|---|---|
+ |
加 |
- |
减 |
* |
乘 |
/ |
除 |
测试计算
SELECT 提供了测试和试验函数与计算的一个很好的办法。虽然 SELECT 通常用来从表中检索数据,但可以省略 FROM 子句,以便简单地访问和处理表达式。
例如:
SELECT 3 * 2;
返回结果:
6
SELECT TRIM('abc');
返回结果:
abc
SELECT NOW();
返回结果:
2026-07-02 12:34:56
NOW()会返回当前日期和时间,实际结果会根据执行时间而变化。
通过这些例子,可以利用 SELECT 对函数、表达式和计算进行快速测试,而无需查询任何数据表。
3. TRIM 去除字符串两端字符
SELECT TRIM(vend_name) AS vend_name
FROM vendors;
基本语法
TRIM([LEADING | TRAILING | BOTH] [remstr] FROM str)
或 MySQL 常用简写:
TRIM(str)
str:要处理的字符串。remstr:要删除的字符,默认为空格。LEADING:仅删除左侧字符。TRAILING:仅删除右侧字符。BOTH:删除两侧字符(默认)。- 返回值:删除指定字符后的字符串。
示例
去除字符串两端空格:
SELECT TRIM(' hello ');
结果:
hello
去除指定字符:
SELECT TRIM('*' FROM '***hello***');
结果:
hello
仅去除左侧字符:
SELECT TRIM(LEADING '0' FROM '000123');
结果:
123
仅去除右侧字符:
SELECT TRIM(TRAILING '0' FROM '123000');
结果:
123
去除两侧指定字符:
SELECT TRIM(BOTH '0' FROM '000123000');
结果:
123
4.聚合函数(Aggregate Functions)
聚合函数用于对一列数据进行统计计算,通常与 SELECT 一起使用。
| 函数 | 作用 |
|---|---|
AVG() |
返回某列的平均值(忽略 NULL 值) |
COUNT() |
返回记录数量,可统计行数或非 NULL 值的数量 |
MAX() |
返回某列的最大值 |
MIN() |
返回某列的最小值 |
SUM() |
返回某列所有值的总和(忽略 NULL 值) |
示例
-- 平均价格
SELECT AVG(prod_price) FROM products;
-- 商品数量
SELECT COUNT(*) FROM products;
-- 最高价格
SELECT MAX(prod_price) FROM products;
-- 最低价格
SELECT MIN(prod_price) FROM products;
-- 库存总数
SELECT SUM(quantity) FROM products;
注意
AVG()、SUM()、MAX()、MIN()会自动忽略NULL值。COUNT(*)统计所有行(包括包含NULL的行)。COUNT(列名)仅统计该列非NULL的记录数。

浙公网安备 33010602011771号