MySQL语句(菜鸟教程)

创建数据库

语法为:
CREATE DATABASE 数据库名;

1
2
mysql> create database dsq_mysql;
Query OK, 1 row affected (0.01 sec)

删除数据库

语法为:
drop database <数据库名>;

1
2
mysql> drop database test;
Query OK, 0 rows affected (0.00 sec)

选择数据库

  在你连接到 MySQL 数据库后,可能有多个可以操作的数据库,所以你需要选择你要操作的数据库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| 16netlab |
| dsq_mysql |
| mysql |
| performance_schema |
| shop |
+--------------------+
6 rows in set (0.00 sec)

mysql> use dsq_mysql;
Database changed

创建数据表

创建MySQL数据表需要 表名、表字段名、表字段定义:
CREATE TABLE table_name (column_name column_type);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> create table dsq_table(
-> dsq_id int unsigned auto_increment,
-> title varchar(100) not null,
-> name varchar(20) not null,
-> sex varchar(10) not null,
-> date DATE ,
-> primary key(dsq_id))
-> default charset=utf8;
Query OK, 0 rows affected (0.14 sec)

mysql> desc dsq_table;
+--------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------------+------+-----+---------+----------------+
| dsq_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| title | varchar(100) | NO | | NULL | |
| name | varchar(20) | NO | | NULL | |
| sex | varchar(10) | NO | | NULL | |
| date | DATE | YES | | NULL | |
+--------+------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

删除数据表

语法为:
DROP TABLE table_name ;

1
2
mysql> drop table test;
Query OK, 0 rows affected (0.05 sec)

插入数据

MySQL 表中使用 INSERT INTO SQL语句来插入数据。
语法为:

1
2
3
INSERT INTO table_name ( field1, field2,...fieldN )  
VALUES
( value1, value2,...valueN );
1
2
3
4
5
6
7
8
9
mysql> insert into dsq_table (title,name,sex,date)
-> values
-> ('study','qwe','m',now());
Query OK, 1 row affected, 1 warning (0.22 sec)

mysql> insert into dsq_table (title,name,sex,date)
-> values
-> ('play','asd','f','2008-02-22');
Query OK, 1 row affected (0.02 sec)

查询数据

MySQL 数据库使用SQL SELECT语句来查询数据。
以下为在MySQL数据库中查询数据通用的 SELECT 语法:

1
2
3
4
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
  • 查询语句中可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
  • SELECT 命令可以读取一条或者多条记录。
  • 可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
  • 可以使用 WHERE 语句来包含任何条件。
  • 可以使用 LIMIT 属性来设定返回的记录数。
  • 可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> select * from dsq_table;
+--------+-------+------+-----+------------+
| dsq_id | title | name | sex | date |
+--------+-------+------+-----+------------+
| 1 | study | qwe | m | 2019-02-21 |
| 2 | play | asd | f | 2008-02-22 |
+--------+-------+------+-----+------------+
2 rows in set (0.00 sec)

mysql> select name,sex from dsq_table;
+------+-----+
| name | sex |
+------+-----+
| qwe | m |
| asd | f |
+------+-----+
2 rows in set (0.00 sec)

where子句

  如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中。
语法如下:

1
2
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
  • 查询语句中可以使用一个或者多个表,表之间使用逗号, 分割,并使用WHERE语句来设定查询条件。
  • 可以在 WHERE 子句中指定任何条件。
  • 可以使用 AND 或者 OR 指定一个或多个条件。
  • WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。
  • WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。
  • WHERE 子句的字符串比较是不区分大小写的。 使用 BINARY 关键字来设定 WHERE 子句的字符串比较是区分大小写的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> select * from dsq_table 
-> where sex = 'm';
+--------+-------+------+-----+------------+
| dsq_id | title | name | sex | date |
+--------+-------+------+-----+------------+
| 1 | study | qwe | m | 2019-02-21 |
+--------+-------+------+-----+------------+
1 row in set (0.01 sec)

mysql> select * from dsq_table
-> where binary sex = 'F';
Empty set (0.00 sec)

mysql> select * from dsq_table
-> where dsq_id > 1;
+--------+-------+------+-----+------------+
| dsq_id | title | name | sex | date |
+--------+-------+------+-----+------------+
| 2 | play | asd | f | 2008-02-22 |
+--------+-------+------+-----+------------+
1 row in set (0.00 sec)

Update查询

  需要修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作

1
2
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
  • 可以同时更新一个或多个字段。
  • 可以在 WHERE 子句中指定任何条件。
  • 可以在一个单独表中同时更新数据。
1
2
3
4
5
6
7
8
9
10
11
12
mysql> update dsq_table set name = 'zxc',date = '2000-01-01' 
-> where dsq_id = 2;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from dsq_table;
+--------+-------+------+-----+------------+
| dsq_id | title | name | sex | date |
+--------+-------+------+-----+------------+
| 1 | study | qwe | m | 2019-02-21 |
| 2 | play | zxc | f | 2000-01-01 |
+--------+-------+------+-----+------------+
2 rows in set (0.00 sec)

可以看到第二行已经更新

delect 语句

  使用 SQL 的 DELETE FROM 命令来删除 MySQL 数据表中的记录

1
DELETE FROM table_name [WHERE Clause]

  如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。

1
2
3
4
5
6
7
8
9
10
11
mysql> delete from dsq_table  
-> where dsq_id = 1;
Query OK, 1 row affected (0.03 sec)

mysql> select * from dsq_table;
+--------+-------+------+-----+------------+
| dsq_id | title | name | sex | date |
+--------+-------+------+-----+------------+
| 2 | play | zxc | f | 2000-01-01 |
+--------+-------+------+-----+------------+
1 row in set (0.00 sec)

like子句

  有时候我们需要根据某个字符去匹配某个字段(field)中的所有记录,即模糊查询、模式匹配,这时我们就需要在 WHERE 子句中使用 SQL LIKE 子句。
   SQL LIKE 子句中使用百分号 %字符来表示任意字符,类似于UNIX或正则表达式中的星号 *。
如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的。
语法为:

1
2
3
SELECT field1, field2,...fieldN 
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
1
2
3
4
5
6
7
8
9
mysql> select * from dsq_table 
-> where title like '%lab';
+--------+--------+------+-----+------------+
| dsq_id | title | name | sex | date |
+--------+--------+------+-----+------------+
| 3 | netlab | dsq | f | 2019-03-25 |
| 4 | netlab | dsq | m | 2019-03-25 |
+--------+--------+------+-----+------------+
2 rows in set (0.00 sec)

排序(order by)

  如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定按哪个字段哪种方式来进行排序,再返回搜索结果
语法为:

1
2
3
/*ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列*/
SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]

  下面读取dsq_table表,按照升序和降序的方式排列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> select * from dsq_table
-> order by dsq_id;
+--------+--------+------+-----+------------+
| dsq_id | title | name | sex | date |
+--------+--------+------+-----+------------+
| 2 | play | zxc | f | 2000-01-01 |
| 3 | netlab | dsq | f | 2019-03-25 |
| 4 | netlab | dsq | m | 2019-03-25 |
+--------+--------+------+-----+------------+
3 rows in set (0.00 sec)

mysql> select * from dsq_table
-> order by dsq_id desc;
+--------+--------+------+-----+------------+
| dsq_id | title | name | sex | date |
+--------+--------+------+-----+------------+
| 4 | netlab | dsq | m | 2019-03-25 |
| 3 | netlab | dsq | f | 2019-03-25 |
| 2 | play | zxc | f | 2000-01-01 |
+--------+--------+------+-----+------------+
3 rows in set (0.00 sec)

GROUP BY 语句

  GROUP BY 语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。
  语法为:

1
2
3
4
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

  创建表emplotee_tbl,并插入数据,使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> SELECT * FROM employee_tbl;
+----+------+---------------------+--------+
| id | name | date | singin |
+----+------+---------------------+--------+
| 1 | ming | 2016-04-22 15:25:33 | 1 |
| 2 | wang | 2016-04-20 15:25:47 | 3 |
| 3 | li | 2016-04-19 15:26:02 | 2 |
| 4 | wang | 2016-04-07 15:26:14 | 4 |
| 5 | ming | 2016-04-11 15:26:40 | 4 |
| 6 | ming | 2016-04-04 15:26:54 | 2 |
+----+------+---------------------+--------+
6 rows in set (0.00 sec)

mysql> SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
+------+----------+
| name | COUNT(*) |
+------+----------+
| li | 1 |
| ming | 3 |
| wang | 2 |
+------+----------+
3 rows in set (0.00 sec)

  GROUP BY子句 WITH ROLLUP ,可以实现在分组统计数据基础上再进行相同的统计

1
2
3
4
5
6
7
8
9
10
11
12
mysql> select name,sum(singin) as singin_count 
-> from employee_tbl
-> group by name with rollup;
+------+--------------+
| name | singin_count |
+------+--------------+
| li | 2 |
| ming | 7 |
| wang | 7 |
| NULL | 16 |
+------+--------------+
4 rows in set (0.00 sec)

  与上表相比多了一行对每人登录次数的统计,可以使用coalesce设置一个取代Null的名称
语法为:

1
select coalesce(a,b,c);

  返回第一个非零参数或者NULL(Returns the first non-NULL value in the list, or NULL if there are no non-NULL values.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
mysql> SELECT COALESCE(NULL,1);
+------------------+
| COALESCE(NULL,1) |
+------------------+
| 1 |
+------------------+
1 row in set (0.03 sec)

mysql> SELECT COALESCE(NULL,null,null);
+--------------------------+
| COALESCE(NULL,NULL,NULL) |
+--------------------------+
| NULL |
+--------------------------+
1 row in set (0.00 sec)

mysql> select coalesce(name,'total'),sum(singin) as singin_count
-> from employee_tbl
-> group by name with rollup;
+------------------------+--------------+
| coalesce(name,'total') | singin_count |
+------------------------+--------------+
| li | 2 |
| ming | 7 |
| wang | 7 |
| total | 16 |
+------------------------+--------------+
4 rows in set (0.00 sec)

MySQL连接表

  可以在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。
  JOIN 按照功能大致分为如下三类:

  • INNER JOIN(内连接,或等值连接):两边表同时有对应的数据,即任何一边缺失数据就不显示。
  • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
  • RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

有如下两个表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> select * from dsq_tbl;
+----+-------+--------+------------+
| id | title | author | date |
+----+-------+--------+------------+
| 1 | qwe | 1 | 2000-01-01 |
| 2 | rty | 2 | 2000-01-02 |
| 3 | uiop | 1 | 2000-01-03 |
| 4 | asd | 3 | 2000-01-04 |
| 5 | fghj | 2 | 2000-01-05 |
| 6 | kl | 4 | 2000-01-06 |
+----+-------+--------+------------+
6 rows in set (0.00 sec)

mysql> select * from dsq_tbl2;
+--------+-------+
| author | stars |
+--------+-------+
| 1 | 20 |
| 2 | 35 |
| 3 | 47 |
+--------+-------+
3 rows in set (0.00 sec)

  接下来使用 inner join(也可以省略 inner 使用 join,效果一样)来连接两张表并显示

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> select * from dsq_tbl inner join dsq_tbl2 
-> on dsq_tbl.author = dsq_tbl2.author;
+----+-------+--------+------------+--------+-------+
| id | title | author | date | author | stars |
+----+-------+--------+------------+--------+-------+
| 1 | qwe | 1 | 2000-01-01 | 1 | 20 |
| 2 | rty | 2 | 2000-01-02 | 2 | 35 |
| 3 | uiop | 1 | 2000-01-03 | 1 | 20 |
| 4 | asd | 3 | 2000-01-04 | 3 | 47 |
| 5 | fghj | 2 | 2000-01-05 | 2 | 35 |
+----+-------+--------+------------+--------+-------+
5 rows in set (0.00 sec)
以上语句等价于 select * from dsq_tbl,dsq_tbl2 WHERE dsq_tbl.author = dsq_tbl2.author;

  left join 与 join 有所不同。 left join 会读取左边数据表的全部数据,即便右边表无对应数据

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> select * from dsq_tbl left join dsq_tbl2  
-> on dsq_tbl.author = dsq_tbl2.author;
+----+-------+--------+------------+--------+-------+
| id | title | author | date | author | stars |
+----+-------+--------+------------+--------+-------+
| 1 | qwe | 1 | 2000-01-01 | 1 | 20 |
| 3 | uiop | 1 | 2000-01-03 | 1 | 20 |
| 2 | rty | 2 | 2000-01-02 | 2 | 35 |
| 5 | fghj | 2 | 2000-01-05 | 2 | 35 |
| 4 | asd | 3 | 2000-01-04 | 3 | 47 |
| 6 | kl | 4 | 2000-01-06 | NULL | NULL |
+----+-------+--------+------------+--------+-------+
6 rows in set (0.00 sec)

  right join 会读取右边数据表的全部数据,即便左边边表无对应数据。

1
2
3
4
5
6
7
8
9
10
11
mysql> select * from dsq_tbl right  join dsq_tbl2 on dsq_tbl.author = dsq_tbl2.author;
+------+-------+--------+------------+--------+-------+
| id | title | author | date | author | stars |
+------+-------+--------+------------+--------+-------+
| 1 | qwe | 1 | 2000-01-01 | 1 | 20 |
| 2 | rty | 2 | 2000-01-02 | 2 | 35 |
| 3 | uiop | 1 | 2000-01-03 | 1 | 20 |
| 4 | asd | 3 | 2000-01-04 | 3 | 47 |
| 5 | fghj | 2 | 2000-01-05 | 2 | 35 |
+------+-------+--------+------------+--------+-------+
5 rows in set (0.00 sec)

下面为一个left join 的应用场景

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));

解:
select e.last_name,e.first_name,d.dept_no
from employees as e left join dept_emp as d
on e.emp_no = d.emp_no

https://www.cnblogs.com/leochenliang/p/7364665.html(left join on and 与 left join on where的区别)

关于NULL值

运算符操作:

  • IS NULL: 当列的值是 NULL,此运算符返回 true。
  • IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
  • <=>: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true。

  关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。在 MySQL 中,NULL 值与任何其它值的比较(即使是 NULL)永远返回 false,即 NULL = NULL 返回false 。MySQL 中处理 NULL 使用 IS NULL 和 IS NOT NULL 运算符。

1
2
select * , columnName1 + ifnull(columnName2,0) from tableName;
columnName1,columnName2 为 int 型,当 columnName2 中,有值为 null 时,columnName1+columnName2=null, ifnull(columnName2,0) 把 columnName2 中 null 值转为 0。

  下面为一个left jion 与 null值判断的组合使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
获取所有非manager的员工emp_no
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));

解:先使用LEFT JOIN连接两张表,再从此表中选出dept_no值为NULL对应的emp_no记录
select e.emp_no
from employees e left join dept_manager d
on e.emp_no = d.emp_no
where d.emp_no is null;

ALTER

  修改数据表名或者修改数据表字段时,需要使用到MySQL ALTER命令

1.删除,添加或修改表字段

  如果数据表中只剩余一个字段则无法使用DROP来删除字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
mysql> describe dsq_table;
+--------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------------+------+-----+---------+----------------+
| dsq_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| title | varchar(100) | NO | | NULL | |
| name | varchar(20) | NO | | NULL | |
| sex | varchar(10) | NO | | NULL | |
| date | date | YES | | NULL | |
+--------+------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

mysql> alter table dsq_table drop sex;
Query OK, 0 rows affected (0.56 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> describe dsq_table;
+--------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------------+------+-----+---------+----------------+
| dsq_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| title | varchar(100) | NO | | NULL | |
| name | varchar(20) | NO | | NULL | |
| date | date | YES | | NULL | |
+--------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

  添加列,并定义字段数据类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> alter table dsq_table add sex varchar(5);
Query OK, 0 rows affected (0.28 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> describe dsq_table;
+--------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------------+------+-----+---------+----------------+
| dsq_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| title | varchar(100) | NO | | NULL | |
| name | varchar(20) | NO | | NULL | |
| date | date | YES | | NULL | |
| sex | varchar(5) | YES | | NULL | |
+--------+------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

  如果需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> alter table dsq_table add hobby varchar(100) after name;
Query OK, 0 rows affected (0.28 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> describe dsq_table;
+--------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------------+------+-----+---------+----------------+
| dsq_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| title | varchar(100) | NO | | NULL | |
| name | varchar(20) | NO | | NULL | |
| hobby | varchar(100) | YES | | NULL | |
| date | date | YES | | NULL | |
| sex | varchar(5) | YES | | NULL | |
+--------+------------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)
2.修改字段类型及名称

如果需要修改字段类型及名称, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句
语法为:

1
2
ALTER TABLE testalter_tbl MODIFY c CHAR(10); #把字段 c 的类型从 CHAR(1) 改为 CHAR(10)
ALTER TABLE testalter_tbl CHANGE j i INT; #把字段 j 的名称变为 i ,类型为 INT
3.关于Null 值和默认值

  如果不设置默认值,MySQL会自动设置该字段默认为 NULL,如下所示

1
2
3
4
5
6
7
8
9
10
mysql> describe dsq_tbl;
+--------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| title | varchar(20) | YES | | NULL | |
| author | varchar(20) | YES | | NULL | |
| date | date | YES | | NULL | |
+--------+----------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

  当进行修改字段时,可以指定是否包含值或者是否设置默认值。需要设置not null ,默认值才会有效。语法为 :

1
2
mysql> ALTER TABLE tablename 
-> MODIFY col_name column_definition NOT NULL DEFAULT ***;

  如下,将字段date 默认值更改为当前日期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> alter table dsq_tbl modify date timestamp not null default CURRENT_timestamp;
Query OK, 8 rows affected (0.34 sec)
Records: 8 Duplicates: 0 Warnings: 0

mysql> describe dsq_tbl;
+--------+----------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------------------+------+-----+-------------------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| title | varchar(20) | YES | | NULL | |
| author | varchar(20) | YES | | NULL | |
| date | timestamp | NO | | CURRENT_TIMESTAMP | |
+--------+----------------------+------+-----+-------------------+----------------+
4 rows in set (0.00 sec)
4.修改字段默认值

语法为:

1
ALTER  TABLE tbl_name  ALTER  col_name {SET DEFAULT literal | DROP DEFAULT}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
mysql> alter table dsq_tbl alter author set default 10;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> describe dsq_tbl;
+--------+----------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------------------+------+-----+-------------------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| title | varchar(20) | YES | | NULL | |
| author | varchar(20) | YES | | 10 | |
| date | timestamp | NO | | CURRENT_TIMESTAMP | |
+--------+----------------------+------+-----+-------------------+----------------+
4 rows in set (0.00 sec)

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

mysql> describe dsq_tbl;
+--------+----------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------------------+------+-----+-------------------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| title | varchar(20) | YES | | NULL | |
| author | varchar(20) | YES | | NULL | |
| date | timestamp | NO | | CURRENT_TIMESTAMP | |
+--------+----------------------+------+-----+-------------------+----------------+
4 rows in set (0.01 sec)
5.修改表名

  如果需要修改表名,可以在 ALTER TABLE 语句中使用 RENAME 子句 ,或者RENAME TABLE语句

语法:

1
2
3
RENAME TABLE
tbl_name TO new_tbl_name
[, tbl_name2 TO new_tbl_name2] ...

  RENAME TABLE重命名一个或多个表。但是必须具有ALTER与 DROP原始表的权限,以及CREATE与 INSERT新表的权限

1
2
3
RENAME TABLE old_table TO new_table;
等价于
ALTER TABLE old_table RENAME new_table;

  RENAME TABLE 与 ALTER TABLE 的不同在于,RENAME TABLE 可以在一个语句中重命名多个表

1
2
3
4
交换两个表的名称
RENAME TABLE old_table TO tmp_table,
new_table TO old_table,
tmp_table TO new_table;

  使用RENAME TABLE将表从一个数据库移动到另一个数据库:

1
RENAME TABLE current_db.tbl_name TO other_db.tbl_name;

表的显示

在进入MYSQL时,提示的第二行有这样一句话” Commands end with ; or \g.”

1
2
3
4
5
6
7
8
9
mysql> select * from dsq_table \g
+--------+--------+------+-------+------------+------+
| dsq_id | title | name | hobby | date | sex |
+--------+--------+------+-------+------------+------+
| 2 | play | zxc | NULL | 2000-01-01 | NULL |
| 3 | netlab | dsq | NULL | 2019-03-25 | NULL |
| 4 | netlab | dsq | NULL | 2019-03-25 | NULL |
+--------+--------+------+-------+------------+------+
3 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
使用 \G 是垂直显示结果(ego       (\G) Send command to mysql server, display result vertically.)。
mysql> select * from dsq_table \G
*************************** 1. row ***************************
dsq_id: 2
title: play
name: zxc
hobby: NULL
date: 2000-01-01
sex: NULL
*************************** 2. row ***************************
dsq_id: 3
title: netlab
name: dsq
hobby: NULL
date: 2019-03-25
sex: NULL
*************************** 3. row ***************************
dsq_id: 4
title: netlab
name: dsq
hobby: NULL
date: 2019-03-25
sex: NULL
3 rows in set (0.00 sec)
------ end ------
0%