MySQL基础(三)-----表的基本操作和列的属性

目录

一、表的基本操作

1、展示数据库中表

2、创建表

 2.1基本语法

2.2给建表语句添加注释

2.3 if not exists 语句来校验表是否存在

3、删除表

if exists语句

4、查看表结构

5、直接使用某个库中的某个表

6、修改表

6.1修改表名

6.2增加列

6.3删除列

6.4修改列的信息

6.5一条语句实现多个修改操作

 二、列的属性

1、简单的查询和插入语句

1.1简单的查询语句

1.2简单的插入语句

1.3批量插入

2、列的属性

2.1默认值-default

2.2NOT NULL

2.3主键

 2.4unique 约束

2.5主键和unique约束的对比

2.6外键

2.7AUTO_INCREMENT

2.8列的注释

2.9显示宽度与zerofill

3、查看表结构是的列属性

4、标识符的命名规范


表的基本操作:包括展示表、创建表、修改表、删除表、查询表等其他操作。

 列的属性:mysql列属性包括:NULL 、default、comment、primary key、unique  key

一、表的基本操作

1、展示数据库中表

方式一:直接展示默认数据库的那些表

show tables;

方式二:展示指定数据库的那些表

show tables from test;
/**test指的是数据库名**/

2、创建表

创建表的注意事项:

  • 给表起名(注意:表面如果是多个单词用下划线代替。例如test_first;不要出现空格开头或者在中间或者在末尾的表名,例如: test、test first、test );
  • 给表定义一些列,并且给表的列命名(列名也叫字段);
  • 每一个列都需要定义一种数据类型(数据类型请查看MySQL基础(二));
  • 如果有需要的话,可以给些列定义相应的属性,比如设置默认值等(详情看本章第二大点);

 2.1基本语法

create table 表名 (
	列名1 数据类型 [列的属性],
	列名2 数据类型 [列的属性],
	列名3 数据类型 [列的属性],
	...
	列名n 数据类型 [列的属性]
);
/**列的属性在创建表的时候可要可不要,可选择性的,具体等到本章第二节会细讲**/
  • 在create table 后面要写清楚你想要创建的表格名;
  • 然后在括号里面定义你所需要的列,设置相应的列名、数据类型、列的属性等;
  • 列名、数据类型、列的属性中间用空白字符分开即可,各列之间用逗号分开;
  • 如果需要更加规范一下,可以在列名的地方加上``,如下所示
create table 表名 (
	`列名1` 数据类型 [列的属性],
	`列名2` 数据类型 [列的属性],
	`列名3` 数据类型 [列的属性],
	...
	`列名n` 数据类型 [列的属性]
);
/**列的属性在创建表的时候可要可不要,可选择性的,具体等到本章第二节会细讲**/

2.2给建表语句添加注释

为什么要添加表注释?

  • 在公司团队开发时,可能你的同事不知道该表是用来干什么的,但是一旦你加上注释后,大家一眼就能看懂是用来存储什么数据的,减少开发时间;
  • 对于个人而言,如果时间久了,在看这个表时,忘记了他是干什么的,但是加了注释就不一样了。

 comment语句,就是为表加注释的,而且还可以为字段加注释,详情看后续介绍,这个地方只介绍表注释,格式如下:

create table 表名 (
	列的信息.....
)comment '我是表的注释名';


create table 表名 (
	`列名1` 数据类型 [列的属性],
	`列名2` 数据类型 [列的属性],
	`列名3` 数据类型 [列的属性],
	...
	`列名n` 数据类型 [列的属性]
)comment '我是表的注释名';
/**表的注释不需要太长,简明表达意思就行**/

2.3 if not exists 语句来校验表是否存在

与重复创建数据库是一样,当数据库存在表时,在创建一个重复的表就会报错,所以这个地方依旧可以用if not exists来进行校验。具体操作如下:

create table if not exists 表名 (
	`列名1` 数据类型 [列的属性],
	`列名2` 数据类型 [列的属性],
	`列名3` 数据类型 [列的属性],
	...
	`列名n` 数据类型 [列的属性]
)comment '我是表的注释名';

3、删除表

如果觉得某个表以后再也不会用到了,就可以把他删除了。在工作时,一定要注意表的删除,一旦删除,所有的数据将会丢失,慎重!!!

 具体语句如下所示:

drop table 表1,表2,表3,表n;
/**可单独删除一个表,也可以同时删除多个表**/

if exists语句

和删库一样,如果该库里面不存在这个表,那么删除报错,所以要校验一下库中是否存在该表。具体语句如下所示:

drop table if exists 表名;

4、查看表结构

查看表结构一共有五种方式,具体如下:(可自己都执行一下看看效果)

describe 表名;
desc 表名;
explain 表名;
show columns from 表名;
show fields from 表名;

如果你不想要以列表的形式展示,想要查看原始建表SQL,你可以执行下面的语句:

show create table 表名\G;

5、直接使用某个库中的某个表

想要使用某个库的某个表很简单,只需要在操作表的时候,在表前面加上库名即可。具体操作如下:

数据库名.表名
/**列如展示某个库的表结构**/
show create table 数据库名.表名\G;

6、修改表

一般一个表的建立初期会存在很多细节问题,所以我们需要返回修改以保证最终表的稳定性。虽然现在我们可以直接在Navicat上直接对表结构进行修改,但是我们还是要知道一些修改表的操作语句。

6.1修改表名

修改表名,这个地方提供两种方式给大家参考,具体选择哪一个,可以根据自己的爱好选择。

方式1:

alter table 旧表名 rename to 新表名;

方式1,一次只能修改一个表名,修改完之后,刷新数据库,或者直接查看当前数据库下的表就可以看表名是否修改成功,查看当前库下的所有表SQL前面有,忘记了的可以去复习一下。

方式2:

rename table 旧表名1 to 新表名1,旧表名2 to 新表名2,旧表名3 to 新表名3,...,旧表名n to 新表名n;

方式2,可以同时修改多个表的表名。

如果说,你在修改表名的时候指定了相应的数据库,那么复习上一小节的内容,具体SQL如下:

alter table 数据库名.旧表名 rename to 数据库名.新表名;
rename table 数据库名.旧表名1 to 数据库名.新表名1,数据库名.旧表名2 to 数据库名.新表名2,数据库名.旧表名3 to 数据库名.新表名3,...,数据库名.旧表名n to 数据库名.新表名n;
/**如果想要把A库的表转移到B库,可以这样操作**/
alter table 数据库名A.旧表名 rename to 数据库名B.新表名;
rename table 数据库名A.旧表名1 to 数据库名B.新表名1,数据库名A.旧表名2 to 数据库名B.新表名2,数据库名A.旧表名3 to 数据库名B.新表名3,...,数据库名A.旧表名n to 数据库名B.新表名n;

6.2增加列

如果在建表完后,需要增加一些列,可以这样操作:

alter table 表名 add column 列名 数据类型 [列的属性];

如果你想要把新增的这一列,添加到第一列,可以这样:

/**添加到第一列**/
alter table 表名 add column 列名 数据类型 [列的属性] first;

如果想要在某一个列后面新增一列,可以这样:

/**添加到指定列的后面**/
alter table 表名 add column 列名 数据类型 [列的属性] after 指定列名;

6.3删除列

有时候建表会保留几个备用列,当确定表结构时,就可以去掉这些列,删除命令如下:

alter table 表名 drop column 列名1;
alter table 表名 drop column 列名2;
alter table 表名 drop column 列名3;

6.4修改列的信息

我们还可以对列的信息进行修改,但是切记!!!在修改后的数据类型和属性一定要兼容表中现有的数据。

比如说原来的数据最多能存100个字符,现在表里的数据是三个字符,如果列的数据类型改成了只能村2两个字符,那么在修改的时候就会报错。

列的信息修改有两种方式

方式1:

alter table 表名 modify 列名 新数据类型 [新属性];

 方式1 只能修改列的相关数据类型和属性。

方式2:

alter table 表名 change 旧列名 新列名 新数据类型 [新属性];

 方式2不光可以修改数据类型和属性,还可以修改列名。可以根据自己的喜好选择。

另外我们还可以修改列的排列位置

  • 将某列设为表的第一列
alter table 表名 modify 列名 列的类型 列的属性 first;
  • 将某列放到指定列的后面
alter table 表名 modify 列名 列的类型 列的属性 after 指定列名;

6.5一条语句实现多个修改操作

 我们可以把6.3的三条SQL整合为一个SQL,这样简化操作。具体如下:

alter table 表名 操作1,操作2,操作3,...,操作n;

 二、列的属性

在讲列的属性前,我们先了解一下简单的查询和插入语句,应该在查询和插入的时候会受到个别列的约束。

1、简单的查询和插入语句

1.1简单的查询语句

查询语句我们一般用select关键字进行查询,用“*”代替所有的返回字段(在实际开发中,最好用具体的字段来返回查询结果,减少“*”代替查询)。具体SQL如下:

select * from 表名;
  • select * 表示我们要查那些数据;
  • from 表名表示我们从那个表查询数据;

1.2简单的插入语句

在MySQL中插入数据的时候是以行为单位的,一行数据也称为一条记录。具体语句如下:

insert into 表名(列1,列2,...) values(值1,值2,...);
  • 对于的值要与对应的列相对应;
  • 且值的数据类型要和该列的数据类型保持一致,否则会报错;
  • 如果某个列没有属性,在插入值的时候也没有设值,他在数据库中展示的就是NULL

1.3批量插入

MySQL也提供了一次性插入多条数据,具体的操作如下:

insert into 表名(列1,列2,...) values(值1,值2,...),(值1,值2,...),(值1,值2,...),...(值1,值2,...),...;

2、列的属性

接下来开始介绍列的属性,相比在本章第一大节已经对列的属性有了一个模糊的了解,在本大节将会具体的介绍。

 mysql列属性包括:NULL 、default、comment、primary key、unique key

2.1默认值-default

在插入数据的时候,如果没有设值,那么这个值就会是NULL。换一种说法就是列的默认值就是NULL,其含义就是该列的值还没有被设置。如果我们不想列的默认值为NULL,而是使它变为有意义的默认值,那么我们就可以加一个default属性。具体操作如下:

`列名1` 数据类型 default 默认值
/**例如建表**/
create table  if not exists 表名 (
	`列名1` 数据类型 default 默认值,
	...
	`列名n` 数据类型 default 默认值
)comment '我是表的注释名';

如果我们不加默认值,其实下面这两个SQL是一样的

`列名1` 数据类型 default NULL
/**例如建表**/
create table  if not exists 表名 (
	`列名1` 数据类型,
	...
	`列名n` 数据类型
)comment '我是表的注释名';
create table  if not exists 表名 (
	`列名1` 数据类型 default NULL,
	...
	`列名n` 数据类型 default NULL
)comment '我是表的注释名';

2.2NOT NULL

有时候我们会要求表里面的某些列必须有值,不能存放NULL,这个时候我们就可以给这个列添加NOT NULL属性。具体操作如下:

`列名1` 数据类型 NOT NULL
/**例如建表**/
create table  if not exists 表名 (
	`列名1` 数据类型 NOT NULL,
	...
	`列名n` 数据类型 NOT NULL
)comment '我是表的注释名';

一旦我们设置了列的属性NOT NULL后,我们在插入数据的时候,改列的值就必须传,不能省略改列的值了,否则就会报错。

2.3主键

有时候在表中可以通过某个列或者某些列组合来确定唯一一个记录,我们可以把这个列或者这些列的组合称为候选键。一个表里面可能存在多个候选键,我们可以选择一个候选键作为表的主键。并且一个表最多只能有一个主键,主键的值不能重复,通过主键可以查到唯一的一条记录。

创建主键主要以下两种方式:

  • 如果主键是单个列,可以直接在列名后面声明primary key。
create table  if not exists 表名 (
	`列名1` 数据类型 primary key,
	`列名2` 数据类型 [列的属性],
	`列名3` 数据类型 [列的属性],
	...
	`列名n` 数据类型 [列的属性]
)comment '我是表的注释名';
  • 也可以把主键的声明单独提取出来
create table  if not exists 表名 (
	`列名1` 数据类型,
	`列名2` 数据类型 [列的属性],
	`列名3` 数据类型 [列的属性],
	...
	`列名n` 数据类型 [列的属性],
    primary key(`列1`)
)comment '我是表的注释名';
  • 如果主键由多个列组合,那么必须得提出来
create table  if not exists 表名 (
	`列名1` 数据类型,
	`列名2` 数据类型,
	`列名3` 数据类型 [列的属性],
	...
	`列名n` 数据类型 [列的属性],
    primary key(`列1`,`列2`)
)comment '我是表的注释名';

主键列默认具有NOT NULL属性,如果填入NULL值会报错。

 2.4unique 约束

除了主键以外,有时候我们也希望其他某个列或者列组合中的存储也是唯一的。这个时候就用到了UNIQUE约束(也可以称为UNIQUE键)。其作用就是给那些有必要保持唯一性的列和列组合添加UNIQUE约束。其方式也有两种。

方式1:如果是单个列声明unique约束,可以直接在列名后填写 unique或者unique key

create table  if not exists 表名 (
	`列名1` 数据类型,
	`列名2` 数据类型 unique,
	`列名3` 数据类型 [列的属性],
	...
	`列名n` 数据类型 [列的属性],
    primary key(`列1`)
)comment '我是表的注释名';

方式2:可以把unique约束单独提出来声明,并且如果是多个列为约束的话必须提出来

unique [key] [约束名称] (列名1,列名2,...)
/**key和约束名称都可以省略不谢,但是MySQL会给你一个默认的约束名称**/
/**单个**/
create table  if not exists 表名 (
	`列名1` 数据类型,
	`列名2` 数据类型,
	`列名3` 数据类型 [列的属性],
	...
	`列名n` 数据类型 [列的属性],
    primary key(`列1`),
    unique key 约束名 (列名2)
)comment '我是表的注释名';

/**多个**/
create table  if not exists 表名 (
	`列名1` 数据类型,
	`列名2` 数据类型,
	`列名3` 数据类型,
	...
	`列名n` 数据类型 [列的属性],
    primary key(`列1`),
    unique key 约束名 (列名2,列名3)
)comment '我是表的注释名';

补充:

/**在表创建之后追加唯一键**/

alter table 表名 add unique key(字段列表);  #unique key 或 unique 都可以

alter table 表名 modify 字段名 数据类型 unique; #修改已经存在的字段为唯一键

索引简单介绍

索引的作用: 提高查询效率、约束数据的有效性

  1. 主键索引   primary key

  2. 唯一键索引  unique key

  3. 全文索引   textfull index

  4. 普通索引   index

2.5主键和unique约束的对比

主键和unique约束都可以保证某个列或者列组合的唯一性。但是:

  • 一张表只能存在一个主键,却可以存在多个unique约束;
  • 主键列不允许存放NULL,而声明了unique约束的列依然可以存放NULL,且可以重复出现在多条记录中。(因为NULL很特殊,它并不代表某个具体的值,它只是代表该列还未填入值)
  • 如果没有给表定义外键,MySQL会将第一个声明为NOT NULL并且具有unique约束的列或者列组合自定义设置为主键

2.6外键

如果我们想要两个关联起来的表的数据联动起来,就要绑定一个外键,避免在A表里面可以查到数据,但是B表查不到,就很离谱了。所以MySQL提供了外键约束。SQL语句如下:

constraint [外键名称] foreign key(列1,列2,..) references 父表名(父列1,父列2,..);
/**外键名称也是一个可选的,如果我们不命名,MySQL会帮忙命名的**/

如果A表中的某个列或者某些列依赖于B表中的某个列或者某些列,那么就称A表为B表的字表,B表为A表的父表。子表和父表之间可以用外键关联起来。例如下面的SQL:

create table  if not exists A (
	`列名1` 数据类型,
	`列名2` 数据类型,
	`列名3` 数据类型 [列的属性],
	...
	`列名n` 数据类型 [列的属性],
    primary key(`列1`),
    unique key 约束名 (`列名2`),
    constraint foreign key(`列3`) references B(`列3`)
)comment '我是表的注释名';
/**这样我们在插入A表数据的时候就会查询一下B表,如果没有就会报错**/
/**切记,在MySQL中,父表中被子表依赖的列或者列组合必须建立索引**/

2.7AUTO_INCREMENT

AUTO_INCREMEN即“自动增长”。简明就是“自增”。我们可以使用整数类型或者浮点数类型的列声明该属性,在之后插入新纪录时,可以不显示指定改列的值,MySQL就会自动帮该列生成自动增长的唯一值。具体SQL如下:

列名 列的类型 ATUO_INCREMENT
/**建表**/
create table  if not exists A (
	`列名1` INT UNSIGNED ATUO_INCREMENT,
	`列名2` 数据类型,
	`列名3` 数据类型 [列的属性],
	...
	`列名n` 数据类型 [列的属性],
    primary key(`列1`),
    unique key 约束名 (`列名2`),
    constraint foreign key(`列3`) references B(`列3`)
)comment '我是表的注释名';
/**UNSIGNED 代表无符号,在自增时前面不会补充0**/

注意:

  • 如果表里数据为空,那么自增是从1开始的。例如1、2、3;
  • 如果表里存在数据,且该数据的自增列的值不为1,假设为5 ,那么这里的自增就是从5开始的;
  • 如果在插入数据时,显示地指定了声明为自增列的值为NULL,那么MySQL将为该列生成自增值而不是将NULL填入该列;
  • 如果NO_AUTO_VALUE_ON_ZERO的SQL模式没有开启(默认未开启),那么如果插入数据时,显示地指定了声明为自增列的值为0,那么MySQL会为该列生成自增值而不是将0填入该列。

设置AUTO_INCREMENT属性应该注意:

  • 一个表最多只能有一个具有AUTO_INCREMENT属性的列;
  • 具有AUTO_INCREMENT属性的列必须建立起索引。主键和unique属性的列会自动建立索引。一般有AUTO_INCREMENT属性的列都是为主键。也不排除非主键的列含有AUTO_INCREMENT属性;
  • 拥有AUTO_INCREMENT属性的列不能在通过指定default属性设置指定默认值;
  • 在工作中,AUTO_INCREMENT一般都是作为主键的属性,来自动生成唯一标识一条记录的主键值。

2.8列的注释

列的注释所要用的语句和表注释的一样,都是comment。具体SQL如下:

create table  if not exists 表名 (
	`列名1` 数据类型 primary key comment '我是主键',
	`列名2` 数据类型 [列的属性] comment '列名2',
	`列名3` 数据类型 [列的属性] comment '列名3',
	...
	`列名n` 数据类型 [列的属性] comment '列名n'
)comment '我是表的注释名';

2.9显示宽度与zerofill

一个正整数可以有三个写法:3、003、000003。他们虽表示的都是3,但是如果要在MySQL数据库中展示出后两者,就需要用到zerofill属性。

对于无符号整数类型的列,如果想在查询结果中让数字左边补0,就得给该列的属性加上zerofill。SQL语句如下:

create table zerofill_table_test (
    id1 int unsigned zerofill,
    id2 int unsigned
);

我们按照顺序执行下面的三个SQL:

insert into zerofill_table_test(id1,id2) VALUES(1,1);
SELECT * FROM zerofill_table_test;
show create table zerofill_table_test

你会发现,查询的id1是0000000001,id2是1,并且表结构中id1的数据类型为int(10),意思这个地方要写补充9个0,因为宽度为10,但是它的实际值为1.

在使用zerofill属性时,要注意:

  • 创建表的时候如果只声明了zerofill属性的列没有声明unsigned,那么mysql会自动生成unsigned属性(也就是MySQL现在只支持无符号整数进行自动补0的操作);
  • 不同的整数类型有不同的默认显示宽度(TINYINT是4,INT是1.如果加了unsigned属性,他们的默认显示宽度会减一。);
  • 显示宽度并不会影响列所需的存储空间以及取值范围;
  • 只有列的实际值的位数小于显示宽度时才会在左侧补0,实际值大于宽度时则按照原样输出;
  • 仅对列设置显示宽度,而不声明zerofill属性的话,则对查询结果无影响;
  • 从MySQL8.0.17后起,已不推荐对列指定显示宽度以及声明zerofill属性。

3、查看表结构是的列属性

在本章第一大节中我们指出了如何查询表结构,desc 表名;

MySQL基础(三)-----表的基本操作和列的属性_第1张图片

  •  NULL列代表该列是否可以存储NULL,值为NO时,表示不允许存储NULL,值为YES时,表示可以存储NULL;
  • KEY列存储关于所谓的键信息,值PRI是primary key的缩写,代表主键。值UNI是unique key 的缩写,代表unique键;
  • default列代表该列的默认值;
  • extra列显示一些额外的信息,比方说如果某个列具有AUTO_INCREMENT属性,就会显示在这个列中。

4、标识符的命名规范

数据库名、表名、列名、约束名称、别名、视图名、存储过程名等,这些名称统称为标识符。虽然MySQL没有对标识符做过多的限制。但是以下三个是不允许且不受欢迎的:

  • 名称中全部都是数字;
  • 名称中有空白符;
  • 名称中使用了MySQL中的保留字。(create、database、int、double、drop、table)

如果非要强行使用,那么要加上``,但是即使这样在给数据库名、表名、列名起名时仍然不能以空格字符结尾。

MySQL基础(三)-----表的基本操作和列的属性。就分享到这个地方,后续会更新MySQL基础(四)-----简单查询和带附带条件的查询。

今天的分享就到此结束了,如果觉得对您有帮助,麻烦给个三连!

以上内容为本人的经验总结和平时操作的笔记。若有错误和重复请联系作者删除!!感谢支持!!

你可能感兴趣的:(MySQL基础,mysql,数据库,经验分享)