Mysql基础使用

Mysql基础使用

六月 24, 2022
该文章更新于 2022.06.24

MySql基础操作


下载安装

https://blog.csdn.net/lingyiwin/article/details/81839435

https://www.runoob.com/mysql/mysql-install.html

1.create database创建数据库

1
create dtabase test;

2.create table创建数据表

1
2
3
4
5
6
7
CREATE TABLE IF NOT EXISTS `runoob_tbl`(
`runoob_id` INT UNSIGNED AUTO_INCREMENT,
`runoob_title` VARCHAR(100) NOT NULL,
`runoob_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL  ,就会报错。

AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。

  • PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。

ENGINE 设置存储引擎,CHARSET 设置编码。

3.表格相关操作

3.1 delete 删除表内记录,对于 MyISAM 会立刻释放磁盘空间,InnoDB 不会释放磁盘空间

1
2
delete from  student where  T_name = "张三";//条件删除
delete from student;//删除全部数据,保留表结构

3.2 truncate删除表全部数据,保留表结构,立刻释放磁盘空间 ,不管是 Innodb 和 MyISAM

1
truncate  table  student;

3.3 drop删除表全部数据和表结构,立刻释放磁盘空间,不管是 Innodb 和 MyISAM;

1
drop table student;
  • 当你不再需要该表时, 用 drop;

当你仍要保留该表,但要删除所有记录时, 用 truncate

当你要删除部分记录时, 用 delete。

4.inser into插入数据

1
2
3
4
5
6
7
INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date)
VALUES
("学习 PHP", "菜鸟教程", NOW());//主键设置为自增,可以不规定主键列field
select* from runoob_tbl;//查询表格的每条数据搭配where使用
select count( *) from runoob_tbl;//返回查询到的记录数量
//插入多条数据
INSERT INTO table_name (field1, field2,...fieldN) VALUES (valueA1,valueA2,...valueAN),(valueB1,valueB2,...valueBN),(valueC1,valueC2,...valueCN)......;

如果所有的列都要添加数据可以不规定列进行添加数据,此时如果主键设置为自增,可以写0或者null

1
2
3
mysql> INSERT INTO runoob_tbl
VALUES
(0, "JAVA 教程", "RUNOOB.COM", '2016-05-06');

5.select查询数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
```*

select \* : 返回所有记录

* limit N : 返回 N 条记录*

offset M : 跳过 M 条记录, 默认 M=0, 单独使用似乎不起作用*

limit N,M : 相当于 limit M offset N , 从第 N 条记录开始, 返回 M 条记录

```sql
mysql> SELECT* FROM table LIMIT 5,10; // 检索记录行 6-15
//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1
mysql> SELECT* FROM table LIMIT 95,-1; // 检索记录行 96-last.
//如果只给定一个参数,它表示返回最大的记录行数目:
mysql> SELECT* FROM table LIMIT 5; //检索前 5 个记录行
//换句话说,LIMIT n 等价于 LIMIT 0,n。
Mysql 的分页查询语句的性能分析

越往后分页,LIMIT 语句的偏移量就会越大,速度也会明显变慢。此时,我们可以通过子查询的方式来提高分页效率

1
2
SELECT*  FROM articles WHERE  id >=
(SELECT id FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 1) LIMIT 10

简单查询语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*websites  表名   NAME alexa url country  字段*/
SELECT * FROM websites; /* 查询表所有数据 */
SELECT NAME FROM websites; /* 查询表字段数据 */
SELECT* FROM websites where name = "广西"; /* 查询表字段下条件数据 */
SELECT* from websites where name like "_o%"; /* 模糊查询表下数据* /
SELECT* FROM websites where id BETWEEN "1" AND "5"; /* 查询表下字段范围数据 */
SELECT* FROM websites WHERE name in ("广西","百度"); /* 查询表字段下固定条件数据 */
SELECT DISTINCT country FROM Websites; /* 查询去重值 */
SELECT* FROM Websites WHERE country = "CN" AND alexa > 50; /*查询表下范围条件数据 */
SELECT* FROM Websites WHERE country = "USA" OR country="sh"; /* 查询表下条件不同值 */
SELECT* FROM Websites ORDER BY desc alexa; /* 查询表下值排序结果 */
SELECT* FROM Websites ORDER BY alexa DESC; /* 查询表下排序结果降序ESC升序 */
SELECT* FROM Websites LIMIT 2; /* 查询表下范围数据 */
SELECT name as zzz from websites; /*别名查询表下数据 */

6.Where语句

MySQL 的 WHERE 子句的字符串比较是不区分大小写的。 你可以使用 BINARY 关键字来设定 WHERE 子句的字符串比较是区分大小写的

1
SELECT*  from runoob_tbl WHERE BINARY runoob_author='runoob.com';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
```*

询语句中你可以使用一个或者多个表,表之间使用逗号, 分割,并使用WHERE语句来设定查询条件。*

你可以在 WHERE 子句中指定任何条件。*

你可以使用 AND 或者 OR 指定一个或多个条件。*

WHERE 子句也可以运用于 SQLDELETE 或者 UPDATE 命令。

```sql
//子语句的执行顺序
FROM, including JOINs –>where> group by> having>WINDOW functions–>SELECT>DISTINC–>UNIONT–> order by> LIMIT and OFFSET

7.UPDATE更新数据

1
2
3
4
5
//例子
update students set name="小明", age=19 where tel="13288097888";
update students set age=age+1 where id=5;
UPDATE runoob_tbl SET runoob_title = REPLACE(runoob_title, 'C++', 'Python') where
runoob_id = 3;//和replace函数配合使用

8.DELETE from删除数据

1
2
//例子
DELETE FROM runoob_tbl WHERE runoob_id=3;

注意:不使用 WHERE 子句将数据表的全部数据进行更新,所以要慎重。

9.like子语句

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
30
31
//例子
SELECT* from runoob_tbl WHERE runoob_author LIKE '%COM';
'%a' //以a结尾的数据
'a%' //以a开头的数据
'%a%' //含有a的数据
'_a_' //三位且中间字母是a的
'_a' //两位且结尾字母是a的
'a_' //两位且开头字母是a的
SELECT* FROM position WHERE name LIKE '%java%';
```*

`%`:表示任意 0 个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。*

` _`:表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句。

* `[]`:表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。*

`[^]` :表示不在括号所列之内的单个字符。其取值和 \[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。*

查询内容包含通配符时,由于通配符的缘故,导致我们查询特殊字符 “%”、“\ _”、“\[” 的语句无法正常实现,而把特殊字符用 “\[ ]” 括起便可正常查询。

### 10.UNION操作符

* UNION 语句:用于将不同表中相同列中查询的数据展示出来;(不包括重复数据)*

UNION ALL 语句:用于将不同表中相同列中查询的数据展示出来;(包括重复数据)

```sql
SELECT 列名称 FROM 表名称 UNION SELECT 列名称 FROM 表名称 ORDER BY 列名称;
SELECT 列名称 FROM 表名称 UNION ALL SELECT 列名称 FROM 表名称 ORDER BY 列名称;
SELECT country FROM Websites UNION ALL SELECT country FROM apps ORDER BY country;

11.ORDER BY排序

1
2
3
4
5
6
7
//后面可以跟where子语句
//使用 ASCDESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列
SELECT* from runoob_tbl ORDER BY submission_date ASC, sunId DESC ;
//如果字符集采用的是 gbk(汉字编码字符集),直接在查询语句后边添加 ORDER BY
SELECT* FROM runoob_tbl ORDER BY runoob_title;
//如果字符集采用的是 utf8(万国码),需要先对字段进行转码然后排序:
SELECT* FROM runoob_tbl ORDER BY CONVERT(runoob_title using gbk);

12.GROUP BY语句

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//创建数据库
SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `employee_tbl`;
CREATE TABLE `employee_tbl` (
`id` int(11) NOT NULL,
`name` char(10) NOT NULL DEFAULT '',
`date` datetime NOT NULL,
`singin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登录次数',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
BEGIN;
INSERT INTO `employee_tbl` VALUES ('1', '小明', '2016-04-22 15:25:33', '1'), ('2', '小王', '2016-04-20 15:25:47', '3'), ('3', '小丽', '2016-04-19 15:26:02', '2'), ('4', '小王', '2016-04-07 15:26:14', '4'), ('5', '小明', '2016-04-11 15:26:40', '4'), ('6', '小明', '2016-04-04 15:26:54', '2');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
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
30
31
SELECT * FROM employee_tbl;
+----+--------+---------------------+--------+
| id | name | date | singin |
+----+--------+---------------------+--------+
| 1 | 小明 | 2016-04-22 15:25:33 | 1 |
| 2 | 小王 | 2016-04-20 15:25:47 | 3 |
| 3 | 小丽 | 2016-04-19 15:26:02 | 2 |
| 4 | 小王 | 2016-04-07 15:26:14 | 4 |
| 5 | 小明 | 2016-04-11 15:26:40 | 4 |
| 6 | 小明 | 2016-04-04 15:26:54 | 2 |
+----+--------+---------------------+--------+
//接下来我们使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录:
mysql> SELECT name, COUNT( *) FROM employee_tbl GROUP BY name;
+--------+----------+
| name | COUNT( *) |
+--------+----------+
| 小丽 | 1 |
| 小明 | 3 |
| 小王 | 2 |
+--------+----------+
3 rows in set (0.01 sec)
//WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。
mysql> SELECT name, SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;
+--------+--------------+
| name | singin_count |
+--------+--------------+
| 小丽 | 2 |
| 小明 | 7 |
| 小王 | 7 |
| NULL | 16 |
+--------+--------------+

13.JOIN在多个表查询数据,默认为INNER

  • 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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
mysql> SELECT*  FROM tcount_tbl;
+---------------+--------------+
| runoob_author | runoob_count |
+---------------+--------------+
| 菜鸟教程 | 10 |
| RUNOOB.COM | 20 |
| Google | 22 |
+---------------+--------------+
3 rows in set (0.01 sec)

mysql> SELECT * from runoob_tbl;
+-----------+---------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 1 | 学习 PHP | 菜鸟教程 | 2017-04-12 |
| 2 | 学习 MySQL | 菜鸟教程 | 2017-04-12 |
| 3 | 学习 Java | RUNOOB.COM | 2015-05-01 |
| 4 | 学习 Python | RUNOOB.COM | 2016-03-06 |
| 5 | 学习 C | FK | 2017-04-05 |
+-----------+---------------+---------------+-----------------+
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
+-------------+-----------------+----------------+
| a.runoob_id | a.runoob_author | b.runoob_count |
+-------------+-----------------+----------------+
| 1 | 菜鸟教程 | 10 |
| 2 | 菜鸟教程 | 10 |
| 3 | RUNOOB.COM | 20 |
| 4 | RUNOOB.COM | 20 |
+-------------+-----------------+----------------+
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
+-------------+-----------------+----------------+
| a.runoob_id | a.runoob_author | b.runoob_count |
+-------------+-----------------+----------------+
| 1 | 菜鸟教程 | 10 |
| 2 | 菜鸟教程 | 10 |
| 3 | RUNOOB.COM | 20 |
| 4 | RUNOOB.COM | 20 |
| 5 | FK | NULL |
+-------------+-----------------+----------------+
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a RIGHT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
+-------------+-----------------+----------------+
| a.runoob_id | a.runoob_author | b.runoob_count |
+-------------+-----------------+----------------+
| 1 | 菜鸟教程 | 10 |
| 2 | 菜鸟教程 | 10 |
| 3 | RUNOOB.COM | 20 |
| 4 | RUNOOB.COM | 20 |
| NULL | NULL | 22 |
+-------------+-----------------+----------------+

14.NULL值处理

  1. IS NULL: 当列的值是 NULL,此运算符返回 true。

  2. IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。

  3. <=>: 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true。

你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。在 MySQL 中,NULL 值与任何其它值的比较(即使是 NULL)永远返回 NULL,即 NULL = NULL 返回 NULL 。

1
2
3
4
5
6
7
8
9
10
11
12
select * , columnName1+ifnull(columnName2,0) from tableName;
//columnName1,columnName2 为 int 型,当 columnName2 中,有值为 null //时,columnName1+columnName2=null, ifnull(columnName2,0) 把 columnName2 中 null 值转为 0
SELECT* FROM runoob_test_tbl WHERE runoob_count = NULL;
//不起作用,结果为空Empty set (0.00 sec)
SELECT * FROM runoob_test_tbl WHERE runoob_count IS NULL;
+---------------+--------------+
| runoob_author | runoob_count |
+---------------+--------------+
| 菜鸟教程 | NULL |
| Google | NULL |
+---------------+--------------+
2 rows in set (0.01 sec)

15.正则表达式

  • ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。

$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。

. 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用像 ‘[.\n]’ 的模式。

[...] 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。

[^...] 负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’。

p1|p2|p3 匹配 p1 或 p2 或 p3。例如,’z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 则匹配 “zood” 或 “food”。

* 匹配前面的子表达式零次或多次。例如,zo 能匹配 “z” 以及 “zoo”。 等价于{0,}。

  • + 匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。

{n} n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。

{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

1
2
3
4
5
6
7
8
//查找name字段中以'st'为开头的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';
//查找name字段中以'ok'为结尾的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
//查找name字段中包含'mar'字符串的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';
//查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

16.事务

  1. 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。

  2. 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。

  3. 事务用来管理 insert,update,delete 语句

  4. 原子性;一致性;隔离性;持久性

  5. 在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。

BEGIN 或 START TRANSACTION 显式地开启一个事务;

COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;

ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;

RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;

ROLLBACK TO identifier 把事务回滚到标记点;

SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。

17.ALTER命令

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

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
//使用了 ALTER 命令及 DROP 子句来删除以上创建表的 i 字段
ALTER TABLE testalter_tbl DROP i;
//使用 ADD 子句来向数据表中添加列
ALTER TABLE testalter_tbl ADD i INT;
SHOW COLUMNS FROM testalter_tbl; ;//查看表结构
//如果你需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT FIRST;
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT AFTER c;
//需要修改字段类型及名称, 你可以在ALTER命令中使用`MODIFY`或 `CHANGE`子句 。
ALTER TABLE testalter_tbl MODIFY c CHAR(10);
//使用 CHANGE 子句, 语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型
ALTER TABLE testalter_tbl CHANGE i j BIGINT;
//修改字段时,你可以指定是否包含值或者是否设置默认值
ALTER TABLE testalter_tbl
MODIFY j BIGINT NOT NULL DEFAULT 100;//如果你不设置默认值,MySQL会自动设置该字段默认为 NULL
//可以使用 ALTER 来修改字段的默认值
ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
//可以使用 ALTER 命令及 DROP子句来删除字段的默认值;删除之后就变成NULL
ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
//修改数据表类型,可以使用 ALTER 命令及 TYPE 子句来完成。尝试以下实例,我们将表 testalter_tbl 的类型修改为 MYISAM
ALTER TABLE testalter_tbl ENGINE = MYISAM;
//查看数据表类型
SHOW TABLE STATUS LIKE 'testalter_tbl'\G
//如果需要修改数据表的名称,可以在 ALTER TABLE 语句中使用 RENAME 子句来实现。
ALTER TABLE testalter_tbl RENAME TO alter_tbl;
//删除外键约束:keyName是外键别名
alter table tableName drop foreign key keyName;

18.索引

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//创建普通索引
CREATE INDEX indexName ON table_name (column_name)
//修改表结构(添加索引)
ALTER table tableName ADD INDEX indexName(columnName)
//创建表的时候直接指定索引
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
);
//删除索引
DROP INDEX [indexName] ON mytable;
//创建唯一索引。索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一
CREATE UNIQUE INDEX indexName ON mytable(username(length))
//修改表结构
ALTER table mytable ADD UNIQUE [indexName] (username(length))
//创建表的时候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
UNIQUE [indexName] (username(length))
);

使用ALTER 命令添加和删除索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

ALTER TABLE tbl_name ADD PRIMARY KEY (column_list):
该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list):
这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。

```**

使用 ALTER 命令添加和删除主键**

```sql

主键作用于列上(可以一个列或多个列联合主键),添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
你也可以使用 ALTER 命令删除主键:
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
删除主键时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。
 显示索引信息
你可以使用 SHOW INDEX 命令来列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息。
mysql> SHOW INDEX FROM table_name; \G

19.临时表

MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。当你使用 SHOW TABLES命令显示数据表列表时,你将无法看到 SalesSummary表。

1
2
3
4
5
6
CREATE TEMPORARY TABLE SalesSummary (
product_name VARCHAR(50) NOT NULL
, total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
, avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
, total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);

20.复制表

  1. 使用 SHOW CREATE TABLE 命令获取创建数据表(CREATE TABLE)语句,该语句包含了原数据表的结构,索引等。

  2. 复制以下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令 将完全的复制数据表结构。

  3. 如果你想复制表的内容,你就可以使用 INSERT INTO … SELECT 语句来实现。

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
//步骤一:获取数据表的完整结构。
SHOW CREATE TABLE runoob_tbl \G;
Table: runoob_tbl
Create Table: CREATE TABLE `runoob_tbl` (
`runoob_id` int(11) NOT NULL auto_increment,
`runoob_title` varchar(100) NOT NULL default '',
`runoob_author` varchar(40) NOT NULL default '',
`submission_date` date default NULL,
PRIMARY KEY (`runoob_id`),
UNIQUE KEY `AUTHOR_INDEX` (`runoob_author`)
) ENGINE=InnoDB
//步骤二:修改SQL语句的数据表名,并执行SQL语句。
CREATE TABLE `clone_tbl` (
`runoob_id` int(11) NOT NULL auto_increment,
`runoob_title` varchar(100) NOT NULL default '',
`runoob_author` varchar(40) NOT NULL default '',
`submission_date` date default NULL,
PRIMARY KEY (`runoob_id`),
UNIQUE KEY `AUTHOR_INDEX` (`runoob_author`)
) ENGINE=InnoDB;
//步骤三:拷贝数据表的数据
INSERT INTO clone_tbl (runoob_id,
runoob_title,
runoob_author,
submission_date)
SELECT runoob_id,runoob_title,
runoob_author,submission_date
FROM runoob_tbl;



-   END   -