连接服务器
在命令行下输入:
mysql -h 127.0.0.1 -P 3306 -u root -p
注意:
- 如果没有写 -h 127.0.0.1 默认是连接本地
- 如果没有写 -P 3306 默认是连接3306端口号
1. 库/表的操作
创建数据库
语法:
CREATE DATABASE [IF NOT EXISTS] db_name
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name;
说明:
- 大写的表示关键字
- [] 是可选项
- CHARACTER SET: 指定数据库采用的字符集
- COLLATE: 指定数据库字符集的校验规则
- 当我们创建数据库没有指定字符集和校验规则时,系统使用默认字符集:utf8,校验规则是:utf8_general_ ci
查看系统默认字符集以及校验规则
show variables like 'character_set_database';
show variables like 'collation_database';
查看数据库支持的字符集
show charset;
- 字符集主要是控制用什么语言。比如utf8就可以使用中文。
查看数据库支持的字符集校验规则
show collation;
校验规则对数据库的影响
- 不区分大小写,创建一个数据库,校验规则使用utf8_ general_ ci[不区分大小写]
- 区分大小写,创建一个数据库,校验规则使用utf8_ bin[区分大小写]
使用数据库
use db_name;
创建数据库表
语法:
create table student(
id int,
name varchar(32),
gender varchar(2)
)character set utf8 collate utf8_general_ci engine MyISAM;
说明:
- character set 字符集,如果没有指定字符集,则以所在数据库的字符集为准
- collate 校验规则,如果没有指定校验规则,则以所在数据库的校验规则为准
表中插入数据
insert into student (id, name, gender) values (1, '张三', '男');
查询表中的数据
select * from student;
结果排序
//根据name升序排序将student表排序输出
select * from student order by name;
查看表结构
desc 表名;
修改表
- 现有如下一张users表
- 可以进行如下操作:
//在users表添加一个字段,用于保存图片路径
alter table users add assets varchar(100) comment '图片路径' after birthday;
//修改name,将其长度改成60
alter table users modify name varchar(60);
//删除password列
alter table users drop password;
//修改表名为employee
mysql> alter table users rename to employee;
//将name列修改为xingming
mysql> alter table employee change name xingming varchar(60); --新字段需要完整定义
删除表
DROP TABLE [IF EXISTS] tb_name;
查看数据库
show databases;
显示创建语句
show create database 数据库名;
修改数据库
语法:
ALTER DATABASE db_name
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name
- 对数据库的修改主要指的是修改数据库的字符集,校验规则
数据库删除
DROP DATABASE [IF EXISTS] db_ name;
执行删除之后的结果:
- 数据库内部看不到对应的数据库
- 对应的数据库文件夹被删除,级联删除,里面的数据表全部被删
备份和恢复
备份 语法:
# mysqldump -P3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径
还原:
在mysql程序中输入:
mysql> source 数据库备份存储的文件路径;
如何备份一张表?
# mysqldump -u root -p 数据库名 表名1 表名2 > 存放路径
如何同时备份多个数据库?
# mysqldump -u root -p -B 数据库名1 数据库名2 ... > 数据库存放路径
注意:
- 如果备份一个数据库时,没有带上-B参数, 在恢复数据库时,需要先创建空数据库,然后再使用source来还原。
查看数据库连接情况
语法:
//可以告诉我们当前有哪些用户连接到我们的MySQL,
show processlist
2. 数据类型
数值类型
- 整型可以指定是有符号的和无符号的,默认是有符号的。可以通过UNSIGNED来说明某个字段是无符号的。
小数类型
float
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
- float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。
decimal
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
- decimal和float很像,但是有区别:
- float和decimal表示的精度不一样
- float表示的精度大约是7位
- decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10。
- 如果希望小数的精度高,推荐使用decimal。
字符串类型
char
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
varchar
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
- 关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:
- varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532。
- 当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。
char和varcahr比较
- 根据需求选择适合的类型,数据长度确定选择char,长度有变化选择varchar。
- 定长的磁盘空间比较浪费,但是效率高。
- 变长的磁盘空间比较节省,但是效率低。
日期和时间类型
常用的日期有如下三个:
- datetime 时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从1000到9999,占用八字节
- date:日期 ‘yyyy-mm-dd’,占用三字节
- timestamp:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss格式和datetime完全一致,占用四字节
注意:
- 添加数据时,时间戳自动补上当前
- 更新该表任何数据时,所有时间戳都会更新成当前时间
enum和set
- enum:枚举,“单选”类型;
- 该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,…最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。
- set:集合,“多选”类型;
- 该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,… 最多64个。
- 例如创建votes表
create table votes(
username varchar(30),
hobby set('登山','游泳','篮球','武术'),
gender enum('男','女')
);
- 插入数据,特别需要注意set的插入
insert into votes values('雷锋', '登山,武术', '男');
insert into votes values('Juse','登山,武术',2);
- 如果想查找所有喜欢登山的人
//此代码只能找到只喜欢登山的,而不能找出所有喜欢登山的
select * from votes where hobby='登山';
- 此时需要使用集合查询函数:find_ in_ set
//这样才能找出所有喜欢登山的
select * from votes where find_in_set('登山', hobby);
3. 表的约束
(1)空属性
- null(默认的)
- not null(不为空)
(2)默认值
- 语法:default 对应类型的默认值
(3)列描述
- 语法:comment ‘xxx’
- 列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。
- 通过desc是看不见注释信息的
- 通过show create table tb_name; 是可以看见的
(4)zerofill
- 语法: zerofill
- 通过show create table tb_name; 命令可以看出来int的默认打印宽度为10
- 设置zerofill属性后,如果宽度小于设定的宽度,自动填充0。
- 要注意的是,这只是最后显示的结果,在MySQL中实际存储的并没有变,只是一种格式化输出而已。
(5)主键
-
primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。
-
创建表的时候直接在字段上指定主键
-
也可以在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以使用复合主键。
-
当表创建好以后,如果没有主键可以再次追加主键
alter table 表名 add primary key(字段列表)
- 删除主键(只是删除字段的主键属性,并不会删除该字段)
alter table 表名 drop primary key;
(6)自增长
- auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
- 自增长的特点:
- 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
- 自增长字段必须是整数
- 一张表最多只能有一个自增长
- 例如:
mysql> create table tt21(
-> id int unsigned primary key auto_increment,
-> name varchar(10) not null default ''
-> );
mysql> insert into tt21(name) values('a');
mysql> insert into tt21(name) values('b');
mysql> select * from tt21;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
+----+------+
- 在插入后获取上次插入的AUTO_INCREMENT 的值(批量插入获取的是第一个值)
mysql > select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 1 |
+------------------+
(7)唯一键
- 语法:unique
- 一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。
- 唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
(8)外键
- 外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
- 语法:
foreign key (字段名) references 主表(列)