目录
前言
学习一下MySQL,之前一直没有系统的学习一下。最近有空,看了《MySQL基础教程-西泽梦路》,简单的做一下笔记。
记录于此,方便自己回忆。
正文
我这以Window版的phpstudy软件验证。
需要进入这个目录,才可以使用mysql命令
D:\phpstudy_pro\Extensions\MySQL5.7.26\bin
进入正文
显示数据
可以用select命令操作
select 列名1,列名2 ... from 表名;
例子
# 显示empid列信息 select empid from tb1; # 显示empid和name列信息 select empid,name from tb1;
当然可以不指定列名,展示所有,用*表示不指定和展示所有列信息
select * from tb1;
复制表
之前有介绍创建表,创建是需要指定列名的,mysql中还可以从已经有的进行复制表。
create table new_tb1 select * from tb1;
也就是create和select的组合。
数据类型
指定数据类型,也就是限制输入数据的格式,可以减少输入错误的可能性。
跟程序中[变量类型]差不多的意思
笔记1中也提到部分数据类型,但不多,这里会更多的介绍。
数值
数值类型的列中需要输入数值。
int 整数 tinyint 极小的整数 -128 ~ 127 smallint 小整数 -32768 ~ 32767 mediumint 中等整数 bigint 大整数 float 单精度浮点数 double 双精度浮点数 decimal 精确小数
字符串
char 固定长度字符串 不超过256字节 varchar 可变长度字符串 1~65532字节 text 长文本字符串 不超过65535字节 longtext 极长文本字符串
现在只要记住长度不超过255个字符的是VARCHAR,超过255个字符的是TEXT就足够了。
VARCHAR和CHAR能够在()中指定位数,比如
VARCHAR(100) //可以存储不超过100个字符的字符串
CHAR类型为固定长度的字符串,在保存数据的时候,字符数如果没有达到()中指定的数量就会用空格填充。但是,读取时这些填充的空格会被自动删除[插图]。而VARCHAR为可变长度字符串,保存数据时不会填充空格。
字符串数据需要用双引号或者单引号括起来。
如果输入数据中包含单引号,那么需要通过转义符号处理。
insert into tb1 (name) values ('\'笔友城堡\'');
查看表中内容
mysql> select empid,name from tb1; +-------+-------------+ | empid | name | +-------+-------------+ | A101 | zuoteng | | A104 | dubian | | A102 | gaoqiao | | A103 | zhongchuan | | NULL | '笔友城堡' | +-------+-------------+ 5 rows in set (0.00 sec)
日期和时间
能够保存日期或时间的列的数据类型包括DATE(日期)、TIME(时间)、YEAR(年),以及把日期和时间组合在一起的DATETIME等。
datetime 日期和时间 date 日期 year 年 time 时间
插入日期
# create table 表明 (列名 数据类型); create table t_date (a date);
insert into t_date (a) values("2018-5-3");
显示插入的数据
mysql> select * from t_date; +------------+ | a | +------------+ | 2018-05-03 | +------------+ 1 row in set (0.00 sec)
修改表
当修改列的定义时:ALTER TABLE … MODIFY …
当添加列时:ALTER TABLE … ADD …
当修改列名和定义时:ALTER TABLE … CHANGE …
当删除列时:ALTER TABLE … DROP …
修改列的数据类型
alter table 表名 modify 列名 数据类型;
[列名]是需要修改数据类的指定值。
我们以t_date为例,先看表结构
mysql> desc t_date; +-------+------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------+------+-----+---------+-------+ | a | date | YES | | NULL | | +-------+------+------+-----+---------+-------+ 1 row in set (0.00 sec)
我们把列名a的数据类date改为datetime
alter table t_date modify a datetime;
修改后 date类型 变成 datetime类型
mysql> desc t_date; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | a | datetime | YES | | NULL | | +-------+----------+------+-----+---------+-------+ 1 row in set (0.00 sec)
添加类
alter table 表名 add 列名 数据类型;
上面t_date只有一个列名a,数据类型为datetime,现在我们新增一列
列名为name,数据类型为varchar(20)
alter table t_date add name varchar(20);
mysql> desc t_date; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | a | datetime | YES | | NULL | | | name | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
修改列的位置
add命名默认添加列在现有的列名之后,如果需要设定添加顺序,可以用下面语句
# 添加最前面 alter table 表名 add 列名 数据类型 first; # 添加到指定列之后[列名1在列名2之后] alter table 表名 add 列名1 数据类型 after 列名2;
来个例子
alter table t_date add id int first; alter table t_date add salary int after name;
ps age 是临时添加的
mysql> desc t_date; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | a | datetime | YES | | NULL | | | name | varchar(20) | YES | | NULL | | | salary | int(11) | YES | | NULL | | | age | int(11) | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
id在最前面,salary在name之后。
修改列名和数据类型
alter table 表名 change 修改前列名 修改后列名 改变的数据类型;
# name ---> myname # varchar(10) ---> char(10) alter table t_date change name myname char(10);
当然,数量类型修改是可选的,但必须带上,即使你不更新,也要带上之前的类型。
# myname ---> name alter table t_date change myname name char(10);
删除列
alter table 表名 drop 列名;
删除前
mysql> desc t_date; +--------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+----------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | a | datetime | YES | | NULL | | | name | char(10) | YES | | NULL | | | salary | int(11) | YES | | NULL | | | age | int(11) | YES | | NULL | | +--------+----------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
删除列名为a的那行
alter table t_date drop a;
删除后
mysql> desc t_date; +--------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+----------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | char(10) | YES | | NULL | | | salary | int(11) | YES | | NULL | | | age | int(11) | YES | | NULL | | +--------+----------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
主键和唯一
主键
创建唯一记录时,会给列设置一个用于和其他列进行区分的特殊属性,这种就叫主键(PRIMARY KEY)。
主键的特征
没有重复的值
不允许输入空值(NULL)
create table 表名 ( 列名 数据类型 primary key);
创建info表,然后id为int类型的主键
create table info (id int primary key, name varchar(100));
mysql> desc info; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(100) | YES | | NULL | | +-------+--------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
主键不允许重复和为NULL
# 正常 # 方式1 insert into info values(1, "笔友城堡"); #方式2 insert into info (id,name) values(2,"笔友城堡2");
# 异常,id主键重复插入1 mysql> insert into info values(1, "笔友城堡3"); ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
# 异常,id主键插入null mysql> insert into info (id,name) values(null,"笔友城堡4"); ERROR 1048 (23000): Column 'id' cannot be null
唯一键
mysql可以有“不允许重复”这一限制属性的唯一键(unique key)
create table info1(id int unique, name varchar(10));
mysql> desc info1; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | UNI | NULL | | | name | varchar(10) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
此时的id是允许为null,但依旧不允许为重复。
使列具有自动连续编号功能
要使列具有自动连续编号功能,就得在定义列的时候进行以下3项设置。
数据类型为INT等整数类型
加上AUTO_INCREMENT
设置PRIMARY KEY,使列具有唯一性
create table info3(id int auto_increment primary key, name varchar(10));
mysql> desc info3; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(10) | YES | | NULL | | +-------+-------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec)
我们给name插入数据看看
# 第一条 insert into info3 (name) values("3xcn"); # 第二条 insert into info3 (name) values("daohang");
查看数据信息,如下,id是会自动增加的。
mysql> select * from info3; +----+------------+ | id | name | +----+------------+ | 1 | 3xcn | | 2 | daohang | +----+------------+ 2 rows in set (0.00 sec)
上面是会id的值会自动增加,但是如果把id中的1和2列删除后,重新插入数据id会从3开始增加
# 删除表中数据 delete from info3;
#重新插入数据 insert into info3 (name) values("3xcn");
mysql> select * from info3; +----+------------+ | id | name | +----+------------+ | 3 | 3xcn | +----+------------+ 1 row in set (0.00 sec)
id自动增加到3,但这不是我们需要的,我们想数据删除后,我们继续1开始增加。
因此,就需要重新[初始化AUTO_INCREMENT的值]
初始化auto_increment
alert table 表名 auto_increment=1;
重新初始化auto_increment值为1开始
alter table info3 auto_increment=1;
再次插入数据
insert into info3 (name) values("dao");
mysql> select * from info3; +----+------+ | id | name | +----+------+ | 1 | dao | +----+------+ 1 row in set (0.00 sec)
默认值
在设置列的默认值时,需要给列加上DEFAULT关键字。
create table 表名(列名 数据类型 default 默认值);
create table info4 (id int auto_increment primary key,name varchar(10) default "3xcn");
添加列是也可以设置默认值
alter table info3 add page int default 100;
创建索引
当查找表中的数据时,如果数据量过于庞大,查找操作就会花费很多时间。在这种情况下,最好在表上创建索引(index)。
create index 索引名 on 表名(列名);
举个例子
这里以info表为例,列名id,新创建索引名为info_index
create index info_index on info(id);
如果创建会有如下日志
mysql> create index info_index on info(id); Query OK, 2 rows affected (0.32 sec) Records: 2 Duplicates: 0 Warnings: 0
下面是显示索引
# 推荐这个,输出比较好看 show index from info\G
或
show index from info;
具体就不展示了。
删除索引
drop index 索引名 on 表名;
drop inde info_index on info;
然后在show一下索引,会发现不展示的信息不一样。
删除表
如果需要删除表中的数据
delete from 表名;
# 删除表中所有数据 delete from info3;
删除指定的数据
# 删除表中id=3的数据 delete from info3 where id=3;
mysql> select * from info3; +----+--------+ | id | name | +----+--------+ | 1 | dao | | 2 | daoddd | +----+--------+ 2 rows in set (0.00 sec)
当然,其他的条件也可以
delete from info3 where name='dao';
mysql> select * from info3; +----+--------+ | id | name | +----+--------+ | 2 | daoddd | +----+--------+ 1 row in set (0.00 sec)
参考文章
《MySQL基础教程-西泽梦路》