MySQL 数据库命令

引言

本篇博客将对 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,用来禁止使用当前会话的自动提交。

事务控制语句

  1. BEGIN或START TRANSACTION;显式地开启一个事务;
  2. COMMIT,也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改成为永久性的;
  3. ROLLBACK,有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
  4. SAVEPOINT identifier,SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;
  5. RELEASE SAVEPOINT identifier,删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
  6. ROLLBACK TO identifier,把事务回滚到标记点;
  7. 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);

猜你喜欢

转载自blog.csdn.net/bingfeilongxin/article/details/87919267