数据库系统(DBMS): 专门负责数据管理的工具。增加数据、创建索引、建立索引之间的关联关系、更新索引。。。。。。
连接器:PHP要访问MySQL,可以通过API访问,也可以通过PHP的驱动,而那个驱动就是连接器。
数据的组织结构
层次型 :有上下级关系
网状型 :
关系型 :
关系型数据库管理系统(RDBMS) :以表的方式来展示,并且能帮我们去维护这些表和表之间关系的这么一个软件!
负责将数据从文件中抽取出来,并展示为表的格式
管理数据本身完整性
DBA视图:既能看到用户视图,又能看到物理视图。还能看到中间的处理过程
SQL基本组件
1、用户或者前端驱动。。。会发出SQL命令
2、SQL命令送给我们的DBMS以后,DBMS必须要接受下来,并且做处理
3、提供一个分析器,做词法分析,语法分析。。。。
4、分析的结果要生成执行计划----计划执行器(我们到底有多少种路径可以完成相应任务)
5、对每一条计划进行筛选,选出代价最小,性能最好的---优化器(先不执行,选择一条最优的执行方式)
6、这一切分析结束以后,语句执行要操作数据,文件的存取
7、文件读进来之后先缓存在内存中,---缓存器(先把数据读取到缓存器里面才能进行操作的)
8、缓存器中所提供的任何内容最终还要回存到硬盘中去---磁盘空间管理器(实现对磁盘空间中的某个数据文件中的数据到底该怎么存储进行管理)
9、故障恢复管理器---服务器崩溃,再次启动之后,把存储数据,正在存储数据恢复为正常状态
10、事务管理器
11、锁管理器
mysql简单应用
特性:mysql名:mysql安装到Windows上不需要命令大小写,安装在Linux上区分大小写
mysql基于tcp连接的
若服务器端和客户端在同一台主机上时;服务器端与客户端连接方式为:
Linux:socket (这种连接实现的是本机进程与进程之间的通信,不需要网络驱动来连接,速度非常快!)
windows:memory (共享内存)
socket:套接字文件,这个文件在/var/lib/mysql/mysql.sock
命令(选项和参数之间可以不用加空格)
mysql
-u :指定用户,指名以哪个用户的身份去连接(后面不跟用户名,默认为root)
-p :给这个用户提供密码(后面没有密码,默认为空密码)
-h :指定主机,你的服务器是谁?(后面没跟服务器地址,默认为localhost)
例:mysql -uroot -p -h 127.0.0.1 (第一次登陆)
MySQL数据库管理
数据库对象:
库、表、索引、视图、约束、存储过程、、存储函数、触发器(主动数据库)、游标、用户、权限、事务
关系型数据库最核心的组件就是表(行(row)、列(field/column)组成)
一个表称为实体
字段名称:定义一个字段时,这个字段中存储的是数据还是数值做一下说明(数据类型)。
数据类型:
字符(字符型默认情况下不区分大小写):
CHAR(字符长度) --->你最多存储多少个字符,最多存储256个字符
VARCHAR(字符长度) --->你最多存储多少个字符,最多存储65536个字符 (两个字节)(可变化空间)
BINARY(字符长度) --->以二进制格式进行存储(区分大小写的字符)(固定空间)
VARCHAR(字符长度) --->以二进制格式进行存储(区分大小写的字符)(可变化空间)
TEXT(文本长度) --->文本大对象,(不区分大小写)
BLOB(文本长度) --->二进制格式的文本大对象(区分大小写)
数值:
精确数值(整型),有6种变化,分别使用不同长度的字节来存储整数
TINYINT --->小整形,范围:一个字节,最多表示范围-128到127,或者0-255
SMALLINT --->微整形,范围:两个字节,最多表示范围-128到127,或者0-255
MEDIUMINT --->中等整形,范围:三个字节
INT --->范围:四个字节
BIGINT --->大整形,范围:八个字节
DECIMAL --->十进制
修饰符:UNSIGNED,无符号,
NOT NULL ,不允许为空
近似数值(浮点型)
FLOAT
DOUBLE
日期时间:
DATE --->日期
TIME --->时间
DETETIME --->日期时间
STAMP --->时间戳
布尔(逻辑):
内置(枚举):
表头(header):每一列的名称
列(row):具有相同数据类型的数据的集合
行(col):每一行用来描述某个人/物的具体信息
值(value):行的集体信息
键(key):表中用来识别某个特定的人/物的方法,键的值在当前列中具有唯一性
数据库命令分类及其常用命令(命令不区分大小写)
姓名(name) 年龄(age) 学号(id) 性别(sex) 电话(tel)
DDL:数据定义语言
create:创建数据库、表
create database; 数据库名称; --->创建数据库
create database if not exists 数据库名称; --->如果数据库不存在我们就创建
create table 指定库. 表名 (属性1,属性2,...); --->创建表
alter :修改数据库、表
alter table 表名
modify :修改某个字段(改字段属性)
change :改变某个字段(不改属性,改内容)
add :添加一个字段
drop :删除一个字段
drop :删除数据库、表
drop table 表名 --->删除表
drop table if exists 表名 --->表存在才删除表
drop database 数据库名; --->删除数据库
DML:数据操作语言(表)
insert:插入
insert into 表名 (字段名称1,字段名称2...)value("字符串",数值); --->数值不用加引号,不加字段名称代表每个字段都写
replace:替换
replace into
update:修改
update 表名 set 字段='替换内容' where name='名字'
delete:删除
delete from 表名 where 符合条件的行
DCL:数据控制语言
grant:给用户授权 也可以修改密码
grant 权限1,权限2,... on 库名.表名 to '用户名'@'主机名' identified by '密码';--->给用户授权,用户不存在自动创建用户
revoke:取回权限
revoke 权限1,权限2... on 库名.表名 from '用户名'@'主机名;
select 查询
select格式: select 指定字段 from 表名 条件
create user :创建用户 格式: create user '用户名'@'主机名' identified by '密码';
drop user :删除用户 格式: drop user '用户名'@'主机名';
select * from 表名; --->查看表中的内容
show databases; --->查看库
show tables from 指定库;--->查看库中的表
desc 表名; --->查看表中的结构
show grants for '用户名'@'主机名'; --->查看用户的授权
select user(); --->当前登录的用户
use 数据库名; --->设置默认数据库
where 指定搜索条件; --->做逻辑比较
flush privileges; --->刷新授权表
set password for '用户名'@'主机名' =password('密码'); --->为用户创建密码
选择和投影
选择:指定以某字段作为搜索码,做逻辑比较 ,筛选符合条件的行
投影:选择列为搜索码
数据库命令使用格式详解
创建表及修改字段
create table xueyuan (name char(20) not null, age tinyint unsigned, gender char(1) not null);
添加表 表名 姓名 属性 不能为空, 年龄 属性 不能为负数, 性别 属性 不能为空
alter table xueyuan add kecheng varchar(100);
一个字段 表名 添加 字段名 属性
alter table xueyuan change kecheng Kecheng varchar(100) after name;
一个字段 表名 修改 字段名 修改后字段名 属性 放在字段name下面
给表插入数据
insert into xueyuan (name,gender) value ('linghuchong', 'm') , ('xiaolongnv','f');
插入 表名 字段,字段 关键字 (name字段,gender字段),(name字段,gender字段);
insert into xueyuan value ('xiao' , 'hama' , 57 , 'm');
插入 表名 关键字 name字段, course字段,age字段,性别字段
给表修改数据
update xueyuan set Kecheng='shuxue' where name = 'xiao'
修改属性 表名 关键字 字段 修改的内容 条件 字段 修改哪一行
在表中筛选数据
select name,Kecheng from xueyuan where Kecheng='shuxue';
查询 字段 字段 关键字 表名 选择 Kecheng字段中有shuxue 的行
在表中删除数据
delete from xueyuan where Kecheng='xiaoniu';
删除 关键字 表名 条件 在Kecheng字段中有xiaoniu的行
创建、删除用户
create user 'sun' @ '%' identified by 'sun';
创建 用户 用户名 所有主机 identified by:会将纯文本密码加密作为散列值存储
mysql
-u :指定用户,指名以哪个用户的身份去连接(后面不跟用户名,默认为root)
-p :给这个用户提供密码(后面没有密码,默认为空密码)
-h :指定主机,你的服务器是谁?(后面没跟服务器地址,默认为localhost)
--protocol :{tcp|socket|pipe|memory} 指定使用的协议
--port :指定端口
-D 库名 :在登录以后,直接把某个数据库设为默认数据库
show databases :显示有几个数据库
数据类型:
字符(字符型默认情况下不区分大小写):
CHAR(字符长度) --->你最多存储多少个字符,最多存储256个字符
VARCHAR(字符长度) --->你最多存储多少个字符,最多存储65536个字符 (两个字节)(可变化空间)
BINARY(字符长度) --->以二进制格式进行存储(区分大小写的字符)(固定空间)
VARCHAR(字符长度) --->以二进制格式进行存储(区分大小写的字符)(可变化空间)
TEXT(文本长度) --->文本大对象,(不区分大小写)
BLOB(文本长度) --->二进制格式的文本大对象(区分大小写)
auto_increment --->自动增长
数值:
精确数值(整型),有6种变化,分别使用不同长度的字节来存储整数
TINYINT --->小整形,范围:一个字节,最多表示范围-128到127,或者0-255
SMALLINT --->微整形,范围:两个字节,最多表示范围-128到127,或者0-255
MEDIUMINT --->中等整形,范围:三个字节
INT --->范围:四个字节
BIGINT --->大整形,范围:八个字节
DECIMAL --->十进制
修饰符:UNSIGNED,无符号,
NOT NULL ,不允许为空
近似数值(浮点型)
FLOAT
DOUBLE
DDL:数据定义语言
create:创建数据库、表
create database; 数据库名称; --->创建数据库
create database if not exists 数据库名称; --->如果数据库不存在我们就创建
create table 指定库. 表名 (属性1,属性2,...); --->创建表
alter :修改数据库、表
alter table 表名
modify :修改某个字段(改字段属性)
change :改变某个字段(不改属性,改内容,改名)
add :添加一个字段
drop :删除一个字段
drop :删除数据库、表
drop table 表名 --->删除表
drop table if exists 表名 --->表存在才删除表
drop database 数据库名; --->删除数据库
DML:数据操作语言(表)
insert:插入
insert into 表名 (字段名称1,字段名称2...)value("字符串",数值); --->数值不用加引号,不加字段名称代表每个字段都写
replace:替换
replace into
update:修改
update 表名 set 字段='替换内容' where name='名字'
delete:删除
delete from 表名 where 符合条件的行
DCL:数据控制语言
grant:给用户授权 也可以修改密码
grant 权限1,权限2,... on 库名.表名 to '用户名'@'主机名' identified by '密码';--->给用户授权,用户不存在自动创建用户
revoke:取回权限
revoke 权限1,权限2... on 库名.表名 from '用户名'@'主机名;
创建与删除索引
创建索引: create index 索引名称 on 表名 (字段) ;
删除索引:drop index 索引名 on 表名;
select 查询
select格式: select 指定字段 from 表名 条件
create user :创建用户 格式: create user '用户名'@'主机名' identified by '密码';
drop user :删除用户 格式: drop user '用户名'@'主机名';
truncate 表名; --->清空表,并且重置计数器(类似于ID..)
show table status like '表名'\g ; --->查看一个表的属性信息
show engines; --->可以显示当前数据库 所支持的所有存储引擎
select * from 表名; --->查看表中的内容
show databases; --->查看库
show tables from 指定库;--->查看库中的表
desc 表名; --->查看表中的结构
show grants for '用户名'@'主机名'; --->查看用户的授权
select user(); --->当前登录的用户
use 数据库名; --->设置默认数据库
select database(); --->查看当前默认的数据库
where 指定搜索条件; --->做逻辑比较
flush privileges; --->刷新授权表
select USER,Host,Password FROM user; --->查看用户列表
set password for '用户名'@'主机名' =password('密码'); --->为用户创建密码
show variables like "%变量名%" --->查看变量
show indexes from 表名 ; --->查看指定表的索引
show master status; --->查看当前正在使用的二进制日志文件
show binary logs; 查看当前mysql上所可以使用的二进制文件的列表
show binlog events in "file" ; 查看某一个二进制日志文件中的相关内容
选择和投影
选择:指定以某字段作为搜索码,做逻辑比较 ,筛选符合条件的行
投影:选择列为搜索码
数据库命令使用格式详解
创建表及修改字段
create table xueyuan (name char(20) not null, age tinyint unsigned, gender char(1) not null);
添加表 表名 姓名 属性 不能为空, 年龄 属性 不能为负数, 性别 属性 不能为空
alter table xueyuan add kecheng varchar(100);
一个字段 表名 添加 字段名 属性
alter table xueyuan change kecheng Kecheng varchar(100) after name;
一个字段 表名 修改 字段名 修改后字段名 属性 放在字段name下面
给表插入数据
insert into xueyuan (name,gender) value ('linghuchong', 'm') , ('xiaolongnv','f');
插入 表名 字段,字段 关键字 (name字段,gender字段),(name字段,gender字段);
insert into xueyuan value ('xiao' , 'hama' , 57 , 'm');
插入 表名 关键字 name字段, course字段,age字段,性别字段
给表修改数据
update xueyuan set Kecheng='shuxue' where name = 'xiao'
修改属性 表名 关键字 字段 修改的内容 条件 字段 修改哪一行
在表中筛选数据
select name,Kecheng from xueyuan where Kecheng='shuxue';
查询 字段 字段 关键字 表名 选择 Kecheng字段中有shuxue 的行
在表中删除数据
delete from xueyuan where Kecheng='xiaoniu';
删除 关键字 表名 条件 在Kecheng字段中有xiaoniu的行
创建、删除用户
create user 'sun' @ '%' identified by 'sun';
创建 用户 用户名 所有主机 identified by:会将纯文本密码加密作为散列值存储
客户端交互式命令
批处理模型/脚本模式 (\?)
source (\.) :去载入你文件系统上的某一个脚本
clear (\c) :语句结束符
connect (\r) :重新连接服务器
go (\g):无论语句结束符是什么,直接将此语句送至服务器
ego (\G):无论语句结束符是什么,直接将此语句送至服务器,而且结果以竖排方式显示。
quit (\q) :退出
system (\! ) :执行shell命令
\# :对于新建的对象,支持补全功能
-A :禁用命令补全
在外部使用输入重定向的方式定义
mysql -r -u -h < sun.sql
服务器端命令(mysqladmin)
可以通过客户端执行服务器端命令的
mysqladmin [-u|-p|-h] 子命令 选项
mysqladmin -uroot -p password '密码' --->修改密码
mysqladmin -uroot -p -hlocalhost create 库名 --->添加库
mysqladmin -uroot -p -hlocalhost drop 库名 --->删除库
mysqladmin -uroot -p -hlocalhost ping --->测试数据库服务器是否在线
mysqladmin -uroot -p -hlocalhost processlist --->显示正在执行的线程列表
mysqladmin -uroot -p -hlocalhost status --->显示服务器当前状态:启动时间、运行的线程数、已经完成的查询数、man查询次数、
打开的表数、刷新的表数(flush)、打开的文件数、平均下来每秒钟的查询数
mysqladmin -uroot -p -hlocalhost status --sleep 2 --->每两秒钟显示一次服务器状态
mysqladmin -uroot -p -hlocalhost status --sleep 2 --count 2 --->每两秒钟显示一次,一共显示两次
mysqladmin -uroot -p -hlocalhost extended-status --->显示状态变量及其值(统计数据)
mysqladmin -uroot -p -hlocalhost variables --->显示服务器变量(定义工作属性)
省略 flush-privileges --->让mysql重读授权表(等同于reload)
省略 flush-tables --->关闭所有已经打开的表
省略 flush-status --->重置大多数服务器状态变量(让统计数据清零)
省略 flush-tables --->关闭所有已打开的表
省略 flush-threads --->重置线程缓存(销毁空闲线程)
省略 flush-logs --->做二进制和中继日志滚动
省略 flush-hosts --->清除主机内部信息(由于太多的连接错误,而导致的用户拒接登录)
kill --->杀死进程
省略 refresh --->等同于执行flush-logs和flush-hosts
省略 shutdown --->关闭mysql 服务器
省略 version --->显示musql版本信息和状态信息
省略 start-slave --->启动复制,启动从服务器的复制线程
SQL thread --->启动的线程名字
IO thread --->启动的线程名字
省略 stop-slave --->关闭复制功能
show engines; --->可以显示当前数据库 所支持的所有存储引擎
名称 是否支持 简要描述 是否支持事务 是否支持分布式事务 是否支持保存点
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
(默认)
show table status like '表名' \G --->查看一个表的属性信息
创建表:
1、直接定义一张空表
create table [if not extsts] 表名 (表属性) ,(表选项:字段名称,字段属性,约束/索引)
2、从其他表中查询出数据并以之创建新表
3、以其他表为模板,创建一个新表
设置主键方法:
create table sun1 (id int not null auto_increment primary key ,name char(20)not null ,age tinyint not null );
create table sun2 (id int not null auto_increment ,name char(20)not null ,age tinyint not null,primary key(id,name)); :id和name联合起来成为主键
设置唯一键(名称字段中不允许出现重复)
create table sun2 (id int not null auto_increment ,name char(20)not null ,age tinyint not null,primary key(id,name) ,unique key (name)); :name这个字段中的数据不允许出现重复
create table sun2 (id int not null auto_increment ,name char(20)not null ,age tinyint not null,primary key(id,name) ,unique key (name), index(age)); :设置age 为索引
设置表的存储引擎
create table 表名 (一系列属性 )engine = 存储引擎名
设置最多存储多少行
create table 表名 (一系列属性 ) max-rows=多少行
当使用AUTOINCREMENT列创建序列时,在INSERT语句中不使用字段名将导致MySQL自动产生序列的下一个序号。这个序号作为表的主键。
insert into kk (ke) values ('huama'),('pixie'),('kuihua');
关键字 表 字段 关键字 添加内容
增加主键
insert into kk (ke) values ('huama'),('pixie'),('kuihua');
关键字 表 字段 关键字 添加内容
2、从其他表中查询出数据并以之创建新表
仿照一张表创建一张新表(有数据)
create table xinwen select * from kk where name >= 2;
创建表 表名 查看 旧表 表名 关键字 条件
3、以其他表为模板,创建一个新表
仿照一张表创建一张新表(空表)
create table 新建表名 like 仿照表明;
给表中一个字段添加一个唯一键(前提是表中没有重复的数据)
alter table 表名 add unique key (字段名);
或者:rename table 旧名字 to 新名字;
删除一个表中的字段
alter table 表名 drop 字段;
alter table
添加、修改、删除字段 修改表属性
添加、删除、修改索引 改表名
给表中一个字段添加一个唯一键(前提是表中没有重复的数据)
alter table 表名 add unique key (字段名);
给库中的表改名字
alter table 旧名字 rename to 新名字;
或者:rename table 旧名字 to 新名字;
给表中的字段改名字
alter table表名 change 旧字段 新字段 新字段属性;
直接修改表引擎
alter table 表名 engine=存储引擎名(MyISAM|lnnoDB)
多表查询(将两张表联合起来查询相同的结果):
select name , keming from xuehao,kehao where xuehao.cid=kehao.cid;
查询 表A字段 表B字段 表名 表名 条件 两张表的cid相同的数据
注意:外键约束只能够用在支持事务的存储引擎上!
单表查询
在一个表中,某个字段中相同的数值只显示一次!
select distinct 字段名 from 表名;
from子句 :表,多个表,其他查询语句(select)
where子句:布尔关系表达式,操作符(<,>,>=,<=,=)
组合条件查询
符号: %:任意长度任意字符
_:任意单个字符
rlike/regexp:使用正则表达式
in :离散取值
order by 字段 (asc升序/desc降序):给查询出来的数据排序,(默认为升序)
and :和
or :或
not :非
between。。。and。。。:。。。与。。。。之间
select cid from xuehao where not cid >2;
关键字 非 条件
select cid from xuehao where not cid >2 and id=1;
关键字 非 条件 和 条件
select cid from xuehao where cid >2 or id=1;
关键字 条件 或者 条件
select cid from xuehao where not cid > 2 and not id =1;
关键字 非 条件 和 非 条件
select cid from xuehao where not (cid > 2 or id =1);
关键字 非 条件1或条件2
select cid from xuehao where cid between 2 and 6;
关键字 cid在2与6之间(between:。。。与。。。之间)
select keming from kehao where keming like 'y%'
关键字 字段名 关键字 以y开头的字符
select keming from kehao where keming like 'k_ _ _';
以K开头后面有3个字符
select keming from kehao where keming like '%k%';
字符中包含了k的字符串
select keming from kehao where keming rlike '^[ky].*$' ;
使用正则表达式 开头是k或y
select cid from kehao where cid in (1,2,5);
筛选出一个表中id的值为1,2,5
select * from xuehao order by cid
排序 根据cid
别名:select a.Name , b.Cname from students as a,courses as b where a.CID1=b.CID;
字段别名为a 字段别名为b 表别名为a 表别名是b 条件 表a的CID1=表b的CID
多表查询
连接方式
交叉连接:笛卡尔乘积
自然连接:将两张表上相同字段当中的的那个值逐一作比较,只将等值关系将它保留下来
外连接:
左外连接:左表 left join 右表 on 条件
右外连接:左表 right join 右表 on 条件
select s.Name,c.Cname from students as s lef t join courses as c on s.CID1=c.CID;
左表 别名 s 左外连接 右表 别名 c 连接条件
select s.Name,c.Cname from students as s right join courses as c on s.CID1=c.CID;
左表 别名 s 右外连接 右表 别名 c 连接条件
子连接:
比较操作中使用子查询,子查询只能返回单个值
in ():使用子查询
联合查询
union
(select Name,Age from students) union (select Tname,Age from tutors);
insert into
insert into 表名 (字段,字段) value ('字符串',数字),('字符串',数字);
insert into 表名 set 字段=数值(字符串加引号),字段=数值,字段=数值;
select * from kebiao order by id desc limit 1;
表名 排序 字段 倒叙 只显示1个
当我们在表中删除一个数据(id 10),当我们再创建这个数据时,id不会再是10,用一条命令查看自动生成的id,(select last_insert_id();)mysql会接着这里面的数字继续排下去,除非把这里面的数值清零。
在表中筛选出的数据插入到另一张表中(两种表的字段必须相同)
insert into kebiao (name) select name from xuesheng where id>2;
插入到 表名 字段 在 字段 表名 筛选 条件
在表中筛选出的数据插入到另一张表中,若这张表中数据重复则替换
replace into kebiao (name) select name from xuesheng where id>2;
delete
mysql内置选项:当你使用delete语句或者update语句时,没有使用where条件(字句),它不会让你执行!
注意:当你清空整张表时,在插入数据,数据的id号也会接着最后一个被清空数据的id号继续往下排
所以,想要从零开始,必须清空(select last_insert_id();)中的数值
truncate 表名; --->清空表,并且重置计数器(select last_insert_id();)类似于id。。。
加锁:lock tables 表名 锁类型{read|write}
解锁:unlock tables :表示解除所有表的锁
mysql默认隔离级别为REPATABLE READ可重读
查看隔离级别:show global variables like '%iso%';
修改隔离级别:set {session|global} 变量名='对应值'; |set tx_isolation='read-committed';
创建用户
create 权限 用户名@主机名 identified by "密码"
flush privileges; 重读授权表,读取用户信息
show grants for 用户名@'主机名'; 查看用户账户信息
修改管理员密码
退出并关闭mysql :service mysql stop
手动修改启动文件:/etc/init.d/mysql 修改第283行
添加:
--skip-grant-tables :跳过授权表
--skip-networking :跳过网络
启动mysql服务:service mysql start
use mysql :指定数据库
select User,Host,Password from user; :查看用户表
update user set Password=PASSWORD('密码') where User='root'; :手动修改密码
退出数据库,关闭服务!
修改/etc/init.d/mysql,把添加的那两行删除
再重新启动服务,就可以登陆了
如果此文章有帮助到您,还请麻烦动动您的小手点个赞,谢谢~
【免费】最新版Linux运维技术入门视频教程请移步:https://edu.csdn.net/course/detail/29944
Linux运维技术交流群:962822359