1 创建数据库 命令格式:CREATE DATABASE 数据库名;

mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.00 sec)

2 删除数据库 命令格式:drop database 数据库名;

mysql> drop database test;
Query OK, 0 rows affected (0.02 sec)

3 选择数据库 命令格式:use 数据库名;

mysql> use TEST;
Database changed

4 数据类型: 数值、日期/时间和字符串(字符)类型。

包括严格数值数据类型(INTEGERSMALLINTDECIMALNUMERIC),以及近似数值数据类型(FLOATREALDOUBLE PRECISION)。
表示时间值的日期和时间类型为DATETIMEDATETIMESTAMPTIMEYEAR
字符串类型指CHARVARCHARBINARYVARBINARYBLOBTEXTENUMSET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

5 创建数据表

创建MySQL数据表需要:表名、表字段名、定义每个表字段
命令格式:CREATE TABLE table_name (column_name column_type);

mysql> CREATE DATABASE TEST;
Query OK, 1 row affected (0.01 sec)mysql> use TEST;
Database changed
mysql> CREATE TABLE myTable(-> myTable_id INT NOT NULL AUTO_INCREMENT,-> myTable_title VARCHAR(100) NOT NULL,-> myTable_author VARCHAR(40) NOT NULL,-> submission_data DATE,-> PRIMARY KEY (myTable_id)-> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.04 sec)

如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
ENGINE 设置存储引擎,CHARSET 设置编码。
注意:MySQL命令终止符为分号 ; ,-> 是换行符标识。

6 删除数据表 命令格式:DROP TABLE table_name ;

mysql> use TEST;
Database changed
mysql> DROP TABLE myTable;
Query OK, 0 rows affected (0.02 sec)

7 插入数据 命令格式:

INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
mysql> use TEST;
Database changedmysql> CREATE TABLE myTable(-> myTable_id INT NOT NULL AUTO_INCREMENT,-> myTable_title VARCHAR(100) NOT NULL,-> myTable_author VARCHAR(40) NOT NULL,-> submission_date DATE,-> PRIMARY KEY (myTable_id)-> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.04 sec)mysql> INSERT INTO myTable-> (myTable_title,myTable_author,submission_date)-> VALUES-> ("php","教程",NOW());
Query OK, 1 row affected, 1 warning (0.02 sec)mysql> INSERT INTO myTable-> (myTable_title,myTable_author,submission_date)-> VALUES-> ("MySQL","教程",NOW());
Query OK, 1 row affected, 1 warning (0.00 sec)mysql> INSERT INTO myTable-> (myTable_title,myTable_author,submission_date)-> VALUES-> ("JAVA","com.cn",NOW());
Query OK, 1 row affected, 1 warning (0.00 sec)

8 查询数据

命令格式:

SELECT column_name,column_name
FROM table_name
[WHERE Clause][LIMIT N][ OFFSET M]
mysql> select*from myTable;       #读取数据表
+------------+---------------+----------------+-----------------+
| myTable_id | myTable_title | myTable_author | submission_date |
+------------+---------------+----------------+-----------------+
|          1 | php           | 教程           | 2019-09-17      |
|          2 | MySQL         | 教程           | 2019-09-17      |
|          3 | JAVA          | com.cn         | 2019-09-17      |
+------------+---------------+----------------+-----------------+
3 rows in set (0.00 sec)

查询语句中可以使用一个或者多个表,表之间使用逗号分割,并使用WHERE语句来设定查询条件。SELECT 命令可以读取一条或者多条记录。
可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据。
可以使用 WHERE 语句来包含任何条件。
可以使用 LIMIT 属性来设定返回的记录数。
可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。

9 MySQL WHERE 子句

从 MySQL 表中使用 SQL SELECT 语句来读取数据。如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中。
命令格式:
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 表中的字段值来读取指定的数据。

mysql> select*from myTable WHERE myTable_author="教程";
+------------+---------------+----------------+-----------------+
| myTable_id | myTable_title | myTable_author | submission_date |
+------------+---------------+----------------+-----------------+
|          1 | php           | 教程           | 2019-09-17      |
|          2 | MySQL         | 教程           | 2019-09-17      |
+------------+---------------+----------------+-----------------+
2 rows in set (0.00 sec)mysql> select*from myTable WHERE myTable_author="COM.CN";
+------------+---------------+----------------+-----------------+
| myTable_id | myTable_title | myTable_author | submission_date |
+------------+---------------+----------------+-----------------+
|          3 | JAVA          | com.cn         | 2019-09-17      |
+------------+---------------+----------------+-----------------+
1 row in set (0.00 sec)

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

mysql> SELECT*from myTable WHERE BINARY myTable_author="COM.CN";
Empty set (0.00 sec)mysql> SELECT*from myTable WHERE BINARY myTable_author="com.cn";
+------------+---------------+----------------+-----------------+
| myTable_id | myTable_title | myTable_author | submission_date |
+------------+---------------+----------------+-----------------+
|          3 | JAVA          | com.cn         | 2019-09-17      |
+------------+---------------+----------------+-----------------+
1 row in set (0.00 sec)

10 MySQL UPDATE 更新

需要修改或更新 MySQL 中的数据,可以使用 SQL UPDATE 命令来操作
命令格式:UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
可以同时更新一个或多个字段。可以在 WHERE 子句中指定任何条件。可以在一个单独表中同时更新数据。当需要更新数据表中指定行的数据时 WHERE 子句是非常有用的。

mysql> UPDATE myTable SET myTable_title="C++" WHERE myTable_id=3;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> SELECT*from myTable WHERE myTable_id=3;
+------------+---------------+----------------+-----------------+
| myTable_id | myTable_title | myTable_author | submission_date |
+------------+---------------+----------------+-----------------+
|          3 | C++           | com.cn         | 2019-09-17      |
+------------+---------------+----------------+-----------------+
1 row in set (0.00 sec)mysql> select*from myTable;
+------------+---------------+----------------+-----------------+
| myTable_id | myTable_title | myTable_author | submission_date |
+------------+---------------+----------------+-----------------+
|          1 | php           | 教程           | 2019-09-17      |
|          2 | MySQL         | 教程           | 2019-09-17      |
|          3 | C++           | com.cn         | 2019-09-17      |
+------------+---------------+----------------+-----------------+
3 rows in set (0.00 sec)

11 MySQL DELETE语句

命令格式:DELETE FROM table_name [WHERE Clause]
如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。
可以在 WHERE 子句中指定任何条件
可以在单个表中一次性删除记录。
当想删除数据表中指定的记录时 WHERE 子句是非常有用的。

mysql> use TEST;
Database changed
mysql> DELETE FROM myTable WHERE myTable_id=3;
Query OK, 1 row affected (0.00 sec)mysql> SELECT*from myTable;
+------------+---------------+----------------+-----------------+
| myTable_id | myTable_title | myTable_author | submission_date |
+------------+---------------+----------------+-----------------+
|          1 | php           | 教程           | 2019-09-17      |
|          2 | MySQL         | 教程           | 2019-09-17      |
+------------+---------------+----------------+-----------------+
2 rows in set (0.00 sec)

12 LIKE子句

SQL SELECT 语句使用 LIKE 子句从数据表中读取数据的通用语法:

SELECT field1, field2,...fieldN
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
mysql> use TEST;
Database changed
mysql> SELECT*from myTable;
+------------+---------------+----------------+-----------------+
| myTable_id | myTable_title | myTable_author | submission_date |
+------------+---------------+----------------+-----------------+
|          1 | php           | 教程           | 2019-09-17      |
|          2 | MySQL         | 教程           | 2019-09-17      |
|          4 | Python        | cn.com         | 2019-09-17      |
|          5 | LINUX         | cn.com         | 2019-09-17      |
+------------+---------------+----------------+-----------------+
4 rows in set (0.00 sec)mysql> SELECT*from myTable WHERE myTable_author LIKE "%com";
+------------+---------------+----------------+-----------------+
| myTable_id | myTable_title | myTable_author | submission_date |
+------------+---------------+----------------+-----------------+
|          4 | Python        | cn.com         | 2019-09-17      |
|          5 | LINUX         | cn.com         | 2019-09-17      |
+------------+---------------+----------------+-----------------+
2 rows in set (0.00 sec)

13 UNION 操作符

MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。
注:UNION 不能用于列出两个表中所有的country。如果一些网站和APP来自同一个国家,每个国家只会列出一次。UNION 只会选取不同的值。请使用 UNION ALL 来选取重复的值!

mysql> SELECT*from APP;
+--------+---------------+---------+
| APP_id | APP_name      | country |
+--------+---------------+---------+
|      1 | stackoverflow | IND     |
+--------+---------------+---------+
1 row in set (0.00 sec)mysql> SELECT*from WEB;
+--------+----------+---------+
| WEB_id | WEB_name | country |
+--------+----------+---------+
|      1 | BaiDu    | China   |
|      2 | Google   | USA     |
+--------+----------+---------+
2 rows in set (0.00 sec)mysql> SELECT country FROM APP-> UNION-> SELECT country FROM WEB-> ORDER BY country;
+---------+
| country |
+---------+
| China   |
| IND     |
| USA     |
+---------+
3 rows in set (0.00 sec)

14 排序

SQL SELECT 语句使用 ORDER BY 子句将查询数据排序后再返回数据

mysql> SELECT*from myTable;
+------------+---------------+----------------+-----------------+
| myTable_id | myTable_title | myTable_author | submission_date |
+------------+---------------+----------------+-----------------+
|          1 | php           | 教程           | 2019-09-17      |
|          2 | MySQL         | 教程           | 2019-09-17      |
|          4 | Python        | cn.com         | 2019-09-17      |
|          5 | LINUX         | cn.com         | 2019-09-17      |
+------------+---------------+----------------+-----------------+mysql> SELECT*from myTable ORDER BY myTable_title DESC;
+------------+---------------+----------------+-----------------+
| myTable_id | myTable_title | myTable_author | submission_date |
+------------+---------------+----------------+-----------------+
|          4 | Python        | cn.com         | 2019-09-17      |
|          1 | php           | 教程           | 2019-09-17      |
|          2 | MySQL         | 教程           | 2019-09-17      |
|          5 | LINUX         | cn.com         | 2019-09-17      |
+------------+---------------+----------------+-----------------+
4 rows in set (0.00 sec)mysql> SELECT*from myTable ORDER BY myTable_title ASC;
+------------+---------------+----------------+-----------------+
| myTable_id | myTable_title | myTable_author | submission_date |
+------------+---------------+----------------+-----------------+
|          5 | LINUX         | cn.com         | 2019-09-17      |
|          2 | MySQL         | 教程           | 2019-09-17      |
|          1 | php           | 教程           | 2019-09-17      |
|          4 | Python        | cn.com         | 2019-09-17      |
+------------+---------------+----------------+-----------------+
4 rows in set (0.00 sec)

15 JOIN 连接

使用MySQL的INNER JOIN(也可以省略 INNER 使用 JOIN,效果一样)来连接以上两张表来读取myTable表中所有myTable_author字段在myTable_count表对应的myTable_coun字段值:


mysql> SELECT*from myTable_count;
+------------+----------------+--------------+
| myTable_id | myTable_author | myTable_coun |
+------------+----------------+--------------+
|          1 | 教程           |           10 |
|          2 | cn.com         |           20 |
+------------+----------------+--------------+
2 rows in set (0.00 sec)mysql> SELECT*from myTable;
+------------+---------------+----------------+-----------------+
| myTable_id | myTable_title | myTable_author | submission_date |
+------------+---------------+----------------+-----------------+
|          1 | php           | 教程           | 2019-09-17      |
|          2 | MySQL         | 教程           | 2019-09-17      |
|          4 | Python        | cn.com         | 2019-09-17      |
|          5 | LINUX         | cn.com         | 2019-09-17      |
+------------+---------------+----------------+-----------------+
4 rows in set (0.00 sec)mysql> SELECT a.myTable_id,a.myTable_author,b.myTable_coun FROM myTable a INNER
JOIN myTable_count b ON a.myTable_author=b.myTable_author;
+------------+----------------+--------------+
| myTable_id | myTable_author | myTable_coun |
+------------+----------------+--------------+
|          1 | 教程           |           10 |
|          2 | 教程           |           10 |
|          4 | cn.com         |           20 |
|          5 | cn.com         |           20 |
+------------+----------------+--------------+
4 rows in set (0.00 sec)

16 NULL 值处理

MySQL 使用 SQL 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 运算符。
mysql> use TEST;
Database changed
mysql> CREATE TABLE myTable_test(-> myTable_author VARCHAR(40) NOT NULL,-> myTable_coun INT-> );
Query OK, 0 rows affected (0.05 sec)mysql> INSERT INTO myTable_test (myTable_author,myTable_coun) values ("教程",NUL
L);
Query OK, 1 row affected (0.01 sec)mysql> INSERT INTO myTable_test (myTable_author,myTable_coun) values ("Google",N
ULL);
Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO myTable_test (myTable_author,myTable_coun) values ("CN",20);
Query OK, 1 row affected (0.00 sec)mysql> SELECT*from myTable_test;
+----------------+--------------+
| myTable_author | myTable_coun |
+----------------+--------------+
| 教程           |         NULL |
| Google         |         NULL |
| CN             |           20 |
+----------------+--------------+
3 rows in set (0.00 sec)

以下实例中可以看到 = 和 != 运算符是不起作用的:

mysql> SELECT*from myTable_test WHERE myTable_coun = NULL;
Empty set (0.00 sec)mysql> SELECT*from myTable_test WHERE myTable_coun != NULL;
Empty set (0.00 sec)

查找数据表中 myTable_test列是否为 NULL,必须使用 IS NULL 和 IS NOT NULL,如下实例:

mysql> SELECT*from myTable_test WHERE myTable_coun IS NULL;
+----------------+--------------+
| myTable_author | myTable_coun |
+----------------+--------------+
| 教程           |         NULL |
| Google         |         NULL |
+----------------+--------------+
2 rows in set (0.00 sec)mysql> SELECT*from myTable_test WHERE myTable_coun IS NOT NULL;
+----------------+--------------+
| myTable_author | myTable_coun |
+----------------+--------------+
| CN             |           20 |
+----------------+--------------+
1 row in set (0.00 sec)

17 MySQL事物

MySQL 事务主要用于处理操作量大,复杂度高的数据。
事务控制语句:

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 开启自动提交

mysql> use TEST;
Database changed
mysql> CREATE TABLE myTable_transaction_test(id int(5)) engine=innodb;  #创建数据表
Query OK, 0 rows affected (0.05 sec)mysql> select*from myTable_transaction_test;
Empty set (0.00 sec)mysql> begin; #开始事务
Query OK, 0 rows affected (0.00 sec)mysql> insert into myTable_transaction_test value(5);
Query OK, 1 row affected (0.00 sec)mysql> insert into myTable_transaction_test value(6);
Query OK, 1 row affected (0.00 sec)mysql> commit;   #提交事务
Query OK, 0 rows affected (0.00 sec)mysql> select*from myTable_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 myTable_transaction_test value(7);
Query OK, 1 row affected (0.00 sec)mysql> rollback; #回滚
Query OK, 0 rows affected (0.00 sec)mysql> select*from myTable_transaction_test;  #因为回滚所以数据没有插入
+------+
| id   |
+------+
|    5 |
|    6 |
+------+
2 rows in set (0.00 sec)

18 ALTER命令

需要修改数据表名或者修改数据表字段时,需要使用到MySQL ALTER命令。
1)创建一张表

mysql> use TEST;
Database changed
mysql> CREATE TABLE myTable_testALTER(-> i INT,-> c CHAR(1)-> );
Query OK, 0 rows affected (0.05 sec)
mysql> SHOW COLUMNS FROM myTable_testALTER;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| i     | int(11) | YES  |     | NULL    |       |
| c     | char(1) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

2)删除、添加或修改表字段 ——用ALTER命令和DROP子句删除表的i字段

mysql> ALTER TABLE myTable_testALTER DROP i;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> SHOW COLUMNS FROM myTable_testALTER;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c     | char(1) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

如果数据表中只剩一个字段则无法使用DROP来删除字段,使用ADD子句向数据表添加列:

mysql> ALTER TABLE myTable_testALTER ADD i INT;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> SHOW COLUMNS FROM myTable_testALTER;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c     | char(1) | YES  |     | NULL    |       |
| i     | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

可以看到 i字段自动添加到数据表字段的末尾。
指定新增字段的位置,关键字FIRST(设定位第一列):

mysql> ALTER TABLE myTable_testALTER DROP i;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> ALTER TABLE myTable_testALTER ADD i INT FIRST;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> SHOW COLUMNS FROM myTable_testALTER;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| i     | int(11) | YES  |     | NULL    |       |
| c     | char(1) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)mysql> ALTER TABLE myTable_testALTER DROP i;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> ALTER TABLE myTable_testALTER ADD i INT AFTER c;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> SHOW COLUMNS FROM myTable_testALTER;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c     | char(1) | YES  |     | NULL    |       |
| i     | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

3)修改字段类型及名称

在ALTER命令中使用MODIFY或CHANGE子句

mysql> ALTER TABLE myTable_testALTER MODIFY c CHAR(10);
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> SHOW COLUMNS FROM myTable_testALTER;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| c     | char(10) | YES  |     | NULL    |       |
| i     | int(11)  | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)mysql> ALTER TABLE myTable_testALTER CHANGE i j BIGINT;
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> SHOW COLUMNS FROM myTable_testALTER;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| c     | char(10)   | YES  |     | NULL    |       |
| j     | bigint(20) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)mysql> ALTER TABLE myTable_testALTER CHANGE j j INT;
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> SHOW COLUMNS FROM myTable_testALTER;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| c     | char(10) | YES  |     | NULL    |       |
| j     | int(11)  | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)

4)ALTER TABLE 对NULL值和默认值的影响

修改字段时,可以指定是否包含值或者是否设置默认值

指定字段j为NOT NULL且默认值为100:

mysql> ALTER TABLE myTable_testALTER-> MODIFY j BIGINT NOT NULL DEFAULT 100;
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> SHOW COLUMNS FROM myTable_testALTER;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| c     | char(10)   | YES  |     | NULL    |       |
| j     | bigint(20) | NO   |     | 100     |       |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

如果不设置默认值,MySQL会自动设置该字段默认为NULL。
5)修改字段默认值

mysql> ALTER TABLE myTable_testALTER ALTER c SET DEFAULT 1000;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> SHOW COLUMNS FROM myTable_testALTER;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| c     | char(10)   | YES  |     | 1000    |       |
| j     | bigint(20) | NO   |     | 100     |       |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

可以使用ALTER命令及DROP子句删除字段的默认值。

19 索引

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

插入1000万数据,不加索引时查询需要1.9秒,加索引后查询只需要0.02秒。

20 临时表

MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。


mysql> use TEST;
Database changed
mysql> 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-> );
Query OK, 0 rows affected (0.01 sec)mysql> INSERT INTO SalesSUmmary(-> product_name, total_sales, avg_unit_price, total_units_sold)-> VALUES-> ('cucumber',100.25,90,2);
Query OK, 1 row affected (0.00 sec)mysql> SELECT*from SalesSUmmary;
+--------------+-------------+----------------+------------------+
| product_name | total_sales | avg_unit_price | total_units_sold |
+--------------+-------------+----------------+------------------+
| cucumber     |      100.25 |          90.00 |                2 |
+--------------+-------------+----------------+------------------+
1 row in set (0.00 sec)

使用SHOW TABLES命令显示数据表列表时,无法看到数据表。退出当前MySQL会话,则临时表自动被销毁。

手动删除临时表:

mysql> DROP TABLE SalesSUmmary;
Query OK, 0 rows affected (0.00 sec)mysql> SELECT*from SalesSUmmary;
ERROR 1146 (42S02): Table 'test.salessummary' doesn't exist

21 复制表

完全的复制MySQL的数据表,包括表的结构,索引,默认值等。 如果仅仅使用CREATE TABLE ... SELECT 命令,是无法实现的。
如何完整的复制MySQL数据表,步骤如下:

  • 使用 SHOW CREATE TABLE 命令获取创建数据表(CREATE TABLE) 语句,该语句包含了原数据表的结构,索引等。
  • 复制以下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令 将完全的复制数据表结构。
  • 如果你想复制表的内容,你就可以使用 INSERT INTO ... SELECT 语句来实现。
    步骤一:获取数据表的完整结构

mysql> SHOW CREATE TABLE myTable \G;
*************************** 1. row ***************************Table: myTable
Create Table: CREATE TABLE `mytable` (`myTable_id` int(11) NOT NULL AUTO_INCREMENT,`myTable_title` varchar(100) NOT NULL,`myTable_author` varchar(40) NOT NULL,`submission_date` date DEFAULT NULL,PRIMARY KEY (`myTable_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
ERROR:
No query specified

步骤二:修改SQL语句的数据表名,并执行SQL语句


mysql> CREATE TABLE `clone_myTable` (-> `myTable_id` int(11) NOT NULL AUTO_INCREMENT,-> `myTable_title` varchar(100) NOT NULL,-> `myTable_author` varchar(40) NOT NULL,-> `submission_date` date DEFAULT NULL,-> PRIMARY KEY (`myTable_id`)-> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.05 sec)

步骤三:在数据库中创建新的克隆表,拷贝数据表的数据可以使用INSERT INTO ... SEKECT


mysql> INSERT INTO clone_myTable (myTable_id,-> myTable_title,-> myTable_author,-> submission_date)-> SELECT myTable_id,myTable_title,-> myTable_author,submission_date-> FROM myTable;
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0
mysql> SELECT*from clone_myTable;
+------------+---------------+----------------+-----------------+
| myTable_id | myTable_title | myTable_author | submission_date |
+------------+---------------+----------------+-----------------+
|          1 | php           | 教程           | 2019-09-17      |
|          2 | MySQL         | 教程           | 2019-09-17      |
|          4 | Python        | cn.com         | 2019-09-17      |
|          5 | LINUX         | cn.com         | 2019-09-17      |
+------------+---------------+----------------+-----------------+
4 rows in set (0.00 sec)

22 处理重复数据

1)防止表出现重复数据
在 MySQL 数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性。
一个实例:下表中无索引及主键,所以该表允许出现多条重复记录。

mysql> CREATE TABLE person_tb (-> first_name CHAR(20),-> last_name CHAR(20),-> sex CHAR(10)-> );
Query OK, 0 rows affected (0.04 sec)

设置表中字段 first_name,last_name 数据不能重复,可以设置双主键模式来设置数据的唯一性, 如果设置了双主键,那么那个键的默认值不能为 NULL,可设置为 NOT NULL。如下所示:

mysql> CREATE TABLE person_tb (-> first_name CHAR(20) NOT NULL,-> last_name CHAR(20) NOT NULL,-> sex CHAR(10),-> PRIMARY KEY (last_name,first_name)-> );
Query OK, 0 rows affected (0.04 sec)

设置了唯一索引,那么在插入重复数据时,SQL 语句将无法执行成功,并抛出错。
INSERT IGNORE INTO 与 INSERT INTO 的区别就是 INSERT IGNORE 会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。
以下实例使用了 INSERT IGNORE INTO,执行后不会出错,也不会向数据表中插入重复数据:


mysql> INSERT IGNORE INTO person_tb (last_name,first_name)-> VALUES('Jay','Thomas');
Query OK, 1 row affected (0.01 sec)mysql> INSERT IGNORE INTO person_tb (last_name,first_name)-> VALUES('Jay','Thomas');
Query OK, 0 rows affected, 1 warning (0.00 sec)

INSERT IGNORE INTO 当插入数据时,在设置了记录的唯一性后,如果插入重复数据,将不返回错误,只以警告形式返回。 而 REPLACE INTO 如果存在 primary 或 unique 相同的记录,则先删除掉。再插入新记录。
另一种设置数据的唯一性方法是添加一个 UNIQUE 索引,如下所示:


mysql> CREATE TABLE person_tb (-> first_name CHAR(20) NOT NULL,-> last_name CHAR(20) NOT NULL,-> sex CHAR(10),-> UNIQUE (last_name,first_name)-> );
Query OK, 0 rows affected (0.04 sec)

2) 统计重复数据


mysql> SELECT COUNT(*) as repetitions, last_name, first_name-> FROM person_tb-> GROUP BY last_name, first_name-> HAVING repetitions > 1;

以上查询语句将返回 person_tbl表中重复的记录数。 一般情况下,查询重复的值,请执行以下操作:
确定哪一列包含的值可能会重复。
在列选择列表使用COUNT(*)列出的那些列。
在GROUP BY子句中列出的列。
HAVING子句设置重复数大于1。

3)过滤重复数据
要读取不重复的数据可以在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据:

mysql> SELECT DISTINCT last_name, first_name-> FROM person_tb;

也可以使用 GROUP BY 来读取数据表中不重复的数据:


mysql> SELECT last_name, first_name-> FROM person_tb-> GROUP BY (last_name, first_name);

4)删除重复数据

mysql> CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tb  GROUP BY (last_name, first_name, sex);
mysql> DROP TABLE person_tb;
mysql> ALTER TABLE tmp RENAME TO person_tb;

也可以在数据表中添加 INDEX(索引) 和 PRIMAY KEY(主键)这种简单的方法来删除表中的重复记录。方法如下:

mysql> ALTER IGNORE TABLE person_tb-> ADD PRIMARY KEY (last_name, first_name);

参考:菜鸟教程

转载于:https://www.cnblogs.com/eugene0/p/11537281.html

MySQL 基础操作相关推荐

  1. PHP - PDO 之 mysql 基础操作

    PHP - PDO 之 mysql 基础操作 <?php/* pdo 学习 */$dsn = 'mysql:host=localhost;dbname=cswl';//构建连接dsn$db = ...

  2. mysql数据库优化课程---13、mysql基础操作

    mysql数据库优化课程---13.mysql基础操作 一.总结 一句话总结:mysql复制表,索引,视图 1.mysql如何复制表? like select * 1.复制表结构 create tab ...

  3. 4.MySQL基础操作

    4.MySQL基础操作 使用方法: 方式一: 通过在命令行敲命令来操作 ( 有助于命令的掌握) 方式二: 通过图型界面工具,如 Navicat 等(在熟练掌握后再使用) 方式三:通过编程语言(pyth ...

  4. Mysql 基础操作知识专题

    目录 一.Mysql基础操作 1.1 mysql 表复制 1.2 mysql索引 1.3 mysql视图 1.4 mysql内置函数 1.5 mysql预处理语句 1.6 mysql事务处理 1.7 ...

  5. mysql基础操作和查询语句

    MySQL基础 mysql基础操作操作 MySQL基础 相关术语 数据库操作 MySQL管理 启动及关闭 MySQL 用户设置 /etc/my.cnf 文件配置 管理MySQL的命令 连接MySQL ...

  6. mysql循环查询一个表中的数据并进行修改_JavaScript学习笔记(二十四)-- MYSQL基础操作...

    MYSQL mysql 是一个数据库的名字 和 php 合作的比较好的数据库 之前我们说过一个问题,前端向后端索要数据,后端就是去数据库中查询数据,返回给前端 接下来就聊聊使用 php 操作数据库 M ...

  7. 【简洁明了MySQL】MySQL基础操作之连接,创建和删除数据库

    MYSQL基础操作之连接,创建和删除数据库 一.MySQL连接 1.方法一:客户端直接连接法(不推荐) 2. 方法二:使用命令行登录 3.两种不同的登陆状态 4.创建用户 二.创建数据库 1.crea ...

  8. 删除所有学生记录mysql_【MySQL】MySQL基础操作语句

    mysql基础操作语句,包括数据库的增.删.切换,以及表的增.删.改.查.复制. 创建数据库 mysql> create database tem; 使用数据库 mysql> use te ...

  9. mysql修改学生信息语句,【MySQL】MySQL基础操作语句

    mysql基础操作语句,包括数据库的增.删.切换,以及表的增.删.改.查.复制. 创建数据库 mysql> create database tem; 使用数据库 mysql> use te ...

  10. php对mysql基础操作_php+mysql的基础操作

    标签: PHP可以说是当下很火的一门后端语言了,它小巧玲珑,和html等前端语言配合的可以说是天衣无缝,加之xampp,wampp等工具的出现,更是前端开发者的福音,作为一名前端ER,如果不熟悉一门后 ...

最新文章

  1. python中是干嘛的-python是做什么的,新手必看哦!
  2. 前端模块管理器命令:npm bower
  3. dsp c语言 计算正弦,DSP正弦函数计算程序编写.docx
  4. mysql --explicit_【MySQL】 explicit_defaults_for_timestamp 参数解析
  5. python编程游戏代码 游戏人物如何升级_如何玩游戏提高python编程技能?
  6. 解决margin塌陷的问题_解决margin塌陷与margin合并(margin)清除浮动问题
  7. html form int,is_int, is_numeric, is_float, and HTML form validation
  8. php 计算每年春节日期,动态显示2019年农历春节倒计时—2019年1月21日23时45分
  9. 【纪念】NOIP2018前夕——一些想说的话
  10. 备案 前置或专项审批的内容
  11. 拉钩网前端项目实战01
  12. “跟着吴恩达老师入门机器学习”学习笔记(二)
  13. java截取图片截图画框
  14. 全球新冠疫情可视化图表制作
  15. 什么是梯度,梯度有什么用
  16. 我的世界科学计算机,在我的世界打造一台计算机有多难?复旦大神花了一年
  17. 登录模块与token的使用和创建
  18. 【Laravel系列6.4】管道过滤器
  19. android 订餐系统,一种基于Android平台手机订餐系统的实现方法
  20. 定了!2022京东全球科技探索者大会之京东云峰会7月13日北京见

热门文章

  1. 过滤器做权限校验以及遇到的坑
  2. Liunx系统下的 Nginx的安装与启动
  3. [渝粤教育] 西南科技大学 病虫防治 在线考试复习资料
  4. [渝粤教育] 西南科技大学 材料力学 在线考试复习资料
  5. 线性模型第4讲:弹性网络
  6. 从OpenGL ES 2.0到Direct3D 11.1之路
  7. ELK 架构之 Elasticsearch 和 Kibana 安装配置
  8. 项目中用到的一些特殊字符和图标
  9. FCC 基础JavaScript 练习6
  10. enum class