前言
举例子,是最简单有效的学习方法。本系列文章以一个贯穿始终的场景,结合多个实例讲解MySQL的基本用法。
❔ 为什么要写这个系列?
- 模仿是最好的老师,实践是检验成果的方法。
- 本系列以实操样例和应用场景为核心,将MySQL基本用法贯穿其中,达到学以致用的效果。
❔ 为什么要学习MySQL?
- MySQL是最常用的数据库之一,具有简单易用的特点,适合初学者学习
- 数据库的基本用法有相通之处,学会MySQL可以为学习其他数据库打下良好基础
❔ 跟别的入门教材有什么不同?
- 以一个贯穿始终的应用场景为主线,渐进地讲解用法
- 难度适中,既有基础方法,也有值得注意的关键细节
❔ 本系列文章不包含哪些内容?
该系列文章的目标是,将最核心的知识,以最直接的方式,呈现给初学者。因此不包含:
- MySQL安装方法
- MySQL系统管理方法,例如备份、恢复、导入导出等
- 高级主题,例如数据库监控、数据库调优和SQL优化
MySQL常用命令总览
下面是MySQL最常用命令列表,通过它可以对MySQL用法建立整体认识,同时也可以把它当做MySQL命令备忘录。
-- 数据库级
DROP DATABASE databaseName -- 删除数据库(不可恢复!)
DROP DATABASE IF EXISTS databaseName -- 如果存在就删除
CREATE DATABASE databaseName -- 创建一个新的数据库
CREATE DATABASE IF NOT EXISTS databaseName -- 仅当不存时创建数据库
SHOW DATABASES -- 显示所有数据库
USE databaseName -- 设置当前默认数据库
SELECT DATABASE() -- 显示默认数据库
SHOW CREATE DATABASE databaseName -- 显示CREATE DATABASE语句
-- 表级别
DROP TABLE [IF EXISTS] tableName, ... -- 删除表
CREATE TABLE [IF NOT EXISTS] tableName ( -- 创建表
columnName columnType columnAttribute, ... -- 列定义
PRIMARY KEY(columnName), -- 主键
FOREIGN KEY (columnNmae) REFERENCES tableName (columnNmae) -- 外键
)
SHOW TABLES -- 显示默认数据库中所有表
DESCRIBE|DESC tableName -- 展示表的详细信息
ALTER TABLE tableName ... -- 修改表, 例如, 增加列或删除列
ALTER TABLE tableName ADD columnDefinition
ALTER TABLE tableName DROP columnName
ALTER TABLE tableName ADD FOREIGN KEY (columnNmae) REFERENCES tableName (columnNmae)
ALTER TABLE tableName DROP FOREIGN KEY constraintName
SHOW CREATE TABLE tableName -- 显示表的CREATE TABLE语句
-- 行级别
INSERT INTO tableName
VALUES (column1Value, column2Value,...) -- 向所有列插入一行数据
INSERT INTO tableName
VALUES (column1Value, column2Value,...), ... -- 向所有列插入多行数据
INSERT INTO tableName (column1Name, ..., columnNName)
VALUES (column1Value, ..., columnNValue) -- 向指定列插入一行数据
DELETE FROM tableName WHERE criteria -- 删除特定的行
UPDATE tableName SET columnName = expr, ... WHERE criteria -- 更新特定的行
SELECT * | column1Name AS alias1, ..., columnNName AS aliasN
FROM tableName
WHERE criteria
GROUP BY columnName
ORDER BY columnName ASC|DESC, ...
HAVING groupConstraints
LIMIT count | offset count
-- 其他
SHOW WARNINGS; -- 显示前一条语句的报警信息
准备工作
SQL关键字和命令不区分大小写。为了清晰起见,它们以大写的形式显示。名称或标识符(数据库名称、表名、列名等)在某些系统中是区分大小写的,但在其他系统中则不是。因此,最好将标识符视为区分大小写的。
SHOW DATABASES
你可以使用SHOW DATABASES
列出服务器中的所有数据。
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
........
❗ 注意:数据库“mysql”、“information_schema”和“performance_schema”是MySQL内部使用的系统数据库。“test”数据库是在安装过程中为测试专门安装的数据库。
假设,存在一个产品销售数据库,它由多个表组成,例如,产品、客户、供应商、订单、付款、员工等。我们把产品销售数据库称为“productsales”,产品表称为“products”。"products"表的定义如下:
productID INT | productCode CHAR(3) | name VARCHAR(30) | quantity INT | price DECIMAL(10,2) |
---|---|---|---|---|
1001 | PEN | Pen Red | 5000 | 1.23 |
1002 | PEN | Pen Blue | 8000 | 1.25 |
1003 | PEN | Pen Black | 2000 | 1.25 |
1004 | PEC | Pencil 2B | 10000 | 0.48 |
1005 | PEC | Pencil 2H | 8000 | 0.49 |
PEN代表水笔,分为红色、蓝色和黑色
PEC代表铅笔,分为2B和2H
创建和删除数据库
你可以使用SQL命令CREATE DATABASE databaseName
创建新数据库;并使用DROP DATABASE databaseName
删除数据库。同时也可以使用IF EXISTS
或IF NOT EXISTS
条件。例如:
mysql> CREATE DATABASE productsales;
Query OK, 1 row affected (0.03 sec)
mysql> DROP DATABASE productsales;
Query OK, 0 rows affected (0.11 sec)
mysql> CREATE DATABASE IF NOT EXISTS productsales;
Query OK, 1 row affected (0.01 sec)
mysql> DROP DATABASE IF EXISTS productsales;
Query OK, 0 rows affected (0.00 sec)
❗ 注意:请非常小心地使用DROP(和DELETE)命令,因为已删除的实体是不可恢复的。没有撤消!
SHOW CREATE DATABASE
CREATE DATABASE databaseName
使用了一些默认值。你可以执行“SHOW CREATE DATABASE databaseName”来显示完整的命令并检查这些默认值。我们使用\G(而不是“;”)来垂直显示结果,以防结果太宽影响阅读。
mysql> CREATE DATABASE IF NOT EXISTS productsales;
mysql> SHOW CREATE DATABASE productsales \G
*************************** 1. row ***************************
Database: productsales
Create Database: CREATE DATABASE `productsales` /*!40100 DEFAULT CHARACTER SET latin1 */
反引用标识符(`name`)
未用引号封装的名称或标识符(如数据库名称、表名称和列名)不能包含空字符和特殊字符,或与MySQL关键字(如ORDER和DESC)冲突。你可以使用`name`的形式封装标识符,以打破这种限制,允许包含空格、特殊字符或MySQL关键字。
为了健壮性,SHOW
命令将所有标识符用反引用封装,如上面的示例所示。
设置默认数据库
命令USE databaseName
将特定的数据库设置为默认(或当前)数据库。
如果是默认数据库中的表,你可以直接使用表名称来引用。但如果是其它数据库的表,你必须使用完全限定名“databaseName.tableName”来引用。
在我们的示例中,有一个名为“productsales”的数据库,其中有一个名为“products”的表。如果我们使用USE productsales
来设置"productsales"作为默认数据库,就可以简单地称该表为“products”。否则,我们需要将该表称为“productsales.products”。
若要显示当前的默认数据库,使用命令SELECT DATABASE()
。
创建和删除表
您可以使用CREATE TABLE tableName
和DROP TABLE tableName
命令在默认数据库中创建一个新表,同时也可以使用“IF EXISTS”或“IF NOT EXISTS”条件。要创建表,必须提供列的名称、类型和属性来定义表的模式。
让我们在“productsales”数据库中创建一个“products”表。
-- 删除数据库“productsales”,如果它存在。
-- 注意DROP(和删除)操作是不可逆转的和不可恢复的!
mysql> DROP DATABASE IF EXISTS productsales;
Query OK, 1 rows affected (0.31 sec)
-- 创建数据库“productsales”
mysql> CREATE DATABASE productsales;
Query OK, 1 row affected (0.01 sec)
-- 显示服务器中的所有数据库
-- 以确认“productsales”数据库已经创建.
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| productsales |
| ...... |
-- 将“productsales”设置为默认数据库,以便直接引用其表。
mysql> USE productsales;
Database changed
-- 显示当前数据库
mysql> SELECT DATABASE();
+--------------+
| DATABASE() |
+--------------+
| productsales |
+--------------+
-- 显示当前数据库中的所有表。
-- “productsales”还没有表(空集)。
mysql> SHOW TABLES;
Empty set (0.00 sec)
-- 创建“products”表。 列定义请参考下面的“解释说明”小节
mysql> CREATE TABLE IF NOT EXISTS products (
productID INT UNSIGNED NOT NULL AUTO_INCREMENT,
productCode CHAR(3) NOT NULL DEFAULT '',
name VARCHAR(30) NOT NULL DEFAULT '',
quantity INT UNSIGNED NOT NULL DEFAULT 0,
price DECIMAL(7,2) NOT NULL DEFAULT 99999.99,
PRIMARY KEY (productID)
);
Query OK, 0 rows affected (0.08 sec)
-- 显示所有表以确认“products”表创建成功
mysql> SHOW TABLES;
+------------------------+
| Tables_in_productsales |
+------------------------+
| products |
+------------------------+
-- 描述“products”表的字段(列)
mysql> DESCRIBE products;
+-------------+------------------+------+-----+----------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+----------+----------------+
| productID | int(10) unsigned | NO | PRI | NULL | auto_increment |
| productCode | char(3) | NO | | | |
| name | varchar(30) | NO | | | |
| quantity | int(10) unsigned | NO | | 0 | |
| price | decimal(7,2) | NO | | 99999.99 | |
+-------------+------------------+------+-----+----------+----------------+
-- 显示MySQL用于创建此表的完整创建表语句
mysql> SHOW CREATE TABLE products \G
*************************** 1. row ***************************
Table: products
Create Table:
CREATE TABLE `products` (
`productID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`productCode` char(3) NOT NULL DEFAULT '',
`name` varchar(30) NOT NULL DEFAULT '',
`quantity` int(10) unsigned NOT NULL DEFAULT '0',
`price` decimal(7,2) NOT NULL DEFAULT '99999.99',
PRIMARY KEY (`productID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
解释说明
我们在“products”表中定义了5列:productID、productCode、name、quantity和price,类型如下:
- productID是无符号INT- 非负整数。
- productCode是CHAR (3) - 一个包含3个字符的固定长度的字符串。
- name是VARCHAR(30) - 最多30个字符的可变长度字符串。
productCode使用固定长度的字符串,因为假设productCode恰好包含3个字符。另一方面,使用可变长字符串作为name,因为当长度变化时,VARCHAR比CHAR更有效。
- quantity的类型也是无符号INT(非负整数)。
- price是DECIMAL(10,2) - 一个有两位小数的十进制数。
DECIMAL是精确的(表示为带有固定小数点的整数)。另一方面,FLOAT和DOUBLE(实数)不是精确的,是近似值。建议使用DECIMAL作为货币类型。
属性"NOT NULL"指该列不能包含NULL值。NULL是一个特殊值,表示“无值”、“未知值”或“缺失值”。在我们的例子中,这些列应该有一个合适的值。我们还设置了这些列的默认值。如果在记录创建期间没有指定值,列将采用其默认值。
我们将列“productID”设置为主键。主键列的值必须是唯一的。每个表都应该包含一个主键。这确保了每一行都可以与其他行区分开来。你可以指定一列或一组列(例如,firstName和lastName)作为主键。在主键列上会自动建立索引,以方便快速搜索。主键也被其他表用作参考(外键)。
我们将列“productID”设置为AUTO_INCREMENT,默认的起始值为1。当向AUTO_INCREMENT列插入NULL(推荐)、0或缺省值时,该列将插入最大值+1。
插入数据
我们将第一个记录的“productID”设置为1001,其余“productID”插入NULL或缺省值。请注意,字符串必须用一对单引号(或双引号)括起来。
-- 插入一个包含所有列值的行
mysql> INSERT INTO products VALUES (1001, 'PEN', 'Pen Red', 5000, 1.23);
Query OK, 1 row affected (0.04 sec)
-- 在一个命令中插入多个行
-- 通过NULL值使得自增列实现 max_value+1 效果
mysql> INSERT INTO products VALUES
(NULL, 'PEN', 'Pen Blue', 8000, 1.25),
(NULL, 'PEN', 'Pen Black', 2000, 1.25);
Query OK, 2 rows affected (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 0
-- 将值插入到选定的列中
-- 自增列缺省值也会导致max_value + 1
mysql> INSERT INTO products (productCode, name, quantity, price) VALUES
('PEC', 'Pencil 2B', 10000, 0.48),
('PEC', 'Pencil 2H', 8000, 0.49);
Query OK, 2 row affected (0.03 sec)
-- 缺少的列将使用默认值
mysql> INSERT INTO products (productCode, name) VALUES ('PEC', 'Pencil HB');
Query OK, 1 row affected (0.04 sec)
-- 第二列(productCode)定义为NULL
mysql> INSERT INTO products values (NULL, NULL, NULL, NULL, NULL);
ERROR 1048 (23000): Column 'productCode' cannot be null
-- 查询数据
mysql> SELECT * FROM products;
+-----------+-------------+-----------+----------+------------+
| productID | productCode | name | quantity | price |
+-----------+-------------+-----------+----------+------------+
| 1001 | PEN | Pen Red | 5000 | 1.23 |
| 1002 | PEN | Pen Blue | 8000 | 1.25 |
| 1003 | PEN | Pen Black | 2000 | 1.25 |
| 1004 | PEC | Pencil 2B | 10000 | 0.48 |
| 1005 | PEC | Pencil 2H | 8000 | 0.49 |
| 1006 | PEC | Pencil HB | 0 | 9999999.99 |
+-----------+-------------+-----------+----------+------------+
6 rows in set (0.02 sec)
-- 删除最后一行
mysql> DELETE FROM products WHERE productID = 1006;
INSERT INTO 语法
我们可以使用INSERT INTO
语句插入一个包含所有列值的新行,语法如下:
INSERT INTO tableName VALUES (firstColumnValue, ..., lastColumnValue) -- 所有列
你需要按照创建表时列的顺序列出值,用逗号分隔。对于字符串数据类型(CHAR、VARCHAR)的列,用一对单引号(或双引号)括起来值。对于数字类型(INT,DECIMAL,FLOAT,DOUBLE)的列,只需放置数字即可。
你还可以在一条INTO语句中插入多行:
INSERT INTO tableName VALUES
(row1FirstColumnValue, ..., row1lastColumnValue),
(row2FirstColumnValue, ..., row2lastColumnValue),
...
要仅在选定列上插入一行,其余列将使用默认值:
-- 插入包含选定列的单行
INSERT INTO tableName (column1Name, ..., columnNName) VALUES (column1Value, ..., columnNValue)
-- 插入多个记录
INSERT INTO tableName
(column1Name, ..., columnNName)
VALUES
(row1column1Value, ..., row2ColumnNValue),
(row2column1Value, ..., row2ColumnNValue),
...
未完待续
下一篇👉《【跟着例子学MySQL】窥探数据本质 – Select语句基础》我们接着介绍SELECT
查询语句的用法。
如果喜欢这篇文章,请不要忘记关注🧡、点赞👍和收藏📔哦!