共计 6166 个字符,预计需要花费 16 分钟才能阅读完成。
MySQL 介绍
MySQL是基于结构化查询语言(SQL)的开源关系数据库管理系统(RDBMS)。MySQL运行在几乎所有的平台上,包括 Linux,UNIX 和 Windows。几乎所有编程语言都提供 MySQL 抽象接口封装,有官方和非官方的库,比如 PHP 的PDO-MYSQL, Java的 JDBC, Python 的mysql-connector等。
为什么使用数据库?
在科技发展如此之快,信息爆炸的年代我们使用数据库的地方越来越多。比如网上购物的订单、商品、用户信息,信息流如网易新闻、新浪微博、QQ 空间,学校的成绩系统,游戏的后台服务,警务系统都在使用数据库来存储信息内容。
为什么不直接使用文件来存储呢?
Note:
- 文件的增删改查操作灵活性太差
- 文件的全安性太低
- 在一致性和事务方面不好控
在数据库中能快速查找出你想要的数据,删除的数据可以快速恢复,在出错的情况下可以回滚操作,它的优点能弥补它的缺点。
MySQL 安装
Window
在此页面选择 https://dev.mysql.com/downloads/installer/ 对应的包安装即可。
Linux
使用官网提供的 Yum 源安装,源下载地址:https://dev.mysql.com/downloads/repo/yum/, 选择对应的系统下载源以下安装的整个步骤。
# wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
# sudo rpm mysql57-community-release-el7-11.noarch.rpm
# sudo yum install mysql-community-server
# sudo service mysqld start
详细的安装文档可以从 这里 查看
MySQL 基础入门
下面我们将通过 create
, update
,select
,delete
,order
,group
几个功能在 MySQL 里面的使用。在使用这个几个功能之前,你必须了解结构化查询语言(SQL)的基础知识。
Create(创建)
在学习 create
语法 之前,我们先要知道 MySQL 的数据类型
Type | Size | Desc |
---|---|---|
TINYINT | 1 bytes | 范围为 -128 到 127 或 0 到 255 无符号 |
SAMLLINT | 2 bytes | 范围为 -32768 至 32767 或 0 至 65535 无符号 |
MEDIUMINT | 3 bytes | 范围为 -8388608 至 8388607 或 0 至 16777215 无符号 |
INT | 4 bytes | 范围为 -2147483648 至 2147483647 或 0 至 4294967295 的无符号数 |
BIGINT | 8 bytes | 范围为 -9223372036854775808 至 9223372036854775807 或 0 至 18446744073709551615 无符号 |
FLOAT | 4 bytes | 带有小数点的小数如: 12.5 |
DOUBLE | 8 bytes | 带有小数点的大数如: 10321021.33 |
DECIMAL | Length + 1 or Length + 2 bytes | 一个 DOUBLE 存储为一个字符串,允许一个固定的小数点 |
DATE | 3 bytes | 格式为 YYYY-MM-DD |
DATETIME | 8 bytes | 格式为 YYYY-MM-DD HH:MM:SS |
TIMESTAMP | 4 bytes | 格式为 YYYYMMDDHHMMSS; 可接受的范围在 2037 年结束 |
TIME | 3 bytes | 格式为 HH:MM:SS |
ENUM | 1 or 2 bytes | 枚举的缩写列中的数据可能是组里面一项[1, 2, 3, 4] |
SET | 1, 2, 3, 4, or 8 bytes | 和 ENUM 差不多,只是列可能是多个值 |
CHAR | Length bytes | 固定长度为 0 到 255 个字符的字段 |
VARCHAR | String length + 1 bytes | 固定长度为 0 到 255 个字符的字段 |
BINARY | String length + 1 bytes | 和 char 类型一样只是内容是二进制字符串 |
VARBINARY | String length + 1 bytes | 和 varchar 类型一样内容也是二进制字符串 |
TINYTEXT | String length + 1 bytes | 最大长度为 255 个字符的字符串 |
TEXT | String length + 2 bytes | 最大长度为 65535 个字符的字符串 |
MEDIUMTEXT | String length + 3 bytes | 最大长度为 16777215 个字符的字符串 |
LONGTEXT | String length + 4 bytes | 最大长度为 4294967295 个字符的字符串 |
TINYBLOB | String length + 4 bytes | 和 tinytext 一样但是数据是二进制形式 |
BLOB | String length + 4 bytes | 和 text 一样但是数据是二进制形式 |
LONGBLOB | String length + 4 bytes | 和 mediumtext 一样但是数据是二进制形式 |
LONGBLOB | String length + 4 bytes | 和 longtext 一样但是数据是二进制形式 |
JSON | String length + 4 bytes | 代表列的数据为 JSON 数据类型的值如: {“name”:“小明”} |
现在我们将创建一个学生课程成绩单表。我们可以想下这个表需要那些字段如:姓名
、 学号
、 课程名
、 课程分
、 班级
、 院系
、 专业
。
我们只是一个成绩单可以只要 学号
、 课程名
、 课程分
,其它几个都是学生信息。那我们这个表需要这些学生信息吗?
这是一个关于 mysql 表设计的问题也和项目的设计有关系,我们可以理解为冗余设计和非冗余设计。
我们就以非冗余设计这个表,在设计原则上应该为每个表建立一个自增主键(ID)。
在创建表之前我们需要先创建使用 create database 库名
语法创建一个库。
# mysql -u root // 以 root 用户进入 mysql 控制台
mysql> create database coures;
Query OK, 1 row affected (0.00 sec)
mysql> use coures;
Database changed
mysql> CREATE TABLE `course` (`id` SMALLINT(6) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '课程 ID 号',
`name` varchar(50) NOT NULL COMMENT '课程名',
PRIMARY KEY (`id`)
) ENGINE=innodb CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE TABLE `course_score` (`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '自增 ID',
`sid` INT(11) UNSIGNED NOT NULL COMMENT '学号,不可以为负数设置 unsigned',
`cid` SMALLINT(6) UNSIGNED NOT NULL COMMENT '课程 ID',
`score` SMALLINT(6) UNSIGNED NOT NULL COMMENT '分数字段',
PRIMARY KEY (`id`),
UNIQUE KEY (`sid`, `cid`)
) ENGINE=innodb charset = utf8;
Query OK, 0 rows affected (0.02 sec)
在 course
库中创建两了 course
和 course_score
两个表课程表和课程分数表。为什么使用 UNIQUE KEY (sid, cid)
, 因为一个学号一门课程只有一次分数,使用唯一索引来限制数据.
- CREATE TABLE
tableName
() ENGINE=innodb 创建一个表,设置表引擎为 innodb cid
SMALLINT(6) UNSIGNED NOT NULL 设置一个字段名为 sid、类型为无符号 smallint、NOT NULL 不能为 null 值- PRIMARY KEY (
column
) 设置一个主键 - UNIQUE KEY (
column
, [‘column’]) 设置一个唯一索引
Insert(插入数据)
insert into
语法有两种。
- insert into 表名 (字段名) values (‘值’)
- insert into 表名 set 字段名 =’值’
可以从两种格式中选择一种自己的喜欢。在使用使用 values (‘值’) 这种格式的时候,可以使用 values ('值'), ('值'), ('值')
来插入多行数据。如果插入的字段为自增主键,那我们可以省略这个字段或者将它的值设置为 null, 系统会自动给行设置这个值。下面我们将为上面两个表插入一些数据来测试。在插入分数之前我们先要使用select
语句拿到所有课程 ID 号,因为分数表中使用了课程 ID 来关键分数, 学号先自己模拟几个以下 SQL 完成整个步骤。
mysql> INSERT INTO `course` (`name`) VALUES ('C 语言'), ('数据结构'), ('英语'), ('高等数学'), ('java 软件设计'), ('计算机系统组成原理');
Query OK, 6 rows affected (0.01 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> select * from course;
+----+-----------------------------+
| id | name |
+----+-----------------------------+
| 1 | C 语言 |
| 2 | 数据结构 |
| 3 | 英语 |
| 4 | 高等数学 |
| 5 | java 软件设计 |
| 6 | 计算机系统组成原理 |
+----+-----------------------------+
6 rows in set (0.00 sec)
mysql> INSERT INTO `course_score` (`sid`, `cid`, `score`) VALUES (9527, 1, 85), (9527, 2, 90), (9527, 3, 70), (9527, 4, 98), (9527, 5, 90), (9527, 6, 92);
uery OK, 6 rows affected (0.01 sec)
Records: 6 Duplicates: 0 Warnings: 0
以上语句就完成了为学号 9527 这个人插入了六门课程的成绩。如果列字段是字符类型那么他的值必须是(9527, 1, '值')
, 整型也可以值两旁边加上单引号。
Select(查询数据)
select
的语法有很多种可以查看 这里, 这里我们简单介绍下使用,其它比较复杂的查询可以自己学习。我们将通过下面几个功能来学习查询语句
- 使用 WHERE 列出某个学号的所有课程成绩
- 使用 SUM 列出某个学号的成绩总和
- 使用 ORDER BY 列出某个学号的成绩排序(从高到低)
- 使用 LIMIT 取 n 条数据
所有课程成绩
mysql> SELECT cid, score FROM `course_score` WHERE sid = 9527;
+-----+-------+
| cid | score |
+-----+-------+
| 1 | 85 |
| 2 | 90 |
| 3 | 70 |
| 4 | 98 |
| 5 | 90 |
| 6 | 92 |
+-----+-------+
6 rows in set (0.01 sec)
SELECT cid, score
的意思是查询只表出 cid 和 score 的值,中间的逗号是隔开多个字段,如果需要查询所有字段可以使有 *
代替 (SELECT *
)。 FROM course_score
的意思是从那张表查询,我们这里的表是 course_score 表。 WHERE sid=9527
的意思是查询条件,这里只设置了一个条件就是 sid=9527,也可以使用多个条件,多个条件使用 AND
,OR
来连接如:WHERE sid=9527 AND cid=1
这里是只这个学号的课程 ID 为 1 的分数。在条件中算术运算符有很多种 =
号只是其中一种 ( 查看这里)。
成绩总和
mysql> SELECT SUM(score) FROM `course_score` WHERE sid = 9527;
+------------+
| sum(score) |
+------------+
| 525 |
+------------+
1 row in set (0.00 sec)
SUM(score)
计算查询结果条数的 score 字段的总和,这里查出来是 6 条那就是 6 个成绩的总和。
成绩排序
mysql> SELECT cid,score FROM `course_score` WHERE sid = 9527 ORDER BY score DESC;
+-----+-------+
| cid | score |
+-----+-------+
| 4 | 98 |
| 6 | 92 |
| 2 | 90 |
| 5 | 90 |
| 1 | 85 |
| 3 | 70 |
+-----+-------+
6 rows in set (0.00 sec)
ORDER BY score DESC
是结果以 score 的降序输出,就是分数最高的排在前,如果 DESC 不写默认将是 ASC 以升序输出。
N 条数据
mysql> select cid,score from `course_score` where sid = 9527 LIMIT 3;
+-----+-------+
| cid | score |
+-----+-------+
| 1 | 85 |
| 2 | 90 |
| 3 | 70 |
+-----+-------+
3 rows in set (0.00 sec)
mysql> select cid,score from `course_score` where sid = 9527 LIMIT 3, 3;
+-----+-------+
| cid | score |
+-----+-------+
| 4 | 98 |
| 5 | 90 |
| 6 | 92 |
+-----+-------+
3 rows in set (0.00 sec)
LIMIT 3, 3
的意思和一些程序语言函数功能差不多,LIMIT offset, length
将 offset 条丢弃取出 length 条。
Update(更新数据)
更新语法比较简单,它的 where
部分是和 select
语法一样的使用,它也可以使用 limit
和order by
只是一般不会这么使用。
下面我们将更新某个学号的一门课程成绩改为 100。
mysql> UPDATE course_score SET score=100 WHERE sid=9527 AND cid=6;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT cid,score FROM `course_score` WHERE sid = 9527 AND cid=6;
+-----+-------+
| cid | score |
+-----+-------+
| 6 | 100 |
+-----+-------+
1 row in set (0.00 sec)
Delete(删除数据)
删除数据也是在项目中必不可少,删除的语法和 update
一样简单。下面我们将删除某个学号的英语课程。
mysql> DELETE FROM `course_score` WHERE sid = 9527 AND cid=3;
Query OK, 1 row affected (0.01 sec)
Note:
在select
,update
,delete
中不带where
操作都对表中所有数据的操作。
这篇教程就到此为止,欢迎大家给我指正错误相互学习,互相进步。
给大家推荐一本书籍:高性能 MySQL