【跟着例子学MySQL】构建新世界 -- 创建样例库


前言

在这里插入图片描述
举例子,是最简单有效的学习方法。本系列文章以一个贯穿始终的场景,结合多个实例讲解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 INTproductCode CHAR(3)name VARCHAR(30)quantity INTprice DECIMAL(10,2)
1001PENPen Red50001.23
1002PENPen Blue80001.25
1003PENPen Black20001.25
1004PECPencil 2B100000.48
1005PECPencil 2H80000.49

PEN代表水笔,分为红色、蓝色和黑色
PEC代表铅笔,分为2B和2H

创建和删除数据库

你可以使用SQL命令CREATE DATABASE databaseName创建新数据库;并使用DROP DATABASE databaseName删除数据库。同时也可以使用IF EXISTSIF 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 tableNameDROP 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查询语句的用法。


如果喜欢这篇文章,请不要忘记关注🧡、点赞👍和收藏📔哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

架构师昌哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值