当我们要查询一个文件里边的内容时,首先是打开这个文件,这就需要把这个文件加载至内存,然后再显示出来。这样,如果我们要查询的内容所在的文件非常大的话,那么,就需要很大的内存来加载它,很显然是不现实的。
那么有没有一种机制,让查询数据的时候,只把查询的内容加载至内存,这样,不仅内存的负荷小了很多,查询的时间也短了很多,这时候,数据库就出现在了人们的眼前。
一、mysql的基础信息
服务器端:mysqld
客户端:mysql
监听的端口:3306/tcp
目前常用的版本:5.1、5.2、5.4、5.5、5.6
配置文件:/etc/my.cnf
二、mysql的组成部分及工作流程
第一步:
mysql要想接受用户和某个程序的访问,必须监听在某个套接字上,时刻准备工作,当用户的请求发送过来之后,mysql通过自己监听的端口,接受了用户的请求,这时候分析器开始分析用户请求的内容是否存在,请求是否合理,是否有语法错误。
第二步:
当分析器处理过之后,由操作求解器借助查询求解引擎对用户的请求进行一系列的运算,运算之后,可能会发现有多中方法都可以完成用户的请求。
第三步:
将操作求解器处理的结果,生成查询计划,但是,这个查询计划里边,可能有很多重复的地方,于是就有优化器对其进行优化,生成最简洁,最有效,最快速的查询计划。
第四步:
借助于文件存取接口,到磁盘去查询符合用户查询的数据内容,而后,将结果返回给用户。
下边是对mysql的组成的介绍:
缓冲区管理器:
如果每次都从磁盘里边读取数据,那样会非常慢,这时候需要缓冲区管理器对查询的数据进行缓存,缓存至内存,等到下一次请求相同的内容时,直接从内存里边读取数据,这样就快多了。
磁盘空间管理器:
如果数据没有一定规范的存在磁盘里边,岂不是乱套了?这时候磁盘空间管理器就对存在磁盘的数据按照一定的规范对数据进行管理。
事务管理器:
对事物进行管理
锁:
如果一个用户正在查询一组数据,那么是否允许其他用户对该数据进行写操作呢?显然是不允许的,那么,就需要对自己正在进行的查询的数据加个锁,待自己查询完成之后,解除锁,释放其他用户的权限。
恢复管理器:
如果,我们在进行数据库操作的时候,突然断电了,是不是很懊恼呢,辛辛苦苦做的数据,没有了,不要担心,有恢复管理器来处理,但是这需要借助于事务日志才能对次进行处理。
三、mysql存储数据的类型
1、字符型:
定长字符 | 变长字符 | 二进制字符 | 变长二进制字符 | 文本型数据 | 二进制大对象 |
CHAR(n) | VARCHAR(n) | BINARY(n) | VARBINARY(n) | TEXT | BLOB |
注:
此类数据的修饰符:NOT NULL , DEFAULT ‘‘
2、数值型:
①精确数值型:
整型:
类型 | 大小 (单位byte) | 范围 (有符号) | 范围 (无符号) | 用途 |
TINYINT | 1 | -288,277 | 0-255 | 微××× |
SMALLINIT | 2 | -32768,32767 | 0-65535 | 小××× |
MEDIUMINT | 3 | - | 0-2^24 | 中××× |
INT | 4 | - | 0-2^32 | ××× |
BIGINT | 8 | - | 0-2^64 | 大××× |
注:修饰符:NOT NULL, DEFAULT '', UNSIGNED, AUTO_INCREMENT
②近似数值型:
浮点型:
FLOAT:单精度
DOUBLE:双精度
REAL
修饰符:NOT NULL, DEFAULT ''
③日期时间型:
DATE:日期值
TIME:时间值或持续时间
DATETIME:混合时间值和日期值
YEAR(2), YEAR(4):年份值
TIMESTAMP:时间戳
修饰符:NOT NULL, DEFAULT ''
④布尔型
1为真,0为假
⑤内置类型:
ENUM, SET
修饰符:NOT NULL, DEFAULT ''
四:mysql命令的执行方式有两种
1、交互式方式:
-h, --host= 指定主机 -u, --user= 指定用户名 -p, --password= 指定密码 -D db_name, --database= 直接将每个数据库设定为默认库 -e 'SQL_Statement;' 不会连接mysql,把指定的SQL语句送入服务器端,并把结果显示出来
2、批处理模式:
使用sql脚本; mysql OPTIONS < script.sql mysql> source /path/to/script.sql
五、mysql的常用命令
1、不需要加任何语句结束符:
quit, \q : 退出mysql delimiter, \d: 修改语句结束符 go, \g: 无论语句结束符是什么,都会把SQL语句送到服务器端执行 use, \u: 设定默认数据库 ego, \G: 具有\g的功能,同时将数据取回后,纵向显示 system, \!: 不同退出mysql就可以跟shell交互 status, \s: 显示当前mysql的状态信息
2、必须要使用语句结束符:
①SHOW DATABASES;显示有权限访问的所有数据库;
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mydb | | mysql | | test | | testdb | +--------------------+ 5 rows in set (0.07 sec)
②USE DB_NAME:设置DB_NAME为默认数据库;
mysql> use mysql; Database changed
③SELECT DATABASE(): 显示默认数据库
mysql> select database(); +------------+ | database() | +------------+ | mysql | +------------+
1 row in set (0.01 sec)
④CREATE DATABASE DB_NAME: 创建名为DB_NAME的数据库;
mysql> create database onedb; Query OK, 1 row affected (0.09 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mydb | | mysql | | onedb | | test | | testdb | +--------------------+ 6 rows in set (0.05 sec)
⑤ DROP DATABASE DB_NAME: 删除名为DB_NAME的数据库;
mysql> drop database onedb; Query OK, 0 rows affected (0.15 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mydb | | mysql | | test | | testdb | +--------------------+ 5 rows in set (0.08 sec)
注:
删除操作是不可逆的,千万要确定之后再进行此操作。其实,mysql就是一个目录,所以它的名称是要区分大小写的,但是这在Windos上是不区分的。
⑥SHOW VARIABLES;显示服务器参数变量
mysql> show variables; +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ | Variable_name | Value | +---------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+ | auto_increment_increment | 1 | | auto_increment_offset | 1 | | autocommit | ON | | automatic_sp_privileges | ON | | back_log | 50 | | basedir | /usr/local/mysql ////////下边的省略
注:
1、有些变量的值可以修改,能够改变mysql的工作特性
2、有些可以动态调整,即刻生效;相当于reload
3、另外一些只能修改配置文件后,重启生效;如果修改了datadir路径,则许重启 服务
⑦SHOW STATUS;显示服务器的状态变量
mysql> SHOW status; +------------------------------------------+-------------+ | Variable_name | Value | +------------------------------------------+-------------+ | Aborted_clients | 0 | | Aborted_connects | 0 | | Binlog_cache_disk_use | 0 | | Binlog_cache_use | 0 | | Binlog_stmt_cache_disk_use | 0 | | Binlog_stmt_cache_use | 0 | | Bytes_received | 157 | | Bytes_sent | 10056 | | Com_admin_commands | 0 | | Com_assign_to_keycache | 0 | | Com_alter_db | 0 |
######后边的省略
注:记录了当前包括过去的时间内mysql的运行统计数据
⑧FLUSH PRIVILEGES;重读配置表
六、用户管理
1、创建用户
mysql>CREATE USER username@host [IDENTIFIED BY ‘PASSWORD’ ];
注:
用户或主机可以使用通配符
%:匹配任意长度的任意字符
_:匹配任意单个字符
2、用户授权:
mysql>GRANT ALL PRIVILEGES ON dbname.tablename TO username@host [IDENTIFIED BY ‘PASSWORD’];
3、修改用户
mysql> SET PASSWORD FOR username@host=PASSWORD('password');
4、删除用户
mysql>DROP USER username@host;
七、表管理
1、创建表
mysql>create table tb_name;
2、修改表名
mysql>rename table tb_name to new_name;
3、删除表
mysql>drop table tbname;
4、查询表信息
mysql>desc tb_name;
八、小练习:
1、新建如下表(包括结构和内容):
ID Name Age Gender Course
1 Ling Huchong 24 Male Hamogong
2 Huang Rong 19 Female Chilian Shenzhang
3 Lu Wushaung 18 Female Jiuyang Shenggong
4 Zhu Ziliu 52 Male Pixie Jianfa
5 Chen Jialuo 22 Male Xianglong Shiba Zhang
2、完成如下操作
(1)找出性别为女性的所有人;
(2)找出年龄大于20的所有人;
(3)修改Zhu Ziliu的Course为Kuihua Baodian;
(4)删除年龄小于等于19岁的所有人;
(5)授权给testuser对testdb库有所有访问权限;
解题:
1、创建表
mysql> create database testdb; //创建数据库,名为testdb Query OK, 1 row affected (0.16 sec) mysql> show databases; //显示可以访问的数据库 +--------------------+ | Database | +--------------------+ | information_schema | | hellodb | | mydb | | mysql | | performance_schema | | test | | testdb | //刚创建的数据库 +--------------------+ 7 rows in set (0.10 sec) mysql> use testdb; //设定testdb为默认库 Database changed mysql> mysql> CREATE TABLE students (ID TINYINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,Name CHAR(30) NOT NULL UNIQUE KEY,Age TINYINT UNSIGNED, Gender CHAR(1) DEFAULT 'M',Course VARCHAR(50) NOT NULL); Query OK, 0 rows affected (0.49 sec) //创建表 mysql> desc students; //显示表属性 +--------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+---------------------+------+-----+---------+----------------+ | ID | tinyint(3) unsigned | NO | PRI | NULL | auto_increment | | Name | char(30) | NO | UNI | NULL | | | Age | tinyint(3) unsigned | YES | | NULL | | | Gender | char(1) | YES | | M | | | Course | varchar(50) | NO | | NULL | | +--------+---------------------+------+-----+---------+----------------+ 5 rows in set (0.22 sec) mysql> INSERT students (Name,Age,Gender,Course)VALUES('Ling Huchong',24,'M','Hamogong'), ('Huang Rong',19,'F','Chilian Shenzhang'), ('Lu Wushuang',18,'F','Jiuying Shengong'),('Zhu Ziliu',52,'M','Pixie Jianfa'),('Chen Jialuo',22,'M','Xianglong Shiba Zhang'); Query OK, 5 rows affected (0.10 sec) //插入内容成功 Records: 5 Duplicates: 0 Warnings: 0 mysql> select * from students; //显示表的内容 +----+--------------+------+--------+-----------------------+ | ID | Name | Age | Gender | Course | +----+--------------+------+--------+-----------------------+ | 1 | Ling Huchong | 24 | M | Hamogong | | 2 | Huang Rong | 19 | F | Chilian Shenzhang | | 3 | Lu Wushuang | 18 | F | Jiuying Shengong | | 4 | Zhu Ziliu | 52 | M | Pixie Jianfa | | 5 | Chen Jialuo | 22 | M | Xianglong Shiba Zhang | +----+--------------+------+--------+-----------------------+ 5 rows in set (0.00 sec)
2、练习
(1)找出性别为女性的所有人;
mysql> select name from students where Gender='F'; +-------------+ | name | +-------------+ | Huang Rong | | Lu Wushuang | +-------------+ 2 rows in set (0.11 sec)
(2)找出年龄大于20的所有人;
mysql> select name from students where Age>20; +--------------+ | name | +--------------+ | Ling Huchong | | Zhu Ziliu | | Chen Jialuo | +--------------+
3 rows in set (0.00 sec)
(3)修改Zhu Ziliu的Course为Kuihua Baodian;
mysql> update students set Course='Kuihua Baodian' where name='Zhu Ziliu'; Query OK, 1 row affected (0.48 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from students; +----+--------------+------+--------+-----------------------+ | ID | Name | Age | Gender | Course | +----+--------------+------+--------+-----------------------+ | 1 | Ling Huchong | 24 | M | Hamogong | | 2 | Huang Rong | 19 | F | Chilian Shenzhang | | 3 | Lu Wushuang | 18 | F | Jiuying Shengong | | 4 | Zhu Ziliu | 52 | M | Kuihua Baodian | //内容已经修改为我们想要修改的值 | 5 | Chen Jialuo | 22 | M | Xianglong Shiba Zhang | +----+--------------+------+--------+-----------------------+ 5 rows in set (0.00 sec)
(4)删除年龄小于等于19岁的所有人;
mysql> delete from students where Age<=19; Query OK, 2 rows affected (0.07 sec) mysql> select * from students; +----+--------------+------+--------+-----------------------+ | ID | Name | Age | Gender | Course | +----+--------------+------+--------+-----------------------+ | 1 | Ling Huchong | 24 | M | Hamogong | | 4 | Zhu Ziliu | 52 | M | Kuihua Baodian | | 5 | Chen Jialuo | 22 | M | Xianglong Shiba Zhang | +----+--------------+------+--------+-----------------------+ 3 rows in set (0.01 sec)
(6)授权给testuser对testdb库有所有访问权限;
mysql> grant all on testdb.* to 'testuser'@'%'; Query OK, 0 rows affected (0.25 sec) [root@www ~]# mysql -utestuser -h172.16.6.1 -p //回到命令行下 Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.5.33-log Source distribution Copyright (c) 2000, 2013, 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>
九、小拓展
其实数据库也不过一个目录而已,只要我们在数据库的目录下创建一个目录,并给它一定的权限,那么他就会出现在数据库中,
例如:
[root@www data]# cd /mydata/data/ //这里在安装的时候我们制定mysql的数据目录为此目录,所以创建的数据库都在此目录下 [root@www data]# ls -l total 29808 drwx------ 2 mysql mysql 4096 Sep 3 10:36 mydb drwx------ 2 mysql root 4096 Sep 2 21:19 mysql -rw-rw---- 1 mysql mysql 133 Sep 4 09:32 mysql-bin.index drwx------ 2 mysql mysql 4096 Sep 2 21:19 performance_schema drwx------ 2 mysql root 4096 Sep 2 21:19 test drwx------ 2 mysql mysql 4096 Sep 4 14:32 testdb //这就是我们上题中创建的那个数据库 -rw-r----- 1 mysql root 8871 Sep 4 14:55 www.limian.com.err -rw-rw---- 1 mysql mysql 5 Sep 4 09:32 www.limian.com.pid [root@www data]# 那么我们在此目录下创建一个目录并且把权限也给他指定好,看看会不会出现在数据库中呢? [root@www data]# mkdir namedb //创建目录 [root@www data]# chown mysql:mysql namedb //修改属主属组 [root@www data]# chmod 700 namedb //修改为管理员具有所有权限 [root@www data]# ls -l total 29812 ######别的就省略了 drwx------ 2 mysql mysql 4096 Sep 4 15:07 namedb drwx------ 2 mysql mysql 4096 Sep 2 21:19 performance_schema drwx------ 2 mysql root 4096 Sep 2 21:19 test drwx------ 2 mysql mysql 4096 Sep 4 14:32 testdb
回到mysql服务器中;
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | hellodb | | mydb | | mysql | | namedb | //这里出现了我们创建的那个目录了哦 | performance_schema | | test | | testdb | +--------------------+ 8 rows in set (0.01 sec) mysql>
所以只要在此目录下创建一个目录,并把它的属主属组都改为mysql,其它没有任何权限(即700),就会在你的mysql中显示为新创建的一个库。