Mysql 基本操作 MySQL where子句 使用 union 命令连接两个以上的 select 语句的结合到一个集合中 使用 order by 命令来对数据进行排序 MySQL 事务 MySQL 导出数据 MySQL 导入数据

Mysql 基本操作
MySQL where子句
使用 union 命令连接两个以上的 select 语句的结合到一个集合中
使用 order by 命令来对数据进行排序
MySQL 事务
MySQL 导出数据
MySQL 导入数据

由于mysql刚刚安装完的时候,mysql的root用户的密码默认是空的,所以我们需要及时用mysql的root用户登录(第一次回车键,不用输入密码),并修改密码 

初始登录mysql

[root@10 ~]# mysql -u root 
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 7
Server version: 5.6.37 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql> 

创建Mysql密码

[root@10]# mysqladmin -u root password "密码";

登录测试(密码是不显示的,正确输入即可)

[root@10 ~]# mysql -u root -p
Enter password: 

退出数据库

mysql> exit
Bye

Mysql对库的操作

查看数据库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

查看当前用户

mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

创建账号

创建一个只能在本机登陆的账号,密码为:123456
mysql> create user 'wanglan'@'localhost' identified by '123456'; 
Query OK, 0 rows affected (0.00 sec)

创建一个只能在指定IP地址机器登陆的账号,密码为:123456
mysql> create user 'wanglan'@'192.168.11.32' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

创建一个只要在一个相同网段的机器就能登陆的账号,密码为:123456
mysql> create user 'wang'@'192.168.11.%' identified by '123456'; 
Query OK, 0 rows affected (0.00 sec)

查看所有的用户

mysql> select host,user from mysql.user;
+--------------+------+
| host         | user |
+--------------+------+
| 10.0.0.21    |      |
| 10.0.0.21    | root |
| 127.0.0.1    | root |
| 192.168.11.% | wang |
| ::1          | root |
| localhost    |      |
| localhost    | root |
+--------------+------+
7 rows in set (0.00 sec)

删除账号

删除只能在本机登陆的wanglan的账号
mysql> drop user 'wanglan'@'localhost'; Query OK, 0 rows affected (0.00 sec)
删除指定IP登陆的账号
mysql> drop user 'wanglan'@'192.168.11.32'; Query OK, 0 rows affected (0.00 sec)

用户授权

 insert: 增   delete:删  update:改  select:查

授权wanglan用户对mysql中的user表有所有的权限
mysql> grant all on mysql.user to 'wanglan'@'localhost';
Query OK, 0 rows affected (0.00 sec)

授权wanglan用户对mysql中的user表用查的权限
mysql> grant select on mysql.user to 'wanglan'@'localhost';
Query OK, 0 rows affected (0.00 sec)

授权wanglan用户对mysql中的user表有增和查的权限
mysql> grant select,insert on mysql.user to 'wanglan'@'localhost'';
Query OK, 0 rows affected (0.00 sec)

授权wanglan用户对mysql中的user表有增改查的权限
mysql> grant select,insert,update on mysql.user to 'wanglan'@'loccalhost';
Query OK, 0 rows affected (0.00 sec)

授权wanglan用户对mysql中的user表有增删改查的权限
mysql> grant select,insert,update,delete on mysql.user to 'wanglaan'@'localhost';
Query OK, 0 rows affected (0.00 sec)

授权wanglan用户对所有的库和表都有查和增的权限
mysql> grant select,insert on *.* to 'wanglan'@'localhost';
Query OK, 0 rows affected (0.00 sec)

刷新权限

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

查看权限

mysql> show grants for 'wang'@'192.168.11.%';
+----------------------------------------------------------------------------------------------------------------+
| Grants for wang@192.168.11.%                                                                                   |
+----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wang'@'192.168.11.%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
| GRANT ALL PRIVILEGES ON `mysql`.`user` TO 'wang'@'192.168.11.%'                                                |
+----------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

创建一个名为wanglan的数据库

mysql> create database wanglan charset utf-8;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| wanglan            |
+--------------------+
4 rows in set (0.00 sec)

数据库不存在再创建

mysql> create database if not exists wanglan;
Query OK, 1 row affected (0.01 sec)

使用mysqladmin 创建数据库

[root@10 ~]# mysqladmin -u root -p create runoob
Enter password:输入mysql密码

删除数据库

mysql> drop database wanglan;   
Query OK, 0 rows affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

[root@10 ~]# mysqladmin -u root -p drop wanglan
Enter password: 数据库密码

执行以上删除数据库命令后,会出现一个提示框,来确认是否真的删除数据库

Dropping the database is potentially a very bad thing to do.
Any data stored in the database will be destroyed.

Do you really want to drop the 'haha' database [y/N] y
Database "wanglandropped

选择数据库(选择要操作的数据库,执行后所有Mysql命令都会只针对该数据库)

mysql> use mysql;   选择mysql 进行操作
Database changed

Mysql对表的操作

显示指定数据库的所有表,使用该命令前需要使用use命令来选择要操作的数据库

显示mysql 数据库中的所有表

mysql> use mysql;
5Database changed mysql> show tables; +---------------------------+ | Tables_in_mysql | +---------------------------+ | columns_priv | | db | | event | | func

 创建数据表

创建MySQL数据表需要的信息:表名、表字段名、定义每个表字段

创建mysql数据表语的SQL通用语法

create table  table_name (column_name column_type);

在wanglan数据库中创建名为teat的数据表

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| wanglan            |
+--------------------+
4 rows in set (0.00 sec)

mysql> use wanglan
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed

mysql> create table test(id int ,name char);
Query OK, 0 rows affected (0.05 sec)


mysql> create table if not exists `wanglan`(
`id` int unsigned auto_increment, 
`title` varchar(100) not null,
`author` varchar(40) not null,
`date` date,
primary key ( `id` )
)engine=InnoDB default charset=utf8;

auto_increment  #定义自增属性,一般用于主键,数字会自动加1
not null  #设置字段不能为空,操作是输入改字段为空就会报错
primary key  #定义列为主键,可以使用多列来定义主键,列间以逗号分隔
engine  #设置存储引擎
charset  #设置编码

查看上面创建表名为wanglan的表结构

mysql> desc wanglan;
+--------+------------------+------+-----+---------+----------------+
| Field  | Type             | Null | Key | Default | Extra          |
+--------+------------------+------+-----+---------+----------------+
| id     | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| title  | varchar(100)     | NO   |     | NULL    |                |
| author | varchar(40)      | NO   |     | NULL    |                |
| date   | date             | YES  |     | NULL    |                |
+--------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

 查看表

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

修改某个字段的属性

mysql> alter table test modify name char(4); #将char(1)更改为char(4)
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc test;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
| name  | char(4) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec)


mysql> alter table test change name stu_name char(4); 
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc test;
+----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| stu_name | char(4) | YES | | NULL | |
+----------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

删除表

mysql> drop table test;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
Empty set (0.00 sec)

操作文件中的内容

增加内容

语法

insert into table_name ( field1, field2,...fieldN )
                       values
                       ( value1, value2,...valueN );

在test插入数据

mysql> insert into test values(1,'王lan');
Query OK, 1 row affected (0.01 sec)

如果不能写入中文或字节过长就修改一下表结构
mysql> alter table test modify stu_name char(20) character set gbk;

在wanglan中插入数据

mysql> insert into wanglan
      (title, author, date)
       values
      ('Mysql','wanglan',NOW());
mysql> insert into wanglan
      (title, author, date)
      values
     ('Redis','wanglan',select NOW());

读取数据
mysql> select * from wanglan;                                   
+----+-------+---------+------------+
| id | title | author  | date       |
+----+-------+---------+------------+
|  1 | Mysql | wanglan | 2018-12-14 |
|  2 | Redis | wanglan | 2018-12-14 |
+----+-------+---------+------------+
2 rows in set (0.00 sec)

查看内容修改内容

mysql> select * from test;
+------+----------+
| id   | stu_name |
+------+----------+
|    1 | 王lan    |
+------+----------+
1 row in set (0.00 sec)
mysql> update test set stu_name = '王岚';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from test;                                      
+------+----------+
| id   | stu_name |
+------+----------+
|    1 | 王岚     |
+------+----------+
1 row in set (0.00 sec)

删除内容

mysql> delete from test where id=1;
Query OK, 1 row affected (0.01 sec)

mysql> select * from test;
Empty set (0.00 sec)

清空表

mysql> delete from test;  #如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。
Query OK, 0 rows affected (0.00 sec)

mysql> truncate table test; #删除速度比上一条快,且直接从零开始
Query OK, 0 rows affected (0.02 sec)

删除数据表的通用语法

drop table table_name;

删除wanglan数据表

mysql> drop tables wangaln;
Query OK, 0 rows affected (0.06 sec)
mysql> show tables;
Empty set (0.00 sec)

显示数据表的详细索引信息,包括PRIMARY KEY(主键)

mysql> show index from wanglan;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| wanglan |          0 | PRIMARY  |            1 | id          | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)

按列打印 wanglan 数据库中以wanglan开头的表的信息(查看某个表就把 runoob% 变成表名)

mysql> show table status from runoob like 'runoob%'G;
*************************** 1. row ***************************
           Name: runoob_tbl
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 0
 Avg_row_length: 0
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: 1
    Create_time: 2017-04-08 08:05:53
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.00 sec)

ERROR: 
No query specified

数据类型

MySQL支持所有标准SQL数值数据类型。

这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。

关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。

BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。

作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 字节 (-128,127) (0,255) 小整数值
SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 字节 (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度
浮点数值
DOUBLE 8 字节 (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度
浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值


日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

TIMESTAMP类型有专有的自动更新特性,将在后面描述。

类型 大小
(字节)
范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:00/2037 年某时 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

 

字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型 大小 用途
CHAR 0-255字节 定长字符串
VARCHAR 0-65535 字节 变长字符串
TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65 535字节 二进制形式的长文本数据
TEXT 0-65 535字节 长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据

CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。

有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求

where:有条件的从表中选取数据

以下为操作符列表,可用于 WHERE 子句中。

下表中实例假定 A 为 10, B 为 20

操作符 描述 实例
= 等号,检测两个值是否相等,如果相等返回true (A = B) 返回false。
<>, != 不等于,检测两个值是否相等,如果不相等返回true (A != B) 返回 true。
> 大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true (A > B) 返回false。
< 小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true (A < B) 返回 true。
>= 大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true (A >= B) 返回false。
<= 小于等于号,检测左边的值是否小于于或等于右边的值, 如果左边的值小于或等于右边的值返回true (A <= B) 返回 true。

如果我们想再 MySQL 数据表中读取指定的数据,WHERE 子句是非常有用的。

使用主键来作为 WHERE 子句的条件查询是非常快速的。

如果给定的条件在表中没有任何匹配的记录,那么查询不会返回任何数据。

使用where命令来查找读取runoob数据库中的数据

mysql> select * from runoob_tbl;
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         1 | 学习 PHP     | PHP           | 2017-04-09      |
|         2 | 学习 MySQL   | MySQL         | 2017-04-09      |
|         3 | 学习 MySQL   | MySQL         | 2017-04-09      |
|         4 | MYSQL教程    | RUNOOB.COM    | 2017-08-04      |
+-----------+--------------+---------------+-----------------+
4 rows in set (0.00 sec)

读取runoob_id为1的数据
mysql> select * from runoob_tbl where runoob_id='1';
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
| 1 | 学习 PHP | PHP | 2017-04-09 |
+-----------+--------------+---------------+-----------------+
1 row in set (0.00 sec)

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

mysql> select * from runoob_tbl;
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         1 | 学习 PHP     | PHP           | 2017-04-09      |
|         2 | 学习 MySQL   | MySQL         | 2017-04-09      |
|         3 | 学习 MySQL   | MySQL         | 2017-04-09      |
|         4 | MYSQL教程    | RUNOOB.COM    | 2017-08-04      |
+-----------+--------------+---------------+-----------------+
4 rows in set (0.00 sec)
查询小写的 runoob_author=runoob.com 的数据
mysql> select * from runoob_tbl where binary runoob_author='runoob.com';
Empty set (0.00 sec)
查询大写 runoob_author=RUNOOB.COM 的数据
mysql> select * from runoob_tbl where binary runoob_author='RUNOOB.COM';
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         4 | MYSQL教程    | RUNOOB.COM    | 2017-08-04      |
+-----------+--------------+---------------+-----------------+
1 row in set (0.00 sec)

mysql> 

 使用 update 命令来修改数据库中的数据

语法

update table_name set field1=new-value1, field2=new-value2
[WHERE Clause]
  • 你可以同时更新一个或多个字段。
  • 你可以在 WHERE 子句中指定任何条件。
  • 你可以在一个单独表中同时更新数据

更新数据表中 runoob_id 为 3 的 runoob_title 字段值

mysql> update runoob_tbl set runoob_title='学习 C++' WHERE runoob_id=3;
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql>  select * from runoob_tbl where binary runoob_id=3;
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         3 | 学习 C++     | MySQL         | 2017-04-09      |
+-----------+--------------+---------------+-----------------+
1 row in set (0.00 sec)

更新前后tunoob_tal表对比

mysql> select * from runoob_tbl;
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         1 | 学习 PHP     | PHP           | 2017-04-09      |
|         2 | 学习 MySQL   | MySQL         | 2017-04-09      |
|         3 | 学习 MySQL   | MySQL         | 2017-04-09      |
|         4 | MYSQL教程    | RUNOOB.COM    | 2017-08-04      |
+-----------+--------------+---------------+-----------------+
4 rows in set (0.00 sec)
mysql> select * from runoob_tbl; +-----------+--------------+---------------+-----------------+ | runoob_id | runoob_title | runoob_author | submission_date | +-----------+--------------+---------------+-----------------+ | 1 | 学习 PHP | PHP | 2017-04-09 | | 2 | 学习 MySQL | MySQL | 2017-04-09 | | 3 | 学习 C++ | MySQL | 2017-04-09 | | 4 | MYSQL教程 | RUNOOB.COM | 2017-08-04 | +-----------+--------------+---------------+-----------------+ 4 rows in set (0.00 sec)

从结果上看,runoob_id 为 3 的 runoob_title 已被修改

使用 delete 命令来修改数据库中的数据

语法

delete from table_name [WHERE Clause]
  • 如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。
  • 你可以在 WHERE 子句中指定任何条件
  • 您可以在单个表中一次性删除记录。

删除 runoob_tbl 表中 runoob_id 为3 的记录

mysql> delete from  runoob_tbl where runoob_id=3;
Query OK, 1 row affected (0.03 sec)

查看runoob_tal表数据 mysql> select * from runoob_tbl; +-----------+--------------+---------------+-----------------+ | runoob_id | runoob_title | runoob_author | submission_date | +-----------+--------------+---------------+-----------------+ | 1 | 学习 PHP | PHP | 2017-04-09 | | 2 | 学习 MySQL | MySQL | 2017-04-09 | | 4 | MYSQL教程 | RUNOOB.COM | 2017-08-04 | +-----------+--------------+---------------+-----------------+ 3 rows in set (0.00 sec)

使用 like 查找数据库中的关键词

LIKE 子句中使用百分号 %字符来表示任意字符,类似于UNIX或正则表达式中的星号 *。

如果没有使用百分号 %, like 子句与等号 = 的效果是一样的。

语法

select field1, field2,...fieldN 
from table_name
where field1 like condition1 [AND [OR]] filed2 = 'somevalue'
  • 你可以在 WHERE 子句中指定任何条件。
  • 你可以在 WHERE 子句中使用LIKE子句。
  • 你可以使用LIKE子句代替等号 =。
  • LIKE 通常与 % 一同使用,类似于一个元字符的搜索。
  • 你可以使用 AND 或者 OR 指定一个或多个条件。
  • 你可以在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句来指定条件。

在  select 命令中使用 where...like 子句来从MySQL数据表 runoob_tbl 中读取数据 

读取runoob_tbl 表中 runoob_author 字段中以 COM 为结尾的的所有记录

mysql> select  * from runoob_tbl  where  runoob_author like '%COM';
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         4 | MYSQL教程    | RUNOOB.COM    | 2017-08-04      |
+-----------+--------------+---------------+-----------------+
1 row in set (0.00 sec)

使用 union 命令连接两个以上的 select 语句的结合到一个集合中

语法

select expression1, expression2, ... expression_n
from tables
[WHERE conditions]
union all | DISTINCT]
select  expression1, expression2, ... expression_n
from tables
[WHERE conditions];
  • expression1, expression2, ... expression_n: 要检索的列。

  • tables: 要检索的数据表。

  • WHERE conditions: 可选, 检索条件。

  • DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。

  • ALL: 可选,返回所有结果集,包含重复数据。

演示

mysql> select 关键词 from 数据表
    -> union all
    -> select 关键词 from 数据表
    -> order by 关键词;

使用 order by 命令来对数据进行排序

语法

select field1, field2,...fieldN table_name1, table_name2...
order by field1, [field2...] [ASC [DESC]]
  • 你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
  • 你可以设定多个字段来排序。
  • 你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。
  • 你可以添加 WHERE...LIKE 子句来设置条件。

使用 order by 子句来读取MySQL 数据表 runoob_tbl 中的数据,将结果按升序及绛序来排列

升序

mysql>  select * from runoob_tbl order by submission_date ASC;
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         1 | 学习 PHP     | PHP           | 2017-04-09      |
|         2 | 学习 MySQL   | MySQL         | 2017-04-09      |
|         4 | MYSQL教程    | RUNOOB.COM    | 2017-08-04      |
+-----------+--------------+---------------+-----------------+
3 rows in set (0.12 sec)

绛序

mysql> select * from runoob_tbl order by submission_date DESC;
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         4 | MYSQL教程    | RUNOOB.COM    | 2017-08-04      |
|         1 | 学习 PHP     | PHP           | 2017-04-09      |
|         2 | 学习 MySQL   | MySQL         | 2017-04-09      |
+-----------+--------------+---------------+-----------------+
3 rows in set (0.00 sec)

正则

模式 描述
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ' ' 或 ' ' 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ' ' 或 ' ' 之前的位置。
. 匹配除 " " 之外的任何单个字符。要匹配包括 ' ' 在内的任何字符,请使用象 '[. ]' 的模式。
[...] 字符集合。匹配所包含的任意一个字符。例如, '[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 次。

查找 runoob_tbl 表中 runoob_title 字段中以" 学习" 为开头的所有数据

mysql> select runoob_title from runoob_tbl where runoob_title regexp '^学习';
+--------------+
| runoob_title |
+--------------+
| 学习 PHP     |
| 学习 MySQL   |
+--------------+
2 rows in set (0.00 sec)

查找 runoob_tbl 表中 runoob_title 字段中以" PHP" 为结尾的所有数据

mysql> select runoob_title from runoob_tbl where runoob_title regexp 'PHP$';
+--------------+
| runoob_title |
+--------------+
| 学习 PHP     |
+--------------+
1 row in set (0.00 sec

查找 runoob_tbl 表中 runoob_title 字段中包含"MYSQL " 的所有数据

mysql> select runoob_title from runoob_tbl where runoob_title regexp 'MYSQL';
+--------------+
| runoob_title |
+--------------+
| 学习 MySQL   |
| MYSQL教程    |
+--------------+
2 rows in set (0.00 sec)

MySQL 事务

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

  • 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
  • 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
  • 事务用来管理 insert,update,delete 语句

一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)

  • 1、事务的原子性:一组事务,要么成功;要么撤回。
  • 2、稳定性 :有非法数据(外键约束之类),事务撤回。
  • 3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
  • 4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit 选项 决定什么时候吧事务保存到日志里。

MYSQL 事务处理主要有两种方法:

1、用 BEGIN, ROLLBACK, COMMIT来实现

  • BEGIN 开始一个事务
  • ROLLBACK 事务回滚
  • COMMIT 事务确认

2、直接用 SET 来改变 MySQL 的自动提交模式:

  • SET AUTOCOMMIT=0 禁止自动提交
  • SET AUTOCOMMIT=1 开启自动提交

实例:

查看数据库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| RUNOOB             |
| mysql              |
| performance_schema |
| runoob             |
+--------------------+
5 rows in set (0.00 sec)

选择数据库

mysql> use runoob;
Database changed

创建 runoob_transaction_test 数据表 

mysql> create  table runoob_transaction_test( id int(5)) engine=innodb;
Query OK, 0 rows affected (0.08 sec)

查看数据库

mysql> select * from runoob_transaction_test;
Empty set (0.00 sec)

开始事物

mysql> begin; 
Query OK, 0 rows affected (0.00 sec)

插入数据

mysql> insert into runoob_transaction_test value(5);
Query OK, 1 row affected (0.00 sec)

mysql>  insert into runoob_transaction_test value(6);
Query OK, 1 row affected (0.00 sec)

提交事物

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

查看 runoob_transaction_test 数据表

mysql> select * from runoob_transaction_test;
+------+
| id   |
+------+
|    5 |
|    6 |
+------+
2 rows in set (0.00 sec)

开始事物

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

插入数据

mysql> insert into runoob_transaction_test values(7);
Query OK, 1 row affected (0.00 sec)

回滚

mysql> rollback;
Query OK, 0 rows affected (0.02 sec)

查看 runoob_transaction_test  数据表 (因为回滚所以数据没有插入)

mysql> select * from runoob_transaction_test; 
+------+
| id   |
+------+
|    5 |
|    6 |
+------+
2 rows in set (0.00 sec)

使用 alter 命令修改数据表或修改数据表字段

进入mysql数据库

[root@10 ~]# mysql -u root -p
Enter password: 

查看数据库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| RUNOOB             |
| mysql              |
| performance_schema |
| runoob             |
+--------------------+
5 rows in set (0.00 sec)

选择数据库

mysql> use runoob;
Database changed

创建 testalter_tbl 数据表

mysql> create table testalter_tbl
    ->     (
    ->     i INT,
    ->     c CHAR(1)
    ->     );
Query OK, 0 rows affected (0.34 sec)

查看 testalter_tbl 数据表

mysql> show columns from testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| i     | int(11) | YES  |     | NULL    |       |
| c     | char(1) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.03 sec)

使用了 alter 命令及 drop 子句来删除以上创建表的 i 字段:

mysql> alter table testalter_tbl  drop i;
Query OK, 0 rows affected (0.72 sec)
Records: 0  Duplicates: 0  Warnings: 0

如果数据表中只剩余一个字段则无法使用 drop 来删除字段,MySQL 中使用 add 子句来向数据表中添加列,如下实例在表 testalter_tbl 中添加 i 字段,并定义数据类型:

mysql> alter table testalter_tbl add i int;
Query OK, 0 rows affected (0.28 sec)
Records: 0  Duplicates: 0  Warnings: 0

执行以上命令后,i 字段会自动添加到数据表字段的末尾

mysql>  show columns from testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c     | char(1) | YES  |     | NULL    |       |
| i     | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

如果你需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。尝试以下 ALTER TABLE 语句, 在执行成功后,使用 SHOW COLUMNS 查看表结构的变化:

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;

FIRST 和 AFTER 关键字只占用于 ADD 子句,所以如果你想重置数据表字段的位置就需要先使用 DROP 删除字段然后使用 ADD 来添加字段并设置位置。

  

MySQL 导出数据

格式

[root@10 ~]#  mysqldump -u root -p 数据库名   表名 > 导出数据表名

实例

导出 runoob 数据库s到当前目录下并命为 runoobt.sql

[root@10 ~]# mysqldump -u root -p runoob > runoob.sql

导出 runoob 数据库中的 runoob_transaction_test 数据表到当前目录下并命为 runoob_transaction_test.sql

[root@10 ~]# mysqldump -u root -p runoob runoob_transaction_test > runoob_transaction_test.sql

导出 runoob 整个数据库中的所有的表结构

root@10 ~]# mysqldump -u root -p  -d runoob > runoob.sql

导出r unoob 整个数据库中的 runoob_transaction_test 表的表结构

[root@10 ~]# mysqldump -u root -p -d runoob runoob_transaction_test > runoob_transaction_test.sql

MySQL 导入数据

从文件 runoob_transaction_test.sql  中将数据导入到 runoob 数据库中, 可以使用以下命令:

[root@10 ~]#  mysqlimport -u root -p --local runoob runoob_transaction_test.sql
password *****