目录
[mysql 登录](#mysql 登录)
[mysql 退出](#mysql 退出)
[理解 mysql](#理解 mysql)
[什么是 mysql](#什么是 mysql)
[mysql 数据管理](#mysql 数据管理)
[DDl(data definition language)](#DDl(data definition language))
[DML(data manipulation language)](#DML(data manipulation language))
[DCL(data control language)](#DCL(data control language))
mysql 登录
sql
mysql -h 主机ip -P 端口号 -u 用户 -p 密码
-
但是我们的 mysql 设置了免密登录,所以不需要输入密码
-
如果我们不带 -h 就代表本地登录
-
不带 -P 表示使用默认端口号
-
一般我们使用时,只需要指明用户就可以
bash
[root@slave0 /]# mysql -u root
mysql 退出
sql
mysql> quit
Bye
mysql 退出直接输入 quit 就可以。
在我们学习任何的 mysql 的前提,我们当然需要学习 mysql 的登录与退出。
理解 mysql
前面我们说了mysql 的安装,但是我们目前还不知道 mysql 具体是一个什么东西,我们同时也不知道 mysql 是用来干什么的。
什么是 mysql
- mysql 就是一个基于 CS 模型的网络数据存储服务。
上面是对 mysql 的概括,那么我们详细谈论一下 mysql.
mysql 实际上就是一个 客户端服务器的一个网络服务,这个服务就是为了帮助存储和管理数据,而我们的 mysql 就是客户端,mysqld 就是一个服务,mysql 服务和客户端也可以在一台机器上,同时 mysql 的服务和客户端也可以分离,一个服务可以为多个客户端提供服务。
mysql客户端
我们说的mysql 客户端实际上就是我们安装的命令行操作,但是我们的客户端可不只是我们自己安装的mysql,我们的客户端也可以是图形化界面,还可以是我们自己用语言写的带有逻辑的一些语言来控制mysql 服务,让其帮助我们存储和管理数据。
而我们可以看一下我们安装的 mysql(客户端)
bash
[root@slave0 /]# which mysql
/usr/bin/mysql
上面就是 mysql 客户端,而服务一般后面带一个 d 表示守护进程,而服务一般都是以守护进程的方式来运行。
mysqld服务
bash
[root@slave0 /]# which mysqld
/usr/sbin/mysqld
这个就是 mysql 的服务。
存储数据就是服务器帮我们存储数据。
mysql 数据管理
既然 mysql 是进行数据存储的,那么我们的文件也可以存储数据,我们为什么不直接用文件存储数据呢?
-
用文件存储数据,我们并不知道文件里面的数据具体存储了什么
-
文件存储数据,我们不好对文件里面的数据进行管理
-
所谓的管理就是进程查找,删除,或者增加和修改
-
文件存储数据我们也需要经常对文件进行 open 和 close 所以不方便
而 mysql,是一种表的关系型数据库,可以对数据有很好的管理效果,也方便存储。
数据库
在 mysql 里面是需要有数据库的,而数据库就是我们自己创建的,数据库里面又可以有多张表,表里面存储的就是我们的数据。
我们先看一下在 linux 下,数据库究竟是什么?
在mysql 的配置文件下(/etc/my.cnf) 里面有我们的默认数据存储的位置。
bash
[root@slave0 /]# cat /etc/my.cnf | grep datadir
datadir=/var/lib/mysql
datadir 就是默认的数据存储的位置,下面我们用 mysql 客户端来创建一个数据库。
下面会设计一些部分的sql语句,这里会简单介绍一下,后面都会详细介绍。
sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
show databases; 是一个查看当前的数据库的一个 sql 语句,在命令行里面的 sql 一般我们都需要带分号,上面查询到的数据库都是我们默认的数据库,所以我们可以创建一个自己的数据库。
查看 /var/lib/mysql 目录下
bash
-rw-r-----. 1 mysql mysql 56 8月 20 13:11 auto.cnf
-rw-------. 1 mysql mysql 1676 8月 20 13:11 ca-key.pem
-rw-r--r--. 1 mysql mysql 1112 8月 20 13:11 ca.pem
-rw-r--r--. 1 mysql mysql 1112 8月 20 13:11 client-cert.pem
-rw-------. 1 mysql mysql 1676 8月 20 13:11 client-key.pem
-rw-r-----. 1 mysql mysql 288 8月 20 14:19 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 8月 20 14:19 ibdata1
-rw-r-----. 1 mysql mysql 50331648 8月 20 14:19 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 8月 20 13:11 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 8月 20 14:19 ibtmp1
drwxr-x---. 2 mysql mysql 4096 8月 20 13:11 mysql
srwxrwxrwx. 1 mysql mysql 0 8月 20 14:19 mysql.sock
-rw-------. 1 mysql mysql 5 8月 20 14:19 mysql.sock.lock
drwxr-x---. 2 mysql mysql 8192 8月 20 13:11 performance_schema
-rw-------. 1 mysql mysql 1680 8月 20 13:11 private_key.pem
-rw-r--r--. 1 mysql mysql 452 8月 20 13:11 public_key.pem
-rw-r--r--. 1 mysql mysql 1112 8月 20 13:11 server-cert.pem
-rw-------. 1 mysql mysql 1676 8月 20 13:11 server-key.pem
drwxr-x---. 2 mysql mysql 8192 8月 20 13:11 sys
创建数据库
sql
mysql> create database HelloMySql;
Query OK, 1 row affected (0.00 sec)
创建数据库的语法就是:create database database_name;
我们创建一个 HelloMySql 的数据库,然后我们继续查看 /vat/lib/mysql 目录下有什么变化。
bash
[root@slave0 mysql]# ll
总用量 122952
-rw-r-----. 1 mysql mysql 56 8月 20 13:11 auto.cnf
-rw-------. 1 mysql mysql 1676 8月 20 13:11 ca-key.pem
-rw-r--r--. 1 mysql mysql 1112 8月 20 13:11 ca.pem
-rw-r--r--. 1 mysql mysql 1112 8月 20 13:11 client-cert.pem
-rw-------. 1 mysql mysql 1676 8月 20 13:11 client-key.pem
drwxr-x---. 2 mysql mysql 20 8月 20 17:07 HelloMySql
-rw-r-----. 1 mysql mysql 288 8月 20 14:19 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 8月 20 14:19 ibdata1
-rw-r-----. 1 mysql mysql 50331648 8月 20 14:19 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 8月 20 13:11 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 8月 20 14:19 ibtmp1
drwxr-x---. 2 mysql mysql 4096 8月 20 13:11 mysql
srwxrwxrwx. 1 mysql mysql 0 8月 20 14:19 mysql.sock
-rw-------. 1 mysql mysql 5 8月 20 14:19 mysql.sock.lock
drwxr-x---. 2 mysql mysql 8192 8月 20 13:11 performance_schema
-rw-------. 1 mysql mysql 1680 8月 20 13:11 private_key.pem
-rw-r--r--. 1 mysql mysql 452 8月 20 13:11 public_key.pem
-rw-r--r--. 1 mysql mysql 1112 8月 20 13:11 server-cert.pem
-rw-------. 1 mysql mysql 1676 8月 20 13:11 server-key.pem
drwxr-x---. 2 mysql mysql 8192 8月 20 13:11 sys
该目录下多出来了一个 HelloMySql 的目录,所以我们可以得出结论,在 linux 下,创建一个数据库本质上就是在特定的目录下创建一个目录。
下面我们看一下创建表。
表
上面我们看到创建一个数据库就是创建了一个目录,那么我们继续创建一个表我们看一下对应的目录里面会有什么变化。
先看一下当前的 HelloMySql 目录下内容。
bash
[root@slave0 HelloMySql]# ll
总用量 4
-rw-r-----. 1 mysql mysql 61 8月 20 17:07 db.opt
当前该目录下只有一个默认的文件,那么我们创建一个表。
我们这里创建一个学生表,该表里面有三个字段,姓名,年龄,性别。
不过在创建表前面,我们需要在某一个数据库下创建,所以我们需要先选择数据库。
sql
选择数据库语法:use database_name;
那么我们可以在该数据库下看一下有没有表,在对应的数据库下查看表。
sql
查看特定数据库下表的语法:show tables;
sql
mysql> show tables;
Empty set (0.00 sec)
当前我们的数据库里面并没有表所以我们就按刚才说的创建一个表。
创建表的语法比较稍微复杂一点,这里先看一下。
sql
mysql> create table student(
-> name varchar(12),
-> age int,
-> sex varchar(2))
-> ;
Query OK, 0 rows affected (0.00 sec)
mysql> show tables;
+----------------------+
| Tables_in_HelloMySql |
+----------------------+
| student |
+----------------------+
1 row in set (0.00 sec)
上面就是创建表的语法
-
create 就是创建
-
table 表示表
-
student 表示表名
-
后面带()
-
括号里面就是该表里面拥有哪些字段
-
name 表示其中的一个字段,varchar 表示该字段的数据类型,每一个字段用逗号隔开,最后分号结尾。
创建好后我们继续查看/var/lib/mysql/HelloMySql 下的文件有哪些变化。
bash
[root@slave0 HelloMySql]# ll
总用量 112
-rw-r-----. 1 mysql mysql 61 8月 20 17:07 db.opt
-rw-r-----. 1 mysql mysql 8616 8月 20 17:16 student.frm
-rw-r-----. 1 mysql mysql 98304 8月 20 17:16 student.ibd
我们该目录下增加了两个文件,我们一看名字就知道和我们刚才创建表是由关系的。
所以在对应的数据库里面创建表的本质就是在特定的数据库目录里面创建一个文件。
SQL分类
经过刚才的查看表和数据库,我们也了解了一点点的 SQL 语句,其实 SQL 是有分类的,所以我们看一下 SQL 的分类。
DDl(data definition language)
ddl 就是数据库定义语言,常见的有:
-
create
-
drop
-
alter
DML(data manipulation language)
dml 就是对数据库中的数据进行操作的语言,常见的数据操作的有
-
insert
-
delete
-
update
DCL(data control language)
dcl 数据控制语言,数据控制语言就是对数据库的访问权限和安全性。它包括了授权、撤销权限、管理用户...等一些操作。
常见的数据控制语言有:
-
grant
-
revoke
-
....
上面的 SQL 其实一般都是用大写比较合适,但是我们为了方便辨认,我们采用小写。
数据库架构
mysql 的数据库架构分为好几层,我们下面简单的了解一下即可。
-
客户端(Client):客户端是用户与MySQL数据库进行交互的接口。用户通过客户端发送SQL语句给数据库,并接收来自数据库的结果。
-
连接器(Connection Manager):连接器负责管理客户端与MySQL数据库之间的连接。它处理客户端的连接请求,验证客户端身份,建立连接,并将连接分配给相应的线程处理请求。
-
查询缓存(Query Cache):查询缓存是MySQL数据库提供的一个可选组件,用于缓存查询结果。当有相同的查询再次执行时,MySQL可以直接返回缓存中的结果,提高查询性能。
-
解析器(Parser):解析器负责解析客户端发送的SQL语句,将其转化为语法树和内部数据结构。解析器检查SQL语句的语法和语义正确性,并生成查询执行计划。
-
查询优化器(Query Optimizer):查询优化器负责优化查询执行计划,确定如何高效地执行查询。它根据查询的成本估算和可行性规则,选择最优的执行路径,以提高查询性能。
-
存储引擎(Storage Engine):存储引擎是MySQL数据库的核心组件,负责实际存储数据和处理数据的操作。MySQL支持多种存储引擎,如InnoDB、MyISAM等,每个存储引擎具有不同的特点和优势。
-
日志模块(Log Module):MySQL数据库有多种日志模块,用于记录数据库操作和事务变更日志。常见的日志包括二进制日志(Binary Log)、错误日志(Error Log)和事务日志(Transaction Log)等。
-
缓存和缓冲管理(Buffer Management):MySQL使用不同的缓存和缓冲区管理技术来提高数据读写性能。常见的缓存包括数据缓存(Buffer Pool)和索引缓存(Key Cache)等。
数据库存储引擎
查看存储引擎语句
sql
show engines;
上面这个是一种方法,但是这样查看有点乱,所以我们可以用下面的带 \G
show engines \G;
mysql> show engines \G
*************************** 1. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 2. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 7. row ***************************
Engine: ARCHIVE
Support: YES
Comment: Archive storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 8. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
*************************** 9. row ***************************
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
9 rows in set (0.00 sec)
上面的这些就是 mysql 里面的存储引擎,虽然上面这么多但是实际上我们常用的只有两个
-
innodb
-
myisam
想了解具体的mysql 的存储引擎可以自己去了解一下,这里不多说了。