安装mysql
Ubuntu上安装MySQL非常简单只需要几条命令就可以完成。
sudo apt-get install mysql-server
sudo apt-get isntall mysql-client
sudo apt-get install libmysqlclient-dev
安装过程中会提示设置密码什么的,注意设置了不要忘了,安装完成之后可以使用如下命令来检查是否安装成功:
sudo netstat -tap | grep mysql
通过上述命令检查之后,如果看到有mysql 的socket处于 listen 状态则表示安装成功。
登陆mysql数据库可以通过如下命令:
mysql -u root -p
-u 表示选择登陆的用户名, -p 表示登陆的用户密码,上面命令输入之后会提示输入密码,此时输入密码就可以登录到mysql。
MySQL
MySQL 是应用最广泛的关系数据库。关系数据库使用关系模型作为数据组织存储的的方式,可以分为四级结构:
- 数据库,比如一个应用对应一个数据库;
- 表,一个数据库包含若干张表;
- 记录,一个表包含多条记录;
- 字段,一条记录包含若干字段;
一张表的结构可以想象成一张 Excel 表,有多个字段组成,每一个字段都可以存储特定类型的数据,比如字符串或者数字,在创建表的时可以指定类型。表与表之间通过关系连接(逻辑上的关系),查询数据时可以通过关系跨越多张表进行查询。
关系数据库最重要的特性是是满足 ACID 性质:
- A atomicity 代表原子性;
- C consistency 代表一致性;
- I isolation 代表隔离性;
- D durability 代表持久性;
ACID 能够保证事务的可靠性,什么意思呢?就是说能够保证一系列的数据库操作组成的一个完整逻辑过程,要么全部被执行,要么彻底不执行,不会出现执行一半的情况。例如银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和,构成一个完整的逻辑过程,不可拆分。
为了满足 ACID 性质,MySQL 支持各种约束,比如插入一条数据时,需要检查外键是否存在,这些操作虽然能确保数据的一致性,但是很多时候却降低了并发操作的能力,所以在如今的互联网网站中,如果有高并发的需求往往不再使用关系数据库的 ACID 性质,更有的直接使用非关系数据库。
除此之外,这里再补充几点关系数据库中关系键的基本概念知识,以帮助理解下文内容。
- 主键(英语:primary key)。数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。
- 外键(英语:foreign key)。其实在关系数据库中,每个数据表都是由关系来连系彼此的关系,父数据表(Parent Entity)的主键(primary key)会放在另一个数据表,当做属性以创建彼此的关系,而这个属性就是外键。
比如,学生跟老师之间对应着教学关系,学生数据表会有个属性叫指导老师(外键),而这个值就是对应到老师数据表的老师代号(主键)。
mysql基本操作
启动/停止mysql
sudo service mysql start
sudo service mysql stop
数据库的创建和删除
创建数据库非常简单,只需要输入 create database <db_name>; 就可以了,其中 <db_name> 代表数据库名称,查看所有的数据库可以通过 show databases; (注意,这里多了一个 s) 命令,而删除一个数据库则可以通过 drop database <db_name>; ,
- 创建
mysql> create database news;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| news |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
- 删除
mysql> drop database news;
Query OK, 0 rows affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
表的基本操作
- 表创建和删除
数据库创建成功以后,就可以创建表了。在创建表之前,需要通过 use shiyanlou; 命令连接到 shiyanlou 数据库。
创建表的基本命令如下:
CREATE TABLE 表的名字
(
列名a 数据类型(数据长度),
列名b 数据类型(数据长度),
列名c 数据类型(数据长度)
);
数据类型 | 大小(字节) | 用途 | 格式 |
---|---|---|---|
FLOAT | 4 | 单精度浮点数 | |
DOUBLE | 8 | 双精度浮点数 | |
INT | 4 | 整数 | |
SET | 4 | 多选 | SET('1','2','3') |
DATE | 3 | 日期 | YYYY-MM-DD |
TIME | 3 | 时间点或持续时间 | HH:MM:SS |
YEAR | 1 | 年份值 | YYYY |
CHAR | 0~255 | 定长字符串 | |
VARCHAR | 0~255 | 变长字符串 | |
TEXT | 0~65535 | 长文本数据 | |
ENUM | 单选,比如性别 | ENUM('a','b','c') |
下面尝试创建一张表名为 user 的表,该表有 3 个字段:
- id 编号,整数类型,使用 int 类型;
- name 用户名,字符串,使用 varchar 可变字符类型;
- email 邮箱,字符串, 使用 varchar 可变字符型;
mysql> use pyclass;
Database changed
mysql> create table user(
-> id int(10),
-> name varchar(20),
-> email varchar(64)
-> );
Query OK, 0 rows affected (0.47 sec)
mysql> show tables;
+-------------------+
| Tables_in_pyclass |
+-------------------+
| user |
+-------------------+
1 row in set (0.00 sec)
通过以上命令就可以创建出 user 表,需要注意的是当输入 create table user 回车以后,客户端会自动识别出这是一个未完成的命令,所以会出现提示符 -> 。表创建成功以后,可以通过 show tables; 查看所有的表, 删除表可以通过 drop table <table_name>; 。
如果想查看一张表的字段信息,可以通过 show create table <table_name>; 或者 describe <table_name>; 指令,如下所示:
mysql> show create table user;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| user | CREATE TABLE `user` (
`id` int(10) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`email` varchar(64) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
mysql> describe user;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(10) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| email | varchar(64) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
- 插入数据
表创建成功以后,就可以插入数据了。可以使用 insert 指令插入数据,完整的命令格式如下:
INSERT INTO 表的名字(列名a,列名b,列名c) VALUES(值1,值2,值3);
当插入的值和和表定义的字段数量一致且顺序一致时,可以忽略列名信息,通过以下命令往 user 表中插入数据:
mysql> insert into user(id,name,email) values(1,'mmm','mmm@qq.com');
Query OK, 1 row affected (0.46 sec)
mysql> insert into user values(2,'zzz','zzz@qq.com');
Query OK, 1 row affected (0.01 sec)
查看插入的数据:
mysql> select * from user;
+------+------+------------+
| id | name | email |
+------+------+------------+
| 1 | mmm | mmm@qq.com |
| 2 | zzz | zzz@qq.com |
+------+------+------------+
2 rows in set (0.00 sec)
- 修改表名
重命名一张表的语句有多种形式,以下 3 种格式效果是一样的:
RENAME TABLE 原名 TO 新名字;
ALTER TABLE 原名 RENAME 新名;
ALTER TABLE 原名 RENAME TO 新名;
使用命令尝试修改 user 的名字为 user1 :
mysql> rename table user to user1;
Query OK, 0 rows affected (0.44 sec)
mysql> show tables;
+-------------------+
| Tables_in_pyclass |
+-------------------+
| user1 |
+-------------------+
1 row in set (0.00 sec)
mysql> alter table user1 rename user;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+-------------------+
| Tables_in_pyclass |
+-------------------+
| user |
+-------------------+
1 row in set (0.00 sec)
- 修改表结构
在表中增加一列的语句格式为:
ALTER TABLE 表名字 ADD COLUMN 列名字 数据类型 约束;
ALTER TABLE 表名字 ADD 列名字 数据类型 约束;
增加age字段,默认值18:
mysql> alter table user add age int(4) default 18;
Query OK, 0 rows affected (0.56 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select * from user;
+------+------+------------+------+
| id | name | email | age |
+------+------+------------+------+
| 1 | mmm | mmm@qq.com | 18 |
| 2 | zzz | zzz@qq.com | 18 |
+------+------+------------+------+
2 rows in set (0.00 sec)
可以发现:新增加的列,被默认放置在这张表的最右边。如果要把增加的列插入在指定位置,则需要在语句的最后使用AFTER关键词(“AFTER 列1” 表示新增的列被放置在 “列1” 的后面)。
比如我们新增一列 weight (体重)放置在 name 的后面:
mysql> alter table user add weight int(4) default 120 after name;
Query OK, 0 rows affected (0.60 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select * from user;
+------+------+--------+------------+------+
| id | name | weight | email | age |
+------+------+--------+------------+------+
| 1 | mmm | 120 | mmm@qq.com | 18 |
| 2 | zzz | 120 | zzz@qq.com | 18 |
+------+------+--------+------------+------+
2 rows in set (0.00 sec)
上面的效果是把新增的列加在某位置的后面,如果想放在第一列的位置,则使用 FIRST 关键词,如语句:
ALTER TABLE employee ADD test INT(10) DEFAULT 11 FIRST;
删除表中的一列和刚才使用的新增一列的语句格式十分相似,只是把关键词 ADD 改为 DROP ,语句后面不需要有数据类型、约束或位置信息。具体语句格式:
ALTER TABLE 表名字 DROP COLUMN 列名字;
或: ALTER TABLE 表名字 DROP 列名字;
我们把刚才新增的 age 删除:
mysql> alter table user drop age;
Query OK, 0 rows affected (0.52 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select * from user;
+------+------+--------+------------+
| id | name | weight | email |
+------+------+--------+------------+
| 1 | mmm | 120 | mmm@qq.com |
| 2 | zzz | 120 | zzz@qq.com |
+------+------+--------+------------+
2 rows in set (0.00 sec)
重命名一列,这条语句其实不只可用于重命名一列,准确地说,它是对一个列做修改(CHANGE) :
ALTER TABLE 表名字 CHANGE 原列名 新列名 数据类型 约束;
注意:这条重命名语句后面的 “数据类型” 不能省略,否则重命名失败。
当原列名和新列名相同的时候,指定新的数据类型或约束,就可以用于修改数据类型或约束。需要注意的是,修改数据类型可能会导致数据丢失,所以要慎重使用。
我们用这条语句将 “weight” 一列重命名为汉语拼音 “tizhong” ,效果如下:
mysql> alter table user change weight tizhong int(4) default 125;
Query OK, 0 rows affected (0.47 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select * from user;
+------+------+---------+------------+
| id | name | tizhong | email |
+------+------+---------+------------+
| 1 | mmm | 120 | mmm@qq.com |
| 2 | zzz | 120 | zzz@qq.com |
+------+------+---------+------------+
2 rows in set (0.00 sec)
要修改一列的数据类型,除了使用刚才的CHANGE语句外,还可以用这样的MODIFY语句:
ALTER TABLE 表名字 MODIFY 列名字 新数据类型;
再次提醒,修改数据类型必须小心,因为这可能会导致数据丢失。在尝试修改数据类型之前,请慎重考虑。
大多数时候我们需要做修改的不会是整个数据库或整张表,而是表中的某一个或几个数据,这就需要我们用下面这条命令达到精确的修改:
UPDATE 表名字 SET 列1=值1,列2=值2 WHERE 条件;
比如,我们要把 zzz 的 tizhong 改为125,email 改为 zzz@163.com:
mysql> update user set tizhong=125,email='zzz@163.com' where name = 'zzz';
Query OK, 1 row affected (0.43 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from user;
+------+------+---------+-------------+
| id | name | tizhong | email |
+------+------+---------+-------------+
| 1 | mmm | 120 | mmm@qq.com |
| 2 | zzz | 125 | zzz@163.com |
+------+------+---------+-------------+
2 rows in set (0.00 sec)
删除表中的一行数据,也必须加上WHERE条件,否则整列的数据都会被删除。删除语句:
DELETE FROM 表名字 WHERE 条件;
约束
约束分类
听名字就知道,约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。
在MySQL中,通常有这几种约束:
约束类型 | 主键 | 默认值 | 唯一 | 外键 | 非空 |
---|---|---|---|---|---|
关键字 | PRIMARY KEY | DEFAULT | UNIQUE | FOREIGN KEY | NOT NULL |
eg:
CREATE DATABASE mysql_shiyan;
use mysql_shiyan;
CREATE TABLE department
(
dpt_name CHAR(20) NOT NULL,
people_num INT(10) DEFAULT '10',
CONSTRAINT dpt_pk PRIMARY KEY (dpt_name)
);
CREATE TABLE employee
(
id INT(10) PRIMARY KEY,
name CHAR(20),
age INT(10),
salary INT(10) NOT NULL,
phone INT(12) NOT NULL,
in_dpt CHAR(20) NOT NULL,
UNIQUE (phone),
CONSTRAINT emp_fk FOREIGN KEY (in_dpt) REFERENCES department(dpt_name)
);
CREATE TABLE project
(
proj_num INT(10) NOT NULL,
proj_name CHAR(20) NOT NULL,
start_date DATE NOT NULL,
end_date DATE DEFAULT '2015-04-01',
of_dpt CHAR(20) REFERENCES department(dpt_name),
CONSTRAINT proj_pk PRIMARY KEY (proj_num,proj_name)
);
主键
主键 (PRIMARY KEY)是用于约束表中的一行,作为这一行的唯一标识符,在一张表中通过主键就能准确定位到一行,因此主键十分重要。主键不能有重复且不能为空。
定义主键:
也可以这样定义:
还有一种特殊的主键——复合主键。主键不仅可以是表中的一列,也可以由表中的两列或多列来共同标识,比如:
默认值约束
默认值约束 (DEFAULT) 规定,当有 DEFAULT 约束的列,插入数据为空时,将使用默认值。
people_num INT(10) DEFAULT '10'
默认值为10
DEFAULT 约束只会在使用 INSERT 语句(上一实验介绍过)时体现出来,INSERT语句中,如果被 DEFAULT 约束的位置没有值,那么这个位置将会被 DEFAULT 的值填充,如语句:INSERT INTO department(dpt_name,people_num) VALUES('dpt1',11);# 正常插入数据 INSERT INTO department(dpt_name) VALUES('dpt2');#插入新的数据,people_num 为空,使用默认值
- 唯一约束
唯一约束 (UNIQUE) 比较简单,它规定一张表中指定的一列的值必须不能有重复值,即这一列每个值都是唯一的。
当 INSERT 语句新插入的数据和已有数据重复的时候,如果有 UNIQUE约束,则 INSERT 失败,比如:
INSERT INTO employee VALUES(01,'Tom',25,3000,110110,'dpt1');
INSERT INTO employee VALUES(02,'Jack',30,3500,110110,'dpt2');
外键约束
外键 (FOREIGN KEY) 既能确保数据完整性,也能表现表之间的关系。
一个表可以有多个外键,每个外键必须 REFERENCES (参考) 另一个表的主键,被外键约束的列,取值必须在它参考的列中有对应值。
在 INSERT 时,如果被外键约束的值没有在参考列中有对应,则INSERT 失败- 非空约束
非空约束 (NOT NULL),听名字就能理解,被非空约束的列,在插入值时必须非空。
在MySQL中违反非空约束,不会报错,只会有警告