MySql入门基础教程
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