引言
本篇博客将对 mysql 数据库中其它的命令进行简单的阐述,希望读者能够亲自实践操作,多加练习。
1、NULL 值
已知 MySQL 使用 select 命令及 where 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。
为了处理这种情况,MySQL 提供了三大运算符:
- 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 运算符。
例如:
select * , columnName1+ifnull(columnName2,0) from tableName;
columnName1,columnName2 为 int 型,当 columnName2 中,有值为 null 时,columnName1+columnName2=null, ifnull(columnName2,0) 把 columnName2 中 null 值转为 0。
在命令提示符中使用 NULL 值
实例:
select * from user_test_tbl where runoob_count IS NULL;
select * from user_test_tbl where runoob_count IS NOT NULL;
2、事务
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
- 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
- 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
- 事务用来管理 insert,update,delete 语句。
在 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。
mysql 事务处理方法:
1、用 BEGIN, ROLLBACK, COMMIT来实现
- BEGIN 开始一个事务
- ROLLBACK 事务回滚
- COMMIT 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:
- SET AUTOCOMMIT=0 禁止自动提交
- SET AUTOCOMMIT=1 开启自动提交
实例:
select * from user_transaction_test; # Empty set
#开始
begin;
#插入数据
insert into user_transaction_test value(5); # Query OK, 1 rows affected
#回滚
rollback; # Query OK, 0 rows affected
select * from user_transaction_test; # Empty set
#提交
commit;
3、alter 命令
需要修改数据表名或者修改数据表字段时,就需要使用到 alter 命令。
实例:
如下命令使用了 alter 命令及 drop 子句来删除以上创建表的 i 字段:
alter table testalter drop i;
如果数据表中只剩余一个字段则无法使用 drop 来删除字段。
使用 add 子句来向数据表中添加列,如下实例在表 testalter 中添加 i 字段,并定义数据类型:
alter table testalter add i INT;
如果你需要指定新增字段的位置,可以使用关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。
alter table testalter drop i;
alter table testalter add i INT FIRST;
alter table testalter drop i;
alter table testalter add i INT AFTER c;
修改字段类型及名称
如果需要修改字段类型及名称, 你可以在 alter 命令中使用 modify 或 change 子句 。
例如,把字段 c 的类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令:
alter table testalter modify c CHAR(10);
使用 change 子句, 语法有很大的不同。 在 change 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型。实例如下:
alter table testalter change i j BIGINT;
alter table testalter change i j INT;
修改字段默认值
可以使用 alter 来修改字段的默认值,实例:
alter table testalter alter i set default 1000;
也可使用 alter 命令及 frop子句来删除字段的默认值:
alter table testalter alter i drop default;
修改数据表类型,可以使用 alter 命令及 type 子句来完成。尝试以下实例,我们将表 testalter 的类型修改为 MYISAM :
alter table testalter ENGINE = MYISAM;
如果需要修改数据表的名称,可以在 alter table 语句中使用 rename 子句来实现。
alter table testalter rename to alter_test;
4、索引
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
普通索引
创建索引:
create index indexName on mytable(username(length));
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
修改表结构(添加索引):
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 命令添加和删除索引
有四种方式来添加数据表的索引:
- 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 命令添加和删除主键
主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:
alter table testalter_tbl modify i INT NOT NULL;
alter table testalter_tbl add PRIMARY KEY (i);
也可以使用 ALTER 命令删除主键:
alter table testalter_tbl drop PRIMARY KEY;
删除主键时只需指定 PRIMARY KEY,但在删除索引时,你必须知道索引名。
显示索引信息
可以使用 show index 命令来列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息:
show index table_name; \G
5、临时表
MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,会自动删除表并释放所有空间。
create temporary table SalesSummary();
drop table SalesSummary;
6、复制表
1、使用 show create table 命令获取创建数据表(create table) 语句,该语句包含了原数据表的结构,索引等。
SHOW CREATE TABLE test \G;
2、根据显示的内容,修改下面的语句,并执行,可完全的复制数据表结构。
CREATE TABLE `clone_test`(
...
);
3、复制表的内容,可以使用 insert into … select 语句从 test 表复制。
INSERT INTO clone_tbl ( ... ) select ... from test;
7、元数据
命令 | 描述 |
---|---|
select version( ) | 服务器版本信息 |
select database( ) | 当前数据库名 (或者返回空) |
select user( ) | 当前用户名 |
show status | 服务器状态 |
show variables | 服务器配置变量 |
8、序列使用
MySQL 序列是一组整数,由于一张数据表只能有一个字段自增主键, 如果想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。
使用 AUTO_INCREMENT:
create table test
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id),
name VARCHAR(30) NOT NULL, # type of insect
date DATE NOT NULL, # date collected
origin VARCHAR(30) NOT NULL # where collected
);
重置序列:
alter table test drop id;
alter table test
add id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
add PRIMARY KEY (id);
设置序列的开始值:
create table test
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id),
name VARCHAR(30) NOT NULL, # type of insect
date DATE NOT NULL, # date collected
origin VARCHAR(30) NOT NULL # where collected
)engine=innodb auto_increment=100 charset=utf8;
或者:
alter table t AUTO_INCREMENT = 100;
9、处理重复数据
防止表中出现重复数据
可以在数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性:
create table person_tbl
(
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10),
PRIMARY KEY (last_name, first_name)
);
另一种设置数据的唯一性方法是添加一个UNIQUE索引,如下所示:
create table person_tbl
(
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10),
UNIQUE (last_name, first_name)
);
统计重复数据
select count(*) as repetitions, last_name, first_name
from person_tbl
group by last_name, first_name
having repetitions > 1;
以上查询语句将返回 person_tbl 表中重复的记录数。 一般情况下,查询重复的值,请执行以下操作:确定哪一列包含的值可能会重复;在列选择列表使用 count(*) 列出的那些列;在 group by 子句中列出的列;having 子句设置重复数大于 1。
过滤重复数据
读取不重复的数据可以在 select 语句中使用 distinct 关键字来过滤重复数据。
select distinct last_name, first_name from person_tbl;
也可以使用 group by 来读取数据表中不重复的数据:
select last_name, first_name from person_tbl group by (last_name, first_name);
删除重复数据
删除数据表中的重复数据,可以使用以下的语句:
create table tmp select last_name, first_name, sex from person_tbl group by (last_name, first_name, sex);
drop table person_tbl;
alter table tmp rename to person_tbl;
也可以在数据表中添加 index(索引) 和 PRIMAY KEY(主键)这种简单的方法来删除表中的重复记录。方法如下:
alter ignore table person_tbl add PRIMARY KEY (last_name, first_name);