本教程以MySQL8为主版本(兼容MySQL5.7)。
所有MySQL文章的目录为:总目录 【MySQL8教程】:总目录_mysql8 数据库只有个目录-优快云博客
本文介绍MySQL常用的使用方法以SQL语句。学习本文前,需要提前具备初步的SQL基础知识(本文不包含SQL语句基础知识讲解)。
连接到MySQL数据库
MySQL分为服务端和客户端,服务端进程为mysqld, 客户端工具为mysql。mysql是一个交互式客户端程序,使您可以连接到MySQL服务器,执行SQL语句并查看结果。
- 要连接到服务器,需要提供一个MySQL用户名和密码。如果连接到非本机,还需要指定目的服务器的IP以及端口(不指定端口则使用默认端口3306),连接命令格式为
mysql -h host -P port -u user -p
其中host、port、
user
代表运行MySQL服务器的IP、端口、MySQL帐户名.
成功登陆后,能看到一下信息。其中MySQL connection id 记录了MySQL服务启动后到目前为止的被连接的次数(含如密码错等未成功登陆的连接),每个新连接会自动加1。 同时还能看到版本号之类的信息:
[zyplanke@centosa ~]$ mysql -h 192.168.43.201 -P 3306 -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.18 MySQL Community Server - GPL
Copyright (c) 2000, 2019, 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服务器上本地连接。则可以不指定host信息,只需使用以下命令
mysql -u user -p
命令中不指定host,则host自动赋值为localhost,然后去连接MySQL。
提示1:连接MySQL数据库有两种方式:TCP/IP(一般用IP+端口)和Unix套接字(一般叫socket或者sock)。这种不指定-h选项既localhost的连接,是通过服务端操作系统本地的套接字文件/var/lib/mysql/mysql.sock去访问MySQL数据库,不走TCP/IP。 提示2:通常我们认为,localhost就等价于本机127.0.0.1(hosts文件)。但是在MySQL中,二者是不同的,在MySQL中user权限设置中localhost与127.0.0.1也是分开设置的。当设置连接是指定-h为127.0.0.1时,系统通过TCP/IP方式连接数据库;当-h指定为localhost时,系统通过sock方式连接数据库。 尝试测试可以发现,在MySQL服务正常运行情况下,如果缺少mysql.sock文件。不指定-h选项或者-h指定为localhost时,连接MySQL,会报ERROR 2002 (HY000)错误。只要加上-h选项显示指定IP,则可以正常连接。 |
- 退出连接。成功连接后,您可以随时在提示符下键入
QUIT
(或\q
)断开连接mysql:
mysql> quit
该mysq客户端工具选项及含义详细说明,请参阅附录文章:【MySQL附录】A1:客户端工具使用详解(上):客户端mysql-优快云博客
执行SQL语句
在mysql>
提示后,输入SQL语句。
mysql> SELECT VERSION(), CURRENT_DATE;
+-----------+--------------+
| VERSION() | CURRENT_DATE |
+-----------+--------------+
| 8.0.18 | 2019-12-17 |
+-----------+--------------+
1 row in set (0.00 sec)
可以看到mysql 执行SQL的特点:
-
一般在SQL语句后需要加分号
-
以表格形式(行和列)显示查询输出。第一行包含各列的标签。以下各行是查询结果。
-
返回了多少行以及查询执行了多长时间,这使您对服务器性能有了一个大概的了解。这些时间不精确。
可以在任何大写字母中输入关键字。以下查询是等效的:
mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;
一条SQL语句可以写在多行上,最后用分号结束
mysql> SELECT
-> USER()
-> ,
-> CURRENT_DATE
-> ;
+--------------+--------------+
| USER() | CURRENT_DATE |
+--------------+--------------+
| root@centosa | 2019-12-17 |
+--------------+--------------+
1 row in set (0.00 sec)
查看和选择database(schema)
这里的database不是泛指的数据库,而是MySQL中的database。 MySQL中的database等同于Oracle的schema概念(只不过Oracle中schema和user是一一对应的,MySQL没有这种对应关系)。一个schema(既MySQL中的database)是一种逻辑组织空间,大致近似于程序开发中的namespace的用途。其实,在MySQL中database就是schema的同义词,在命令中两者可以通用互换。其实使用schema这个词更准确容易理解。只不过早期一直使用database这个词并习惯至今,使得更多人用database这个词(包括官方文档也使用这个词)
所以在MySQL中,一个server下可以包含多个database(schema)
- MySQL会自动创建四个database(既schema),通过以下命令查看(两个命令是等价的):
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql>
mysql> show schemas;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql>
- information_schema:主要存放了系统中的一些数据库对象信息,比如用户表定义、列定义、视图定义,系统权限信息、字符集信息、分区信息、触发器定义等等。比如我们可以通过该database下的TABLES、COLUMNS、TRIGGERS等视图,查看表、字段、视图的定义。
- mysql: 存放了用户权限信息
- performance_schema:存放了收集的性能相关数据
- sys: MySQL 5.7.7及更高版本才有该schema,这是一组对象,可帮助DBA和开发人员看懂收集data的解释。该模式对象经常用于的调整和诊断
PS:个人认为,MySQL把use database命令的动词use改为switch 更好。
- 通过use databasename命令,切换至某个库(既切换当前默认schema),然后可访问该database(schema)下的对象:
mysql> use mysql;
Database changed
mysql>
mysql> select User, Host from user;
+------------------+-----------+
| User | Host |
+------------------+-----------+
| root | % |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)
其中:mysql.infoschema 用户是MySQL8新增的,MySQL5.7没有该用户。
- 如果不通过use命令切换到对应database(schema),直接在对象名前加上schema也可以访问:
mysql> use information_schema
Database changed
mysql>
mysql> select User, Host from mysql.user;
+------------------+-----------+
| User | Host |
+------------------+-----------+
| root | % |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)
- 也可以通过mysql客户端在登录时使用-D选项,指定登录后默认use哪个database:
[zyplanke@centosa ~]$ mysql -h 192.168.43.201 -P 3306 -u root -p -D mysql
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.18 MySQL Community Server - GPL
Copyright (c) 2000, 2019, 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> select User, Host from user;
+------------------+-----------+
| User | Host |
+------------------+-----------+
| root | % |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)
创建新database(schema)
mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.00 sec)
mysql>
mysql> use test;
Database changed
mysql>
mysql> show tables;
Empty set (0.00 sec)
通过以上命令,创建一个新的database(schema)。同时看到新创建的database(schema)是空的,没有table。
可以通过drop database databasename 删除一个已经存在的database(schema)
注意1: 虽然SQL关键字大小写均可,但数据库名、表名对象名大小写是敏感区分的。因为数据库对象都会保存到Linux上对应的目录和文件,而Linux对大小写敏感。
注意2:可以通过修改my.cnf中的设置lower_case_table_names=1
,实现数据库对象对大小写不敏感(对于MySQL8,必须在数据库首次启动初始化设置,否则报错)。
创建表Table
- 在新建的名为test的database(schema)下创建table:
mysql> use test;
Database changed
mysql>
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
-> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
Query OK, 0 rows affected (0.01 sec)
- 通过show tables 查看当前database(schema)下有哪些tables。 然后可以对某个具体的table通过describe命令参考表结构定义:
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| pet |
+----------------+
1 row in set (0.00 sec)
mysql>
mysql> describe pet;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| owner | varchar(20) | YES | | NULL | |
| species | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| birth | date | YES | | NULL | |
| death | date | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.08 sec)
向table中insert数据及load数据
- 通过insert的SQL插入数据:
mysql> INSERT INTO pet
-> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
Query OK, 1 row affected (0.00 sec)
mysql> select * from pet;
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+----------+-------+---------+------+------------+-------+
1 row in set (0.00 sec)
- 还可以将数据load进入table:
准备数据内容如下表格:
name | owner | species | sex | birth | death |
---|---|---|---|---|---|
Fluffy | Harold | cat | f | 1993-02-04 | |
Claws | Gwen | cat | m | 1994-03-17 | |
Buffy | Harold | dog | f | 1989-05-13 | |
Fang | Benny | dog | m | 1990-08-27 | |
Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |
Chirpy | Gwen | bird | f | 1998-09-11 | |
Whistler | Gwen | bird | 1997-12-09 | ||
Slim | Benny | snake | m | 1996-04-29 |
在客户端本地创建一个pet_data.txt的文本文件。将上表数据每条放入文件中的每一行,每行字段之间使用TAB分割。对于NULL值得字段,在pet_data.txt的文本文件使用\N表示。
本文文件位置为 /home/zyplanke/pet_data.txt 。 文本内容如下:
Fluffy Harold cat f 1993-02-04 \N
Claws Gwen cat m 1994-03-17 \N
Buffy Harold dog f 1989-05-13 \N
Fang Benny dog m 1990-08-27 \N
Bowser Diane dog m 1979-08-31 1995-07-29
Chirpy Gwen bird f 1998-09-11 \N
Whistler Gwen bird \N 1997-12-09 \N
Slim Benny snake m 1996-04-29 \N
用mysql客户端登录后,使用load data语句将客户端本地的文件内容导入到table中
mysql> LOAD DATA LOCAL INFILE '/home/zyplanke/pet_data.txt' INTO TABLE pet;
Query OK, 8 rows affected, 2 warnings (0.00 sec)
Records: 8 Deleted: 0 Skipped: 0 Warnings: 2
mysql> select * from pet;
+----------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+--------+---------+------+------------+------------+
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Fang | Benny | dog | m | 1990-08-27 | NULL |
| Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
+----------+--------+---------+------+------------+------------+
9 rows in set (0.00 sec)
如果客户端是Windows,则load data命令后面需要指定换行符。既在windows下导入命令为:
mysql> LOAD DATA LOCAL INFILE '/home/zyplanke/pet_data.txt' INTO TABLE pet LINES TERMINATED BY '\r\n';