MySql基础知识-----表的操作

1.表的创建

语法形式如下:

create table table_name(属性名 数据类型,
                        属性名 数据类型,
                        .......
                        属性名 数据类型)

其中属性名是表中字段的名字,属性类型是字段存储数据的数据类型。

例如:

mysql> create table t_dept(deptno INT,deptname VARCHAR(20),deptleader VARCHAR(20));

上述语句中t_dept是表的名字,deptno,deptname和deptleader是表中存储的3个字段,INT,VARCHAR是相应字段存储的数据类型。


注意:创建表的时候首先应该先选择数据库,如果没有数据库需要先创建一个。

创建数据库语法如下:

mysql> create database canvas;

查看MySql已存在数据库语法如下:

mysql> show databases;

选择数据库的语法如下:

mysql> use canvas

2.查看表的结构

2.1 describe语句查看表的定义

语法形式:

describe table_name
table_name表示表的名字,例如:
mysql> describe t_dept;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptno     | int(11)     | YES  |     | NULL    |       |
| deptname   | varchar(20) | YES  |     | NULL    |       |
| deptleader | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> desc t_dept;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptno     | int(11)     | YES  |     | NULL    |       |
| deptname   | varchar(20) | YES  |     | NULL    |       |
| deptleader | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

如上所示,describe也可以简写为desc。


2.2 show create table 语句查看表的详细定义

语法形式:

show create table table_name;
其中table_name是表的名字,例如:
mysql> show create table t_dept \G
*************************** 1. row ***************************
       Table: t_dept
Create Table: CREATE TABLE `t_dept` (
  `deptno` int(11) DEFAULT NULL,
  `deptname` varchar(20) DEFAULT NULL,
  `deptleader` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)


3.删除表

语法形式:

drop table table_name;
其中,table_name是表的名字,例如:
mysql> drop table t_dept;
Query OK, 0 rows affected (0.01 sec)

4.修改表

4.1 修改表名

语法形式:

alter table table_name rename [to] new_table_name;
其中,table_name是表的旧名字,new_table_name是表的新名字,例如:
mysql> show tables;
+------------------+
| Tables_in_canvas |
+------------------+
| t_dept           |
+------------------+
1 row in set (0.00 sec)

mysql> alter table t_dept rename t_department;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+------------------+
| Tables_in_canvas |
+------------------+
| t_department     |
+------------------+
1 row in set (0.00 sec)

修改前表的名字是t_dept,修改后表的名字是t_department。


4.2 增加字段

4.2.1 在表的最后一个围追增加字段

语法形式:

alter table table_name add 属性名 属性类型;
例如,在表的最后添加一个类型为VARCHAR的location字段:
mysql> desc t_dept;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptno     | int(11)     | YES  |     | NULL    |       |
| deptname   | varchar(20) | YES  |     | NULL    |       |
| deptleader | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> alter table t_dept add location VARCHAR(20);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc t_dept;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptno     | int(11)     | YES  |     | NULL    |       |
| deptname   | varchar(20) | YES  |     | NULL    |       |
| deptleader | varchar(20) | YES  |     | NULL    |       |
| location   | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

4.2.2 在表的第一个位置增加字段

语法形式如下:
alter table table_name add 属性名 属性类型 first;
例如,在表的字一个位置添加类型为INT的deptsal的字段:
mysql> desc t_dept;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptno     | int(11)     | YES  |     | NULL    |       |
| deptname   | varchar(20) | YES  |     | NULL    |       |
| deptleader | varchar(20) | YES  |     | NULL    |       |
| location   | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> alter table t_dept add deptsal INT first;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc t_dept;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptsal    | int(11)     | YES  |     | NULL    |       |
| deptno     | int(11)     | YES  |     | NULL    |       |
| deptname   | varchar(20) | YES  |     | NULL    |       |
| deptleader | varchar(20) | YES  |     | NULL    |       |
| location   | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)


4.2.3 在表的指定字段之后添加字段

语法形式如下:

alter table table_name add 属性名 属性类型 after 属性名;
例如,在deptsal字段后面添加类型为FLOAT的deptbou字段:
mysql> desc t_dept;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptsal    | int(11)     | YES  |     | NULL    |       |
| deptno     | int(11)     | YES  |     | NULL    |       |
| deptname   | varchar(20) | YES  |     | NULL    |       |
| deptleader | varchar(20) | YES  |     | NULL    |       |
| location   | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

mysql> alter table t_dept add deptbou FLOAT after deptsal;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> 
mysql> desc t_dept;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptsal    | int(11)     | YES  |     | NULL    |       |
| deptbou    | float       | YES  |     | NULL    |       |
| deptno     | int(11)     | YES  |     | NULL    |       |
| deptname   | varchar(20) | YES  |     | NULL    |       |
| deptleader | varchar(20) | YES  |     | NULL    |       |
| location   | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

4.3 删除字段

语法形式:

alter table table_name drop 属性名;
例如,删除属性名为deptbou的字段:
mysql> desc t_dept;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptsal    | int(11)     | YES  |     | NULL    |       |
| deptbou    | float       | YES  |     | NULL    |       |
| deptno     | int(11)     | YES  |     | NULL    |       |
| deptname   | varchar(20) | YES  |     | NULL    |       |
| deptleader | varchar(20) | YES  |     | NULL    |       |
| location   | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

mysql> alter table t_dept drop deptbou;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc t_dept;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptsal    | int(11)     | YES  |     | NULL    |       |
| deptno     | int(11)     | YES  |     | NULL    |       |
| deptname   | varchar(20) | YES  |     | NULL    |       |
| deptleader | varchar(20) | YES  |     | NULL    |       |
| location   | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
5 rows in set (0.01 sec)

4.4 修改字段

4.4.1 修改字段的数据类型

语法形式:
alter table table_name modify 属性名  属性类型
例如,修改t_dept表中deptsal字段的属性为VARCHAR:
mysql> alter table t_dept modify deptsal VARCHAR(20);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc t_dept;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptsal    | varchar(20) | YES  |     | NULL    |       |
| deptno     | int(11)     | YES  |     | NULL    |       |
| deptname   | varchar(20) | YES  |     | NULL    |       |
| deptleader | varchar(20) | YES  |     | NULL    |       |
| location   | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

4.4.2 修改字段的名字

语法形式:

alter table table_name change 旧属性名  新属性名  旧属性类型
例如,重新命名t_dept表中属性名为deptsal,新属性名为deptsalary:
mysql> alter table t_dept change deptsal deptsalary VARCHAR(20);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> 
mysql> desc t_dept;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptsalary | varchar(20) | YES  |     | NULL    |       |
| deptno     | int(11)     | YES  |     | NULL    |       |
| deptname   | varchar(20) | YES  |     | NULL    |       |
| deptleader | varchar(20) | YES  |     | NULL    |       |
| location   | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

4.4.3 同时修改字段名和属性

语法形式:

alter table table_name change 旧属性名 新属性名 新属性类型
例如,将表t_dept中的deptsalary属性重命名为deptsal,同时修改属性类型为INT:
mysql> alter table t_dept change deptsalary deptsal INT;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc t_dept;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptsal    | int(11)     | YES  |     | NULL    |       |
| deptno     | int(11)     | YES  |     | NULL    |       |
| deptname   | varchar(20) | YES  |     | NULL    |       |
| deptleader | varchar(20) | YES  |     | NULL    |       |
| location   | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)


4.4.4 修改字段顺序

语法形式:

alter table table_name modify 属性名1 属性类型 first|after 属性名2
例如,修改t_dept表中deptsal属性,将该属性放到deptno之后:
mysql> alter table t_dept modify deptsal INT after deptno;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc t_dept;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptno     | int(11)     | YES  |     | NULL    |       |
| deptsal    | int(11)     | YES  |     | NULL    |       |
| deptname   | varchar(20) | YES  |     | NULL    |       |
| deptleader | varchar(20) | YES  |     | NULL    |       |
| location   | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)


5 添加表的约束


5.1 设置非空约束(NOT NULL, NK)

语法形式:
create table table_name(属性名 数据类型 not null,
..........);
例如,重新创建t_dept表,设置deptno字段为非空:
mysql> create table t_dept(deptno INT not null,deptname VARCHAR(20),deptleader VARCHAR(20),location VARCHAR(20));
Query OK, 0 rows affected (0.02 sec)

mysql> desc t_dept;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptno     | int(11)     | NO   |     | NULL    |       |
| deptname   | varchar(20) | YES  |     | NULL    |       |
| deptleader | varchar(20) | YES  |     | NULL    |       |
| location   | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

可以看到在NULL一列中,deptno的值为NO,说明非空属性设置成功,不设置非空属性的字段默认值为YES。


5.2 设置字段的默认值(DEFAULT)

语法形式:

create table table_name(属性名 属性类型 default 默认值,
......);

例如,重新创建t_dept,设置deptno的默人值为0:

mysql> create table t_dept(deptno INT default 0,deptname VARCHAR(20),deptleader VARCHAR(20),location VARCHAR(20));
Query OK, 0 rows affected (0.02 sec)

mysql> 
mysql> 
mysql> desc t_dept;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptno     | int(11)     | YES  |     | 0       |       |
| deptname   | varchar(20) | YES  |     | NULL    |       |
| deptleader | varchar(20) | YES  |     | NULL    |       |
| location   | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
可以看到设置默认值之后,描述信息中方deptno的Default属性变为了0,插入默认值时应该使用default关键字,如下所示:
mysql> insert into t_dept values(default,'SAL','canvas','SH');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_dept;
+--------+----------+------------+----------+
| deptno | deptname | deptleader | location |
+--------+----------+------------+----------+
|      0 | SAL      | canvas     | SH       |
+--------+----------+------------+----------+
1 row in set (0.00 sec)


5.3 设置唯一约束(UNIQUE,UK)

唯一性约束表示某个字段上的内容不允许重复,语法形式:

create table table_name(属性名 属性类型 unique,
......);
例如,重新创建t_dept表,设置deptleader的唯一性约束:
mysql> create table t_dept(deptno INT not null,deptname VARCHAR(20) default 'Work',deptleader VARCHAR(20) unique,location VARCHAR(20));
Query OK, 0 rows affected (0.02 sec)

mysql> desc t_dept;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptno     | int(11)     | NO   |     | NULL    |       |
| deptname   | varchar(20) | YES  |     | Work    |       |
| deptleader | varchar(20) | YES  | UNI | NULL    |       |
| location   | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

可以看到deptleader的Key属性列被设置成了UNI,说明唯一性约束设置成功。


5.4 设置主键约束(PRIMARY KEY,PK)

在创建数据库表时为某些字段添加上“PRIMARY KEY”约束条件,则该字段可以唯一的标示所以记录,这样做是为了便于数据库管理系统快速的查找到表中的记录。

在具体设置主键时,必须要满足主键字段值的唯一,非空。


5.4.1 单字段主键

语法形式:
create table table_name(属性名 属性类型 primary key,
........);
例如,重新创建t_dept,设置字段deptno为主键:
mysql> create table t_dept(deptno INT not null primary key,deptname VARCHAR(20) default 'Work',deptleader VARCHAR(20) unique,location VARCHAR(20));
Query OK, 0 rows affected (0.01 sec)

mysql> 
mysql> desc t_dept;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptno     | int(11)     | NO   | PRI | NULL    |       |
| deptname   | varchar(20) | YES  |     | Work    |       |
| deptleader | varchar(20) | YES  | UNI | NULL    |       |
| location   | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

可以看到deptno对应的Key列被设置成了PRI,说明deptno时表的主键。

如果想给字段deptno上的PK约束设置一个名字,可以执行SQL语句CONSTRAINT来创建t_dept,语法形式如下:

create table table_name(属性名 属性类型,
....
constraint 约束名 primary key(属性名));
mysql> create table t_dept(deptno INT not null,deptname VARCHAR(20) default 'Work',deptleader VARCHAR(20) unique,location VARCHAR(20),constraint pk_deptno primary key(deptno));
Query OK, 0 rows affected (0.02 sec)

mysql> desc t_dept;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptno     | int(11)     | NO   | PRI | NULL    |       |
| deptname   | varchar(20) | YES  |     | Work    |       |
| deptleader | varchar(20) | YES  | UNI | NULL    |       |
| location   | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)


5.4.2 多字段主键

当主键由多个字段组成时,则需要通过SQL的CONSTRAINT来实现,语法形式如下:
create table table_name(属性名 属性类型,
......
【constraint 约束名】primary key(属性名,属性名.....));
例如设置t_dept中deptno和deptname为主键:
mysql> create table t_dept(deptno INT,deptname VARCHAR(20),deptleader VARCHAR(20),location VARCHAR(20),constraint pk_mainKey primary key(deptno,deptname));
Query OK, 0 rows affected (0.01 sec)

mysql> desc t_dept;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptno     | int(11)     | NO   | PRI | NULL    |       |
| deptname   | varchar(20) | NO   | PRI | NULL    |       |
| deptleader | varchar(20) | YES  |     | NULL    |       |
| location   | varchar(20) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

5.5 设置字段值自动增加(AUTO_INCREMENT)

在具体设置AUTO_INCREMENT时,一个数据库表中只能由一个字段使用该约束,该字段的数据类型必须时整数类型,由于设置AUTO_INCREMENT约束之后的字段会生成唯一的ID,所以该字段也会经常被设置成PK主键,语法形式如下:

create table table_name (属性名 属性类型 auto_increment,
.......)
例如设置t_dept中字段deptno自动增加:
mysql> create table t_dept(deptno INT primary key auto_increment,deptname VARCHAR(20),deptleader VARCHAR(20),location VARCHAR(20));
Query OK, 0 rows affected (0.02 sec)

mysql> desc t_dept;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| deptno     | int(11)     | NO   | PRI | NULL    | auto_increment |
| deptname   | varchar(20) | YES  |     | NULL    |                |
| deptleader | varchar(20) | YES  |     | NULL    |                |
| location   | varchar(20) | YES  |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

5.7 设置外键约束(FOREIGN KEY,FK)

外键约束保证多个表(通常为两个表)之间的参照完整性,即构建于两个表的两个字段之间的参照关系。

设置外键约束的两个表之间具有父子关系,即子表中某个字段的取值范围由父表决定,在具体设置FK约束时,设置FK约束的字段必须依赖于数据库中已经存在的父表的主键,同时外键可以为NULL,且子表中外键的属性类型必须和父表中参考的属性类型一致。其语法形式如下:

create table table_name(属性名 属性类型,
属性名 属性类型,
.....
constraint 外键约束名 foreign key(属性名1) reference 表名(属性名2));
首先创建出一个t_employee表:
mysql> create table t_employee(deptno INT,ename VARCHAR(20),esex VARCHAR(10),eage INT,ehiredate DATE);

mysql> desc t_employee;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| deptno    | int(11)     | YES  |     | NULL    |       |
| ename     | varchar(20) | YES  |     | NULL    |       |
| esex      | varchar(10) | YES  |     | NULL    |       |
| eage      | int(11)     | YES  |     | NULL    |       |
| ehiredate | date        | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
可以发现,t_dept和t_employee都有deptno字段(严格来说字段名并不要求一定一样,只需要子表字段的取值范围由父表决定就可以了),所以我们将deptno当作表t_employee的外键:
mysql> create table t_employee(deptno INT,ename VARCHAR(20),esex VARCHAR(20),eage INT,ehiredate DATE,constraint f_deptno foreign key(deptno) references t_dept(deptno));
Query OK, 0 rows affected (0.02 sec)

mysql> desc t_employee;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| deptno    | int(11)     | YES  | MUL | NULL    |       |
| ename     | varchar(20) | YES  |     | NULL    |       |
| esex      | varchar(20) | YES  |     | NULL    |       |
| eage      | int(11)     | YES  |     | NULL    |       |
| ehiredate | date        | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)













猜你喜欢

转载自blog.csdn.net/purple7826/article/details/80274833