文件的包含
include include_once //包含的文件若不存在,程序继续执行
require require_once //包含的文件若不存在,程序终止,不执行下面的语句
once的函数在同一网页中出现多次,也只会执行一次
提示:MYSQL语句不区分大小写,只是MySQL语句规范
1.关键字和函数名全部大写
2.数据库名称,表名称,字段名称全部小写
什么是数据库?
答:数据的仓库
数据库的主要功能
1.将数据保存到文件或内存
2.接收特定的命令,然后对文件进行相应的操作
MySQL是一个关系型数据库管理系统
想要使用MySQL来存储并操作数据,则需要
1.安装MySQL服务端
2.安装MySQL客户端
2.1.客户端连接服务端
3.客户端发送命令给服务端MySQL服务的接受命令并执行相应的操作
phpstudy相对于的两个管理工具
注意:MySQL安装后,系统会自动创建名为information_schema和mysql的两个系统数据库,系统数据库存放一些和数据库相关的信息,如果删除了这两个数据库,MYsql将不能正常工作。
存储引擎查看
InnoDB存储引擎(安全性)
如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制
InnoDB提供支持以及外部键(外键:可实现级联删除、更新操作)等高级数据库功能
MYISAM存储引擎(性能)
表文件存储 表文件的存储是由 . frm .MYD .MYI
如果数据表主要用来插入和查询记录,则MYISAM引擎能提供较高的处理效率
MYISAM类型的表强调的是性能;
MYISAM类型不支持事务处理等高级处理
InnoDB与MYISAM相对比
MEMORY存储引擎
如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果
Archive存储引擎
如果只是INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Arichive
操作分类
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 导入表所在的位置;
运算符
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对应一年的第几周
链接数据库函数
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是一个多用户数据库,拥有功能强大的访问控制系统,可以为不同的用户指定不同的权限。
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表中
用户与数据库服务器交互数据,分为两个阶段:
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用户就超级管理员,拥有所有权限,普通用户只拥有被授予的各种权限。
全局性的管理权限:作用于整个MySQL实例级别(user)
数据库级别的权限:作用于某个指定的数据库上或者所有的数据库上(db)
数据库对象级别的权限:作用于指定的数据库对象上(表、视图等)或者所有的数据库对象上(tables_priv)
权限存储在mysql库的user,db,tables_priv,colums_priv,procs_priv这个几个系统表中,待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;