导航号,我的单页导航
文章目录

前言

学习一下MySQL,之前一直没有系统的学习一下。最近有空,看了《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)

修改表

  1. 当修改列的定义时:ALTER TABLE … MODIFY …

  2. 当添加列时:ALTER TABLE … ADD …

  3. 当修改列名和定义时:ALTER TABLE … CHANGE …

  4. 当删除列时: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)。

主键的特征

  1. 没有重复的值

  2. 不允许输入空值(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项设置。

  1. 数据类型为INT等整数类型

  2. 加上AUTO_INCREMENT

  3. 设置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("daohanghao");
# 第二条
insert into info3 (name) values("daohang");

查看数据信息,如下,id是会自动增加的。

mysql> select  * from info3;
+----+------------+
| id | name       |
+----+------------+
|  1 | daohanghao |
|  2 | daohang    |
+----+------------+
2 rows in set (0.00 sec)

上面是会id的值会自动增加,但是如果把id中的1和2列删除后,重新插入数据id会从3开始增加

 # 删除表中数据
 delete from info3;
#重新插入数据
insert into info3 (name) values("daohanghao");
mysql> select * from info3;
+----+------------+
| id | name       |
+----+------------+
|  3 | daohanghao |
+----+------------+
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 "daohanghao");

添加列是也可以设置默认值

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)

参考文章

  1. 《MySQL基础教程-西泽梦路》

© 版权声明
导航号,我的单页导航

暂无评论

暂无评论...