【MySQL基础】02:连接MySQL和执行SQL语句

这篇教程介绍了如何连接MySQL数据库,包括命令行连接方式和SQL语句的使用。内容涵盖连接到数据库、选择与创建database、建立表结构以及插入和加载数据的基本操作。适合已具备初步SQL知识的学习者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   

     本教程以MySQL8为主版本(兼容MySQL5.7)。

     所有MySQL文章的目录为:总目录    【MySQL8教程】:总目录_mysql8 数据库只有个目录-优快云博客 

    本文介绍MySQL常用的使用方法以SQL语句。学习本文前,需要提前具备初步的SQL基础知识(本文不包含SQL语句基础知识讲解)。

连接到MySQL数据库

     MySQL分为服务端和客户端,服务端进程为mysqld, 客户端工具为mysqlmysql是一个交互式客户端程序,使您可以连接到MySQL服务器,执行SQL语句并查看结果。

  •      要连接到服务器,需要提供一个MySQL用户名和密码。如果连接到非本机,还需要指定目的服务器的IP以及端口(不指定端口则使用默认端口3306),连接命令格式为

      mysql -h host -P port -u user -p

其中hostportuser代表运行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:

         准备数据内容如下表格:

nameownerspeciessexbirthdeath
FluffyHaroldcatf1993-02-04
ClawsGwencatm1994-03-17
BuffyHarolddogf1989-05-13
FangBennydogm1990-08-27
BowserDianedogm1979-08-311995-07-29
ChirpyGwenbirdf1998-09-11
WhistlerGwenbird1997-12-09
SlimBennysnakem1996-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';

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值