MYSQL基础

  • 文件的包含

    include include_once //包含的文件若不存在,程序继续执行

    require require_once //包含的文件若不存在,程序终止,不执行下面的语句

    once的函数在同一网页中出现多次,也只会执行一次

  • 提示:MYSQL语句不区分大小写,只是MySQL语句规范

    1.关键字和函数名全部大写

    2.数据库名称,表名称,字段名称全部小写

MYSQL基础

1.mysql概述

  • 什么是数据库?

    答:数据的仓库

  • 数据库的主要功能

    1.将数据保存到文件或内存

    2.接收特定的命令,然后对文件进行相应的操作

2.MYSQL的安装

  • MySQL是一个关系型数据库管理系统

  • 想要使用MySQL来存储并操作数据,则需要

    1.安装MySQL服务端

    2.安装MySQL客户端

    2.1.客户端连接服务端

    3.客户端发送命令给服务端MySQL服务的接受命令并执行相应的操作

  • phpstudy相对于的两个管理工具

    • mysql_front //c/s
    • phpmyadmin //b/s
  • 注意:MySQL安装后,系统会自动创建名为information_schema和mysql的两个系统数据库,系统数据库存放一些和数据库相关的信息,如果删除了这两个数据库,MYsql将不能正常工作。

3.MySQL四种常见数据库表引擎

  • 存储引擎查看

  • InnoDB存储引擎(安全性)

    • 由一个.frm文件组成

    如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制

    InnoDB提供支持以及外部键(外键:可实现级联删除、更新操作)等高级数据库功能

  • MYISAM存储引擎(性能)

    表文件存储 表文件的存储是由 . frm .MYD .MYI

    如果数据表主要用来插入和查询记录,则MYISAM引擎能提供较高的处理效率

    MYISAM类型的表强调的是性能;

    MYISAM类型不支持事务处理等高级处理

    InnoDB与MYISAM相对比

    • 两种类型最主要的差别就是InnoDB支持事务处理与外键的行级锁;而MYISAM不支持,所以MYISAM往往就容易被人认为只适合在小项目中使用。
  • MEMORY存储引擎

    如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果

  • Archive存储引擎

    如果只是INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Arichive

4.MYSQL操作

  • 操作分类

    1.可视化操作【借助工具实现 mysql-front phpmyadmin】

    2.命令行操作

  • 数据库操作

    1.链接数据库:mysql -u root -p

    2.显示数据库:show databases;

    3.mysql创建数据库指定字符集

    4.选择数据库:use 库名;

    5.删除库【谨慎操作,重要数据先备份】

    ​ drop database 库名;

    ​ drop database if exists 库名; //推荐使用

    6.创建库

    ​ create database 库名;

    7.数据库重命名

  • 表操作

    1.显示表show tables;

    2.创建表

    create table 表名(
    列名 类型 是否为空
    列名 类型 是否为空
    )engine=InnoDB default
    CHARSET=utf8
    

    3.删除表

    ​ drop table 表名

    4.清空表

    delete from 表名; //清空后,主键起始值继续增加
    truncate table 表名; //清空后,主键起始值从1开始
    
  • 表字段操作

    • 表字段命名规则

      1.建议全部小写

      2.不要用系统关键字命名

      3.命名方式建议字母、字母+数字/符号的组合

      4.字段名是唯一的

    1.增加字段

    alter table 库名.表名
    	add column 字段名 类型 是否为空 default 默认值 comment 备注信息;
    

    2.修改字段

    alter table 库名.表名
    	change column 被修改的字段 新字段 类型 是否为空 default 默认值 comment 备注信息;
    

    3.删除字段

    alter table 库名.表名
    	drop column 字段名 ;
    

    4.MySQL字段四大类(尽量设置为无符号 //设置的量相对应要多点)

    • 数值型

      • 整型

        一.常用的四种整型类型

        • tinyint:微小的(默认是有符号,-128~127)

        • smallint 小的

        • mediumint

        • int

          1)占据空间

          2)存储范围

          tinyint 微小的列类型,1个字节。默认是有符号的,勾选对应字段设置为unsigned无符号

          无符号最大的范围【0~255】

          有符号的【-128~127】

        二.十进制、二进制&正负数

        三.常用的四种整型类型值范围

        ​ 字节位 无符号 有符号

        tinyint 1 8 0~255 -128~127

        smallint 2 16 0~2^16-1 -215~215-1

        mediumint 3 24

        int 4 32

        四.无符号unsigned与零填充zerofill

        unsigned:无符号,影响存储范围

        M代表宽度:在zerofill时才有意义

        zerofill:零填充

      • 浮点型

        MySQL中使用浮点数类型和定点数类型来表示小数

        浮点型在数据库中存放的是近似值

        定点类型在数据库中存放的是精确值

        浮点数类型包括了单精度浮点数(float)、双精度(double)、定点数类型decimal(numeric)

        MySQL中可以指定浮点数和定点数的精度。其基本形式下:数据类型(M,D)

        M参数称为精度,是数据的总长度,小数点不占位置。D参数成为标度,是指小数点后面的长度位D。

    • 字符型

      一.char 、varchar

      char:定长255,char(M);代表宽度,可容纳的字符数

      varchar:变长utf8 2w左右汉字 varchar(m);代表宽度,可容纳的字符数

      两者区别:

      char定长:

      ​ M个字符,如果存的小于M个字符,实占M个字符。(如果不够M个字符,内部会用空格补齐)取出的时候,会把后面的空格去掉。

      varchar:

      ​ M个字符,存的小于M个字符N(n<=m),实际只占用N个字符

      三个区别:

      ​ 1.大小

      ​ 2.空间利用率,定长存储,变长存储

      ​ 3.处理末尾空格机制不同

      速度上:

      ​ char定长速度快

      char与varchar型的选择原则:

      ​ 1.空间利用效率

      ​ 2.速度

      二,text

      text缺点:不能全文索引

      可以存储较大的文本段,搜索速度慢

      不要加默认值,无效

    • 日期/时间型

      日期/时间型在数据库中主要分两种格式存储

      ​ 1.时间字符串

      ​ 2.时间戳整型

  • 记录操作

    • 增加

      insert into 表名 set 字段名=值,字段名=值;
      

      插入多条记录

      insert into 表名 (字段1,字段2) values (值1,值2),(值1,值2);
      
      replace into 是根据索引值进行判断,若存在则先删除,后增加一条
      ++++++++++++++
      replace into 表名 set 字段1=值,字段2=值;
      
    • 删除记录

      delete from 表名 where 条件;
      ++++++++++++++++++++++++++
      清空数据,让自动增量从1开始;
      在数据调试阶段,我们需要录入调试数据
      方法一:
      	使用工具可视化操作
      	
      方法二:
      	不使用delete from 表名,清空数据
      	使用truncate 表名
      
      
    • 修改记录

      update 表名 set 修改字段=值,修改字段=值 where 条件;
      
      
    • 查询记录

      单表查询;=,like,in not in,>,<,>=,<=,<>,limit,rand(),sum(),count(),avg(),max(),min(),group by having;wghol
      wghol顺序
      :where group having order limit
      
      

      通配符:

      ​ %:代表0个、一个或多个字符

      ​ _:代表一个字符

      多表查询:子查询,关联查询,左右链接
      子查询:查询当中在插入查询充当条件或是字段,子表
      关联查询:关联查询中一定要把关联字段作为where条件;若没有了where,查询出来的结果是对应的表记录的乘积,称之为笛卡尔积
      左右链接:查询要求记录且关联表的相关记录
      	左链接:left join左链接查询:左边表全部记录及右边表满足要求的记录
      	select 字段 from a left join b on a.字段=b.字段
      	右链接:right join右链接查询,右边全部记录及左边表满足要求的记录
      	select 字段 from a right join b on a.字段=b.字段
      
      
      联合查询:
      union、union all
      共同点:组合多个查询结果为一个查询结果集;
      不同点:
      union:过滤重复的部分,只保留一个
      union all:显示所有
      sql用了union后的排序问题
      	注意事项:
      	1.必须声明临时表
      	2.必须使用别名
      
      
  • 索引、主键、外键

    索引:
    定义:索引--该字段没有重复值,但可以有一个空值
    作用:索引--是提高查询排序的速度
    个数:索引--一个表可以有多个唯一索引
    
    
    主键:
    定义:唯一标识一条记录,不能有重复的,不允许为空
    作用:主键--用来保证数据完整性
    个数:主键--主键只有一个
    
    数据库主键,指的是一个列或是多个列的组合,其值能唯一地标识表中的每一行,通过它可强制表的实体完整性,主键主要是用来其他表的外键关联,以及本记录的修改与删除。
    
    
    外键【InnoDB】
    MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。在创建索引的时候,可以指定在删除、更新父表时,对子表进行的相应操作。
    定义:表的外键是另一个表的主键,外键可以有重复的,可以是空值。
    作用:外键--用来和其他表建立联系使用
    个数:外键--一个表可以有多个外键
    
    如果是公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键,由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表,外键又称为外关键字
    
    
  • 数据库/表 sql导入&导出 //命令行操作

    • 数据库/表导出

      导出:数据+结构,且删除创建目标
      mysqldump -u 账户 -p 库名 >位置
      导出:结构
      mysqldump -u 账户 -p -d 库名 >位置
      导出:数据
      mysqldump -u 账户 -p 库名 表1 表2 >位置
      
      
    • 数据库/表导入

      mysql>set names utf8;
      mysql>source 导入表所在的位置;
      
      

5.MYSQL运算符与常用函数

  • 运算符

    1.数值计算运算符 加减乘除取余(+ - * / %)

    DIV:除法
    	结果得到后,只保留整数部分
    MOD:取余
    	同等与%
    
    

    2.比较运算符,特殊比较运算符

    一、比较运算符
    MySQL支持的比较运算符:大于、小于、等于、不等于、大于等于、小于等于(>、<、=或<=>、>=、<=、<>或!=)、特殊比较运算符。
    需要注意的null值得相等比较,其他与数学比较运算基本无异。
    <=>主要用来比较null得,MySQL特有得一个符号。条件比较时:is null或者<=>null,
    is not null或者not 字段<=>null
    
    
    二、特殊比较运算符
    除了数学类得比较运算符,还有一些特殊比较运算符
    BETWEEN AND 存在于指定得范围
    	BETWEEN values1 AND values2;用来比较匹配指定value1与value2两个值之间的值,比较值可以是数字、文本、时间
    IS NULL 为空
    	比较值是否为空
    IN 存在于指定的集合
    	比较(匹配)值是否在指定的集合中
    LIKE 通配符匹配
    	比较(匹配)字符是否符合指定模式的字符
    REGEXP 正则表达式
    	用来做正则匹配
    	正则表达式基于JavaScript/PHP
    
    
  • 常用函数

    字符串函数:
    1.加密
    MD5数据加密
    	select MD5("字符串");
    2.串接
    CONCAT(str1,str2……strn):连接字符串
    str1,str2……strn为一个完整的字符串,其中任意参数包含了NULL则直接返回NULL
    
    CONCAT_WS(连接字符,str1,str2……strn):将第一个值作为字符串的间隔字符,后面的参数以该字符作为间隔字符逐个拼接,如果后于字符参数带有null,会直接忽略继续拼接
    3.长度计算
    LENGTH()和CHAR_LENGTH():获取字符串长度。
    	通常情况下使用LENGTH获取英文字符串长度,CHAR_LENGTH获取中文字符长度,所以LENGTH获取的中文字符串长度为3
    4.大小写转换
    UPPER()和UCASE():将字符串中的字符转换为大写。
    LOWER()和LCASE():将字符串中的字母转换为小写。
    5.截取
    LEFT(STR,NUM)、RIGHT(STR,NUM):从左边或右边截取num字符串长度的字符串。
    
    SUBSTRING(STR,NUM,LEN),MID(STR,NUM,LEN):从字符串str中的num位置开始截取长度为len的字符串。注意num在str按照从1到n取值,num表示截取字符串查长度的起始位置
    6.去空格
    LTRIM(STR):去除字符串开始处空格。
    RIRIM(STR):去除字符串结束处空格。
    TRIM(STR):去除字符串左右空格。
    7.替换
    INSERT(STR,POS,LEN,NEWSTR):将str中以第pos个字符起始,len长度的字符串替换成newstr字符串。
    REPLACE(STR,SUBSTR,NEWSTR):将str中所有的substr字符串替换为newstr。
    
    
    数值函数:
    SUM():求和
    MAX():求最高分
    AVG():求平均值
    ABS(x):返回x的绝对值
    CELL(x):返回大于或等于x的最大整数值;#向上取整
    FLOOR(x):返回小于或等于x的最大整数值;#向下取整
    MOD(x,y):返回x除以y的余数
    RAND():返回0~1内的随机数
    ROUND(x,y):返回数值x的四舍五入后有y位小数的数值
    TRUNCATE(x,y):返回数值x且截断为y位小数的值
    
    
    
    日期/时间函数
    1.获取当前日期
    SELECT CURDATE() #获取当前日期
    2.获取当前时间
    SELECT CURTIME() #获取当前时间
    3.获取当前日期和时间
    SELECT NOW(); #获取当前日期和时间
    4.格式化时间
    SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s'); #格式化时间
    5.字符串-》时间戳
    select UNIX_TIMESTAMP();#当前时间戳
    6.把我们的时间戳-》字符串
    SELECT FROM_UNIXTIME(1641096732);#时间戳-》字符串 2022-01-02 12:12:12
    SELECT FROM_UNIXTIME(UNIX_TIMESTAMP()); #等效于select NOW();
    
    WEEKOFYEAR(date);获取日期为date对应一年的第几周
    
    

7.PHP操作MySQL

链接数据库函数
1.php7已废弃
mysql_connect
	mysql_connect函数,PHP5开始,MySQL就不推荐使用了,PHP7已经放弃mysql_connect()支持
2.mysqli_connect
	过程化
	对象化
	

步骤分解
1.连接数据库
$conn=mysqli_connect("localhost","账户","密码");
if(!$conn){
die("数据库连接失败!");
}  //$conn连接成功时为object,不成功时为布尔值 false
2.设置操作的数据库
mysqli_select_db($conn,"数据库名"); //设置操作的数据库
3.设置操作编码
mysqli_query($conn,"set names utf8"); //设置操作编码
注意:设置编码是utf8或者gbk,不是utf-8,不是gbk2312
使用set names utf8或者 set names gbk设置默认的编码格式
4.执行SQL&处理结果
//执行sql
	$sql="select * from 表名";
	$rst=mysqli_query($conn,$sql);
//处理结果
while($arr=mysqli_fetch_assoc($rst))
{
 //print_r($arr);
 echo "
"; echo $arr['字段名']; } 5.关闭连接 mysqli_close($conn);
数据处理:
查询数据类型转换
	mysql_fetch_row
	mysql_fetch_assoc
	得到的是关联数组
	mysql_fetch_array
	可以得到关联数组也可以得到索引数组
	注释:mysql_fetch_array($result,'MYSQL_ASSOC')与mysql_fetch_assoc($result)返回结果相同,提示:如果在关联索引之外还需要数字索引,用mysql_fetch_array()
	本函数返回的字段名是区分大小写的
	mysqli_fetch_object
	$rs=mysqli_fetch_object() //对象
	$rs->字段名
计算总记录
mysqli_num_rows
	mysqli_num_rows($result)
	返回结果集中行的数量

MYSQL用户及权限

1.概述

数据库保存着应用程序日积月累记录下来的数据资产,安全级别特别高,所以只能让授权的用户可以访问,其他用户一律拒绝。MySQL是一个多用户数据库,拥有功能强大的访问控制系统,可以为不同的用户指定不同的权限。

MySQL中存在5个控制权限的表
全局层级:全局权限适用于一个给定MySQL server中的所有数据库,这些权限存储在mysql.user表中

数据库层级:数据库权限适用于一个给定数据库中的所有目标,这些权限存放在mysql.db表中

表层级:表权限适用于一个给定表中的所有列,这些权限存储在mysql.tables_priv表中

列层级:列权限适用于一个给定表中的单一列,这些权限存储在mysql.columns_priv表

子程序层级:CREATE ROUTINE、ALTER ROUTINE、EXECUTE和GRANT权限适用于已存储的子程序。这些权限可以被授予为全局层级和数据库层级。
而且,除了CREATE ROUTINE外,这些权限可以被授予子程序层级,并存储在mysql.procs_priv表中

2.MySQL用户认证

用户与数据库服务器交互数据,分为两个阶段:
1.你有没有权限连接
	服务器如何判断用户有没有权限连接上来:
	依据:
	1.你从哪来?host
	2.你是谁?user
	3.你的密码是多少?password
	
	用户的这三个信息,存储在mysql库中的user表中。
	修改host域,使IP可以连接
	mysql>use mysql;
	mysql>update user set host='IP地址' where user='root';
	mysql>flush privileges; #冲刷权限
	
	修改用户密码
	mysql>update user set password=password('13131') where user='';
	mysql>flush privileges;
2.你有没有权限执行操作
	在mysql中,有一个库是mysql库,在这个库中有三个表,一个是user表,user表中存储了所有用户的权限信息。一个是db表,db表存储的是所有用户在数据库层的权限信息。一个是tables_priv表,存储的是所有用户在表层的权限信息,
	用户登录,user表首先能限制用户登录,其次还保存了该用户的全局权限,如果该用户没有任何权限,那么将从db表中查找该用户是否有某个数据库的操作权限,如果没有,将从tables_priv表中查找该用户是否有某个表的操作权限,如果有,则该用户可以按照已有的权限来操作该表。
	1)全局授权和收回
	新增用户并赋予全局权限:
	常用权限:all, create,drop,select,insert,delete,update
	grant[权限1,权限2,……] on *.* to user@'host' identified by 'password'
	//第一个*是库名,第二个*是表名
	授权:
	创建/更新lisi用户,host为x.x.x.%,%通配符表示x.x.x.的段用户都可以连接,密码为123
	grant all on *.* to lisi@'x.x.x.%' identified by '123';
	
	收回权限:
	revoke all on *.* from lisi@'x.x.x.%';
	已经存在用户,也可以用这个命令设置
	grant all on *.* to root@'x.x.x.x' identified by 'root';
	revoke all on *.* from root@'x.x.x.x';
	
	2)数据库级授权和收回
	需求:让lisi用户拥有mysqlmaster数据库的所有操作权限
	授权:
	grant all on mysqlmaster.* to lisi@'x.x.x.x' identified by '123';
	
	收回:
	revoke all on mysqlmaster.* from lisi@'x.x.x.x';
	
	3)表级授权和收回
	同数据库级操纵类似,修改第二个*即可

MySQL中的权限分配都是分配到用户+主机的实体上。MySQL的主机信息可以是本地(localhost),某个IP,某个IP段,以及任何地方等,即用户的地址可以限制到某个具体的IP ,或者某个IP范围,或者任何地方。

MYSQL用户分为普通用户和root用户。root用户就超级管理员,拥有所有权限,普通用户只拥有被授予的各种权限。

3.MySQL的权限分类及存储

全局性的管理权限:作用于整个MySQL实例级别(user)
数据库级别的权限:作用于某个指定的数据库上或者所有的数据库上(db)
数据库对象级别的权限:作用于指定的数据库对象上(表、视图等)或者所有的数据库对象上(tables_priv)

权限存储在mysql库的user,db,tables_priv,colums_priv,procs_priv这个几个系统表中,待MySQL实例启动后就加载到内存中

4.MySQL访问控制实战-允许远程访问/外网访问

设置服务器的MySQL允许远程访问/外网访问
一、进入mysql
mysql -u root -p
输入密码

二、选择MySQL数据库
use mysql

三、增加允许远程访问的用户或者允许现有用户的远程访问。
给root授予在任意主机(%)访问任意数据库的所有权限。
update user set host='%' where user='root';

insert into user set host="%",user='lisi2',password=password('lisi2');

四、冲刷连接权限
flush privileges;

五、设置权限
grant all on *.* to lisi@'x.x.x.x' identified by '123';

六、退出mysql
exit;

你可能感兴趣的:(mysql,php)