共计 8180 个字符,预计需要花费 21 分钟才能阅读完成。
MySQL 之基本操作
数据库操作
- 创建数据库
create database db1; create database db1 default charset gbk; create database if not exists db1 default character set utf8; - 显示创建信息
show create database db1;
- 修改数据库默认的字符格式
alter database db1 default character set gbk;
- 删除数据库
drop database db1;
区别:delete、truncate、drop
- delete:删除数据
1、数据操作语言(DML)在事务控制里,DML 语句是需要 commit,不提交的话可以 rollback;删除大量记录速度慢,只删除数据不回收高水位线
2、可以带条件删除 - truncate:删除数据
1、数据定义语言(DDL)清大量数据速度快,高水位线(high water mark)下降
2、不能带条件 truncate - drop:对象表、库、用户等;数据定义语言
数据查询语句:select
通配符:
-
匹配 0 个或任意多个字符 _ 匹配一个字符= 精确匹配like 模糊匹配 regexp (. 任意单个字符 * 前导字符出现 0 次或连续多次 .* 任意长度字符.....) 使用正则表达式来匹配
排序:
-
order by 排序,默认升序 asc 升序排列结果 desc 降序排列结果 group by 聚合 distinct 去除重复的行
常用函数
查看 mysql 支持字符加密函数:
select password('123'); | |
select md5('123'); | |
select sha1('123'); | |
select encrypt('123'); 基本上不用了 |
使用 select 来调度 mysql 中的常见函数:
select version(); 当前数据库版本 | |
select current_user(); 当前用户 | |
select current_time(); 当前时间 | |
select current_date(); 当前日期 | |
select now(); 当前日期时间 |
MySQL 表操作
表 是数据库存储数据的基本单位,由若干个字段组成,主要用来存储数据记录。表的操作
包括创建表、查看表、修改表和删除表。
语法:
create table 表名(字段名 1 类型[(宽度) 约束条件], | |
字段名 2 类型[(宽度) 约束条件], | |
字段名 3 类型[(宽度) 约束条件] | |
)[存储引擎 字符集]; |
说明:auto_increment 表示自增长 | |
primary key 表示主键 | |
not null 表示不为空 |
==在同一张表中,字段名是不能相同 ==宽度和约束条件可选 == 字段名和类型是必须的
创建表
表 school.student1
表 school.student1 | |
字段 字段 字段 | |
id name sex age | |
1 tom male 23 记录 | |
2 jack male 21 记录 | |
3 alice female 19 记录 | |
mysql> CREATE DATABASE school; //创建数据库 school | |
mysql> use school; | |
mysql> create table student1(-> id int, | |
-> name varchar(50), | |
-> sex enum('m','f'), | |
-> age int | |
-> ); | |
Query OK, 0 rows affected (0.03 sec) |

mysql> show tables; //查看表(当前所在库)+------------------+ | |
| Tables_in_school | | |
+------------------+ | |
| student1 | | |
+------------------+ | |
1 row in set (0.00 sec) |
查看表

mysql> select * from student1; //查询表中所有字段的值 | |
Empty set (0.00 sec) | |
mysql> select name,age from student1; //查询表中指定字段的值 | |
Empty set (0.00 sec) |
查询表中所有字段的值
向表中插入内容
语法:
insert into 表名(字段 1, 字段 2...) values(字段值列表...);
表 school.student2
字段名 数据类型 | |
编号 id int | |
姓名 name varchar(50) | |
出生年份 born_year year | |
生日 birthday date | |
上课时间 class_time time | |
注册时间 reg_time datetime | |
mysql> create table student2(-> id int, | |
-> name varchar(50), | |
-> born_year year, | |
-> birthday date, | |
-> class_time time, | |
-> reg_time datetime | |
-> ); | |
mysql> desc student2; | |
mysql> insert into student2 values(1,'tom',now(),now(),now(),now()); | |
mysql> insert into student2 values(2,'jack',1982,19821120,123000,20140415162545); |
表 school.student3
id id int | |
姓名 name varchar(50) | |
性别 sex enum('male','female') | |
爱好 hobby set('music','book','game','disc') | |
mysql> create table student3(-> id int, | |
-> name varchar(50), | |
-> sex enum('male','female'), | |
-> hobby set('music','book','game','disc') | |
-> ); | |
mysql> desc student3; | |
mysql> show create table student3\G | |
mysql> insert into student3 values (1,'tom','male','book,game'); | |
mysql> insert into student3 values (2,'jack','male','film'); | |
mysql> select * from student3; |
查看表结构
DESCRIBE 查看表结构
DESCRIBE 表名;
DESC 表名;
SHOW CREATE TABLE 查看表详细结构
SHOW CREATE TABLE 表名;
表完整性约束
作用:用于保证数据的完整性和一致性
约束条件 说明 | |
PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录,不可以为空 UNIQUE + NOT NULL | |
FOREIGN KEY (FK) 标识该字段为该表的外键,实现表与表(父表主键 / 子表 1 外键 / 子表 2 外键)之间的关联 | |
NOT NULL 标识该字段不能为空 | |
UNIQUE KEY (UK) 标识该字段的值是唯一的,可以为空,一个表中可以有多个 UNIQUE KEY | |
AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)DEFAULT 为该字段设置默认值 | |
UNSIGNED 无符号,正数 | |
ZEROFILL 使用 0 填充,例如 0000001 | |
说明:1. 是否允许为空,默认 NULL,可设置 NOT NULL,字段不允许为空,必须赋值 | |
2. 字段是否有默认值,缺省的默认值是 NULL,如果插入记录时不给字段赋值,此字段使用默认值 | |
sex enum('male','female') not null default 'male' | |
age int unsigned NOT NULL default 20 必须为正值(无符号)不允许为空 默认是 20 | |
3. 是否是 key | |
主键 primary key | |
外键 forengn key | |
索引 (index,unique...) |
DEFAULT、NOT NULL
表 school.student4
mysql> create table school.student4(-> id int not null, | |
-> name varchar(50) not null, | |
-> sex enum('m','f') default 'm' not null, | |
-> age int unsigned default 18 not null, hobby set('music','disc','dance','book') default 'book,dance'); |
mysql> insert into student4 values(1,'jack','m',20,'book'); | |
Query OK, 1 row affected (0.00 sec) | |
mysql> insert into student4(id,name) values(2,'robin'); | |
Query OK, 1 row affected (0.00 sec) |
设置唯一约束 UNIQUE
表 company.department
mysql> create table company.department(-> dept_id int, | |
-> dept_name varchar(30) unique, | |
-> comment varchar(50)); |
设置主键约束 PRIMARY KEY
primary key 字段的值是不允许重复,且不允许不 NULL(UNIQUE + NOT NULL)
单列做主键
多列做主键(复合主键)
单列做主键
表 school.student6 方法一
mysql> create table student6(-> id int primary key not null auto_increment, | |
-> name varchar(50) not null, | |
-> sex enum('male','female') not null default 'male', | |
-> age int not null default 18); | |
Query OK, 0 rows affected (0.20 sec) | |
mysql> insert into student6 values (1,'alice','female',22); | |
mysql> insert into student6(name,sex,age) values | |
-> ('jack','male',19), | |
-> ('tom','male',23); | |
mysql> select * from student6; | |
+----+-------+--------+-----+ | |
| id | name | sex | age | | |
+----+-------+--------+-----+ | |
| 1 | alice | female | 22 | | |
| 2 | jack | male | 19 | | |
| 3 | tom | male | 23 | | |
+----+-------+--------+-----+ | |
3 rows in set (0.00 sec) |
表 school.student7 方法二
mysql> create table student7(-> id int auto_increment not null, | |
-> name varchar(50) not null, | |
-> sex enum('male','female') not null default 'male', | |
-> age int not null default 18, | |
-> primary key(id)); | |
Query OK, 0 rows affected (0.21 sec) |
复合主键
表 school.service
host_ip 存储主机 IP | |
service_name 服务名 | |
port 服务对应的端口 | |
allow(Y,N) 服务是否允许访问 | |
主键:host_ip + port = primary key | |
mysql> create table service(-> host_ip varchar(15) not null, | |
-> service_name varchar(10) not null, | |
-> port varchar(5) not null, | |
-> allow enum('Y','N') default 'N', | |
-> primary key(host_ip,port) | |
-> ); | |
Query OK, 0 rows affected (0.00 sec) |
mysql> insert into service values ('192.168.2.168','ftp','21','Y'); | |
Query OK, 1 row affected (0.09 sec) | |
mysql> insert into service values ('192.168.2.168','httpd','80','Y'); | |
Query OK, 1 row affected (0.03 sec) |
设置字段值增 AUTO_INCREMENT
表 company.department3
CREATE TABLE department3 ( | |
dept_id INT PRIMARY KEY AUTO_INCREMENT, | |
dept_name VARCHAR(30), | |
comment VARCHAR(50) | |
); |
设置外键约束 FOREIGN KEY
父表 company.employees
mysql> create table employees(-> name varchar(50) not null, | |
-> mail varchar(20), | |
-> primary key(name)) engine=innodb; |
子表 company.payroll
mysql> create table payroll(-> id int not null auto_increment, | |
-> name varchar(50) not null, | |
-> payroll float(10,2) not null, | |
-> primary key(id), | |
-> foreign key(name) | |
-> references employees(name) | |
-> on update cascade | |
-> on delete cascade | |
-> )engine=innodb; |

mysql> select * from employees; | |
+------+--------------+ | |
| name | mail | | |
+------+--------------+ | |
| tom | 11111@qq.com | | |
+------+--------------+ | |
1 row in set (0.00 sec) | |
mysql> select * from payroll; | |
+----+------+---------+ | |
| id | name | payroll | | |
+----+------+---------+ | |
| 1 | tom | 11.00 | | |
+----+------+---------+ | |
1 row in set (0.00 sec) | |
mysql> update employees set name='tomaaa' where name='tom'; | |
Query OK, 1 row affected (0.04 sec) | |
Rows matched: 1 Changed: 1 Warnings: 0 | |
mysql> select * from payroll; | |
+----+--------+---------+ | |
| id | name | payroll | | |
+----+--------+---------+ | |
| 1 | tomaaa | 11.00 | | |
+----+--------+---------+ | |
1 row in set (0.00 sec) | |
mysql> select * from employees; | |
+--------+--------------+ | |
| name | mail | | |
+--------+--------------+ | |
| tomaaa | 11111@qq.com | | |
+--------+--------------+ | |
1 row in set (0.00 sec) | |
mysql> delete from employees where name='tomaaa'; | |
Query OK, 1 row affected (0.04 sec) | |
mysql> select * from employees; | |
Empty set (0.00 sec) | |
mysql> select * from payroll; | |
Empty set (0.00 sec) |
View Code
mysql> update employees set name='tomaaa' where name='tom'; | |
mysql> delete from employees where name='alice'; |
结论:
当父表中某个员工的记录修改时,子表也会同步修改
当父表中删除某个员工的记录,子表也会同步删除
修改表 ALTER TABLE
语法:
- 修改表名
ALTER TABLE 表名 RENAME 新表名;
- 增加字段
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…], ADD 字段名 数据类型 [完整性约束条件…];ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST;ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名
- 删除字段
ALTER TABLE 表名 DROP 字段名;
- 修改字段
ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…]; ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…]; ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
实例:

1. 修改存储引擎 | |
mysql> alter table service | |
-> engine=innodb; //engine=myisam|memore|.... | |
2. 添加字段 | |
mysql> create table student10 (id int); | |
mysql> alter table student10 | |
-> add name varchar(20) not null, | |
-> add age int not null default 22; | |
mysql> alter table student10 | |
-> add stu_num int not null after name; //添加 name 字段之后 | |
mysql> alter table student10 | |
-> add sex enum('male','female') default 'male' first; //添加到最前面 | |
3. 删除字段 | |
mysql> alter table student10 | |
-> drop sex; | |
mysql> alter table service | |
-> drop mac; | |
4. 修改字段类型 modify | |
mysql> alter table student10 | |
-> modify age tinyint; | |
mysql> alter table student10 | |
-> modify id int not null primary key ; //修改字段类型、约束、主键 | |
5. 增加约束(针对已有的主键增加 auto_increment)mysql> alter table student10 modify id int not null primary key auto_increment; //错误,该字段已经是 primary key | |
ERROR 1068 (42000): Multiple primary key defined | |
mysql> alter table student10 modify id int not null auto_increment; | |
Query OK, 0 rows affected (0.01 sec) | |
Records: 0 Duplicates: 0 Warnings: 0 | |
6. 增加复合主键 | |
mysql> alter table service2 | |
-> add primary key(host_ip,port); | |
7. 增加主键 | |
mysql> alter table student1 | |
-> add primary key(id); | |
8. 增加主键和自动增长 | |
mysql> alter table student1 | |
-> modify id int not null primary key auto_increment; | |
9. 删除主键[primary key auto_increment] | |
a. 删除自增约束 | |
mysql> alter table student10 modify id int not null; | |
b. 删除主键 | |
mysql> alter table student10 | |
-> drop primary key; |
修改表示例
复制表
- 复制表结构+记录 (key 不会复制: 主键、外键和索引)
mysql> create table new_service select * from service;
- 只复制表结构
mysql> create table new1_service select * from service where 1=2; // 条件为假,查不到任何记录
- 复制表结构,包括 Key
mysql> create table t4 like employees;
正文完
星哥玩云-微信公众号
