MySQL语法基础

时间:2019-11-17 19:05:32   收藏:0   阅读:68

1.MySQL管理

1.1启动和关闭服务

# Linux
service mysqld start      # 启动
service mysqld stop      # 关闭
service mysql restart    # 重启

# Windows
net start mysql        # 启动
net stop mysql         # 关闭

1.2常用命令

mysql -u root -p[密码] [-P端口] [-h地址]

列出 MySQL 数据库管理系统的数据库列表

mysql> USE sql_test;
Database changed

列出 MySQL 数据库管理系统的数据库列表

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

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

mysql> SHOW TABLES;
+--------------------+
| Tables_in_sql_test |
+--------------------+
| runoob_tb1         |
+--------------------+
1 row in set (0.01 sec)

显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息

mysql> SHOW COLUMNS FROM USER_PRIVILEGES;
+----------------+--------------+------+-----+---------+-------+
| Field          | Type         | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+-------+
| GRANTEE        | varchar(292) | NO   |     |         |       |
| TABLE_CATALOG  | varchar(512) | NO   |     |         |       |
| PRIVILEGE_TYPE | varchar(64)  | NO   |     |         |       |
| IS_GRANTABLE   | varchar(3)   | NO   |     |         |       |
+----------------+--------------+------+-----+---------+-------+
4 rows in set (0.02 sec)

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

mysql> SHOW INDEX FROM runoob_tb1;
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table      | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| runoob_tb1 |          0 | PRIMARY  |            1 | runoob_id   | A         |           1 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
1 row in set (0.02 sec)
技术分享图片
mysql> SHOW INDEX FROM runoob_tb1 \G      # 加上 \G,查询结果按列打印,注意加上\G就不用加";"了
*************************** 1. row ***************************
        Table: runoob_tb1
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: runoob_id
    Collation: A
  Cardinality: 1
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
      Visible: YES
   Expression: NULL
1 row in set (0.00 sec)
\G的作用

 

该命令将输出Mysql数据库管理系统的性能及统计信息

mysql> SHOW TABLE STATUS  FROM sql_test;   # 显示数据库 RUNOOB 中所有表的信息

mysql> SHOW TABLE STATUS from sql_test LIKE ‘runoob%‘;     # 表名以runoob开头的表的信息
mysql> SHOW TABLE STATUS from sql_test LIKE ‘runoob%‘\G    # 加上 \G,查询结果按列打印

2.数据库及表的管理

2.1创建数据库

mysql> CREATE DATABASE sql_test;
Query OK, 1 row affected (0.01 sec)


# root用户拥有最高权限,可以使用mysqladmin命令来创建数据库
[root@localhost ~]# mysqladmin -u root -p CREATE sql_test;
Enter password:******

2.2删除数据库

mysql> DROP DATABASE sql_test1;
Query OK, 0 rows affected (0.02 sec)


#  mysqladmin命令在终端来执行删除命令
[root@localhost ~]# mysqladmin -u root -p DROP sql_test1;
Enter password:******

2.3创建数据表

CREATE TABLE table_name (column_name column_type);

例:

mysql> CREATE TABLE IF NOT EXISTS runoob_tbl(
   -> runoob_id INT NOT NULL 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;

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

2.4删除数据表

DROP TABLE table_name;

2.5数据表的CRUD

# 语法:
INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );

# 实例:
mysql> INSERT INTO runoob_tb1
    -> (runoob_title, runoob_author, submission_date)
    -> VALUES
    -> ("sql", "eric", NOW());
# 语法:
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
# 实例:
mysql> SELECT * FROM runoob_tb1;
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         1 | sql          | eric          | 2019-11-15      |
|         2 | redis        | alex          | 2019-11-16      |
+-----------+--------------+---------------+-----------------+
2 rows in set (0.00 sec)
技术分享图片
# 语法:
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 runoob_tb1 WHERE runoob_author=eric;
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         1 | sql          | eric          | 2019-11-15      |
|         3 | mongo        | eric          | 2019-11-16      |
+-----------+--------------+---------------+-----------------+
2 rows in set (0.00 sec)

# MySQL 的 WHERE 子句的字符串比较是不区分大小写的。 你可以使用 BINARY 关键字来设定 WHERE 子句的字符串比较是区分大小写的。
mysql> SELECT * FROM runoob_tb1 WHERE BINARY runoob_title=Redis;
Empty set (0.01 sec)

mysql> SELECT * FROM runoob_tb1 WHERE BINARY runoob_title=redis;
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         2 | redis        | alex          | 2019-11-16      |
|         4 | redis        | bobby         | 2019-11-16      |
+-----------+--------------+---------------+-----------------+
2 rows in set (0.00 sec)
WHERE子句

 

MySQL查询:

# 语法
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
# 即  update 表名称 set 列名称=新值 where 更新条件;



# 实例
mysql> UPDATE runoob_tb1 SET runoob_author=‘jack‘ WHERE runoob_author=‘alex‘;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM runoob_tb1 WHERE runoob_author=‘jack‘;
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         2 | redis        | jack          | 2019-11-16      |
+-----------+--------------+---------------+-----------------+
1 row in set (0.00 sec)
# 语法
DELETE FROM table_name [WHERE Clause]


# 实例
mysql> DELETE FROM runoob_tb1 WHERE runoob_id=1;
Query OK, 1 row affected (0.02 sec)

3.MySQL数据类型

4.JOIN的使用

数据库中多张表查询时需要用到JOIN

JOIN 按照功能大致分为如下三类:

4.1连接条件

使用ON关键字来设定连接条件,也可以使用WHERE来代替。

通常使用ON关键字来设定连接条件,使用WHERE关键字进行结果集记录的过滤。

4.2内连接 — INNER JOIN

# 语法:
tableA_reference INNER JOIN tableB_reference ON conditional_expr


# 实例
mysql> SELECT * FROM runoob_tb1;
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         2 | redis        | jack          | 2019-11-16      |
|         3 | mongo        | eric          | 2019-11-16      |
|         4 | redis        | bobby         | 2019-11-16      |
+-----------+--------------+---------------+-----------------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM runoob_tb1;
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         2 | redis        | jack          | 2019-11-16      |
|         3 | mongo        | eric          | 2019-11-16      |
|         4 | redis        | bobby         | 2019-11-16      |
|         5 | python       | eric          | 2019-11-16      |
|         6 | linux        | alex          | 2019-11-16      |
+-----------+--------------+---------------+-----------------+
5 rows in set (0.00 sec)

mysql> SELECT a.runoob_id,a.runoob_author,b.runoob_count FROM 
    -> runoob_tb1 AS a INNER JOIN count_tb1 AS b ON a.runoob_id=b.runoob_id;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
|         2 | jack          |           20 |
|         3 | eric          |           25 |
|         4 | bobby         |           15 |
+-----------+---------------+--------------+
3 rows in set (0.00 sec)

技术分享图片

4.2左外连接 — LEFT JOIN

LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。

以 runoob_tbl 为左表,tcount_tbl 为右表:

mysql> SELECT a.runoob_id,a.runoob_author,b.runoob_count FROM
    -> runoob_tb1 AS a LEFT JOIN count_tb1 AS b ON a.runoob_author=b.runoob_author;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
|         3 | eric          |           10 |
|         5 | eric          |           10 |
|         6 | alex          |           20 |
|         2 | jack          |           25 |
|         4 | bobby         |           15 |
|         7 | siri          |         NULL |
+-----------+---------------+--------------+
6 rows in set (0.01 sec)

技术分享图片

4.2右外连接 — RIGHT JOIN

以 runoob_tbl 为左表,tcount_tbl 为右表:

mysql> SELECT a.runoob_id,a.runoob_author,b.runoob_count FROM
    -> runoob_tb1 AS a RIGHT JOIN count_tb1 AS b ON a.runoob_author=b.runoob_authoor;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
|         2 | jack          |           25 |
|         3 | eric          |           10 |
|         4 | bobby         |           15 |
|         5 | eric          |           10 |
|         6 | alex          |           20 |
|      NULL | NULL          |           23 |
+-----------+---------------+--------------+
6 rows in set (0.00 sec)

技术分享图片

5.NULL 值处理

MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。

为了处理这种情况,MySQL提供了三大运算符:

关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。

在 MySQL 中,NULL 值与任何其它值的比较(即使是 NULL)永远返回 false,即 NULL = NULL 返回false 。

MySQL 中处理 NULL 使用 IS NULL 和 IS NOT NULL 运算符。

实例:先在count_tb1中插入一个runoob_count为NULL的数据,然后:

mysql> SELECT * FROM count_tb1;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
|         1 | eric          |           10 |
|         2 | alex          |           20 |
|         3 | jack          |           25 |
|         4 | bobby         |           15 |
|         5 | mary          |           23 |
|         6 | wang          |         NULL |
+-----------+---------------+--------------+
6 rows in set (0.00 sec)

# 以下实例中你可以看到 = 和 != 运算符是不起作用的:
mysql> SELECT * FROM count_tb1 WHERE runoob_count=NULL;
Empty set (0.01 sec)

mysql> SELECT * FROM count_tb1 WHERE runoob_count!=NULL;
Empty set (0.00 sec)

# 查找数据表中 runoob_test_tbl 列是否为 NULL,必须使用 IS NULL 和 IS NOT NULL,如下实例:
mysql> SELECT * FROM count_tb1 WHERE runoob_count IS NULL;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
|         6 | wang          |         NULL |
+-----------+---------------+--------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM count_tb1 WHERE runoob_count IS NOT NULL;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
|         1 | eric          |           10 |
|         2 | alex          |           20 |
|         3 | jack          |           25 |
|         4 | bobby         |           15 |
|         5 | mary          |           23 |
+-----------+---------------+--------------+
5 rows in set (0.00 sec)

6.MySQL 正则表达式

MySQL可以通过 LIKE ...% 来进行模糊匹配。

MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正则表达式匹配。

查找name字段中以‘st‘为开头的所有数据:

mysql> SELECT name FROM person_tbl WHERE name REGEXP ‘^st‘;
更多:https://www.runoob.com/mysql/mysql-regexp.html

7.MySQL 事务

事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。程序和事务是两个不同的概念。一般而言:一段程序中可能包含多个事务。(说白了就是几步的数据库操作而构成的逻辑执行单元

事务的4个特性(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

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

事务控制语句:

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

1、用 BEGIN, ROLLBACK, COMMIT来实现

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

实例:

mysql> CREATE TABLE runoob_transaction_test(id INT(5)) ENGINE=InnoDB;
Query OK, 0 rows affected, 1 warning (0.03 sec)

mysql> SELECT * FROM runoob_transaction_test;
Empty set (0.01 sec)

# 开始一个事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

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

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

# 提交事务
mysql> commit;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM runoob_transaction_test;
+------+
| id   |
+------+
|    3 |
|    5 |
+------+
2 rows in set (0.00 sec)

# 开始一个事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

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

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

# 回滚
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

# 回滚以后数据并没有插入成功
mysql> SELECT * FROM runoob_transaction_test;
+------+
| id   |
+------+
|    3 |
|    5 |
+------+
2 rows in set (0.00 sec)

使用保留点 SAVEPOINT

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

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

# 创建一个保存点
mysql> savepoint point1;
Query OK, 0 rows affected (0.00 sec)

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

# 回滚到保存点
mysql> rollback to point1;
Query OK, 0 rows affected (0.00 sec)

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

mysql> SELECT * FROM runoob_transaction_test;
+------+
| id   |
+------+
|    3 |
|    5 |
|   11 |
+------+
3 rows in set (0.00 sec)

8. ALTER命令

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

先创建一张表,表名为:testalter_tbl。

mysql> create table if not exists testalter_tb1(
    -> id INT,
    -> c CHAR(2)
    -> );
Query OK, 0 rows affected (0.06 sec)

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

8.1删除,添加表字段

 使用ALTER 命令及 DROP 子句来删除以上创建表的 id 字段:

mysql> ALTER TABLE testalter_tb1 DROP id;

如果数据表中只剩余一个字段则无法使用DROP来删除字段。

使用 ADD 子句来向数据表中添加列,如下实例在表 testalter_tbl 中添加 id 字段,并定义数据类型:

mysql> ALTER TABLE testalter_tb1 ADD id INT;

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

mysql> SHOW COLUMNS FROM testalter_tb1;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c     | char(2) | YES  |     | NULL    |       |
| id    | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

如果你需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。

尝试以下 ALTER TABLE 语句, 在执行成功后,使用 SHOW COLUMNS 查看表结构的变化:

ALTER TABLE testalter_tbl DROP id;
ALTER TABLE testalter_tbl ADD id INT FIRST;
ALTER TABLE testalter_tbl DROP id;
ALTER TABLE testalter_tbl ADD id INT AFTER c;

8.2 修改字段类型及名称

如果需要修改字段类型及名称, 可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。

例如,把字段 c 的类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令:

mysql> ALTER TABLE testalter_tb1 MODIFY c CHAR(10);

使用 CHANGE 子句, 语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是要修改的字段名,然后指定新字段名及类型:

mysql> ALTER TABLE testalter_tb1 CHANGE id num BIGINT;

mysql> ALTER TABLE testalter_tb1 CHANGE num num INT;

8.3 ALTER对 Null 值和默认值的影响

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

以下实例,指定字段 num为 NOT NULL 且默认值为50:

mysql> ALTER TABLE testalter_tb1 ALTER num SET DEFAULT 50;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW COLUMNS FROM testalter_tb1;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| c     | char(10) | YES  |     | NULL    |       |
| num   | int(11)  | YES  |     | 50      |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)

你也可以使用 ALTER 命令及 DROP子句来删除字段的默认值:

mysql> ALTER TABLE testalter_tb1 ALTER num DROP DEFAULT;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW COLUMNS FROM testalter_tb1;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| c     | char(10) | YES  |     | NULL    |       |
| num   | int(11)  | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.01 sec)

8.4 修改数据表类型及表明

修改数据表类型,可以使用 ALTER 命令及 TYPE 子句来完成。尝试以下实例,我们将表 testalter_tbl 的类型修改为 MYISAM :

注意:查看数据表类型可以使用 SHOW TABLE STATUS 语句。

mysql> SHOW TABLE STATUS LIKE ‘testalter_tb1‘ \G
*************************** 1. row ***************************
           Name: testalter_tb1
         Engine: MyISAM
        Version: 10
     Row_format: Fixed
           Rows: 0
 Avg_row_length: 0
    Data_length: 0
Max_data_length: 12666373951979519
   Index_length: 1024
      Data_free: 0
 Auto_increment: 1
    Create_time: 2019-11-17 15:03:32
    Update_time: 2019-11-17 15:03:32
     Check_time: NULL
      Collation: utf8mb4_0900_ai_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.00 sec)

 

如果需要修改数据表的名称,可以在 ALTER TABLE 语句中使用 RENAME 子句来实现。

尝试以下实例将数据表 testalter_tbl 重命名为 alter_tbl:

mysql> ALTER TABLE testalter_tb1 RENAME TO alter_tb1;
Query OK, 0 rows affected (0.01 sec)

8.5 删除外键约束

外键约束:keyName是外键别名

alter table tableName drop foreign key keyName;

 9.索引

https://www.jianshu.com/p/f7187a47d522

原文:https://www.cnblogs.com/lymlike/p/11874564.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!