MySql入门基础教程

2,633次阅读

共计 6166 个字符,预计需要花费 16 分钟才能阅读完成。

MySQL 介绍

MySQL是基于结构化查询语言(SQL)的开源关系数据库管理系统(RDBMS)。MySQL运行在几乎所有的平台上,包括 Linux,UNIX 和 Windows。几乎所有编程语言都提供 MySQL 抽象接口封装,有官方和非官方的库,比如 PHPPDO-MYSQLJavaJDBCPythonmysql-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 基础入门

下面我们将通过 createupdateselectdeleteordergroup 几个功能在 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 语法一样的使用,它也可以使用 limitorder 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: 
selectupdatedelete 中不带 where 操作都对表中所有数据的操作。

这篇教程就到此为止,欢迎大家给我指正错误相互学习,互相进步。 
给大家推荐一本书籍:高性能 MySQL

正文完
 
Blood.Cold
版权声明:本站原创文章,由 Blood.Cold 2019-06-06发表,共计6166字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。