m

全干工程师

MySql入门基础教程

MySQL介绍

MySQL是基于结构化查询语言(SQL)的开源关系数据库管理系统(RDBMS)。MySQL运行在几乎所有的平台上,包括Linux,UNIX和Windows。几乎所有编程语言都提供MySQL抽象接口封装,有官方和非官方的库,比如PHPPDO-MYSQL, JavaJDBC, Pythonmysql-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, updateselectdeleteordergroup几个功能在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库中创建两了 coursecourse_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:
select, update, delete中不带where操作都对表中所有数据的操作。

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

留言