数据库系统 DBS
数据库 DB
数据库管理系统 DBMS
数据库管理员 DBA Database
Administrator
关系型数据库
以行和列的形式存储数据,这一系列的行和列被称为表,一堆表组成了库,一堆库组成数据库服务器
非关系型数据库 ----nosql not only spl
09年左右兴起的东西,redis
SQL结构化查询语言
数据定义语言(DDL)
数据操作语言(DML)
数据查询语言(DQL)
数据控制语言(DCL)
连接mysql
mysql -u用户名 -p密码 -h主机
mysql -uroot -p
常见的操作
显示帮助信息:\h
\q 退出当前客户端
\s 显示当前服务器信息
\c或ctrl+c 结束当前末完成的操作
\G 将查询后的数据立起来
\d 修改命令执行符
-- 链接数据库
mysql -u用户名 -p
-------库相关操作--------
---查看所有数据库
show databases;
---创建数据库
create database 库名;
create database if not exists 库名;
---删除数据库
drop database 库名;
drop database if exists 库名;
---选择数据库
use 库名
-----------表的相关操作------
--查看所有数据表
show tables;
--创建数据表
create table 表名(
字段1 类型,
字段2 类型
。。。
)engine=innodb default charset=utf8;
注意:字符集为utf8,不是utf-8
--查看表结构
desc 表名;
--查看建表语句
show create table 表面;
--删除表
drop table 表名;
---------数据的相关操作-------------
--插入数据
insert into 表名(`字段1`,`字段2`...) value('值1','值2'...);
insert into 表名 value('值1',...);
这种方式一定要将所要的字段都对于上值
--查询数据
select `字段1`,`字段2`...from 表名;
select * from 表名;
--修改数据
update 表名 set `字段1`='值1',`字段2`=`值2`...where 条件;
--删除数据
delete from 表名 where 条件;
---
注意:修改和删除必须加条件,否则就是耍流氓!
----------------
数据库的备份和还原--------
---在cmd想操作
---导出数据库
mysqldump -u用户名 -p 库名 >路径
mysqldump -uroot -p gz24 > c:/gz24.sql
---还原数据
--导入1:在cmd下操作
mysql -u用户名 -p 库名 < 文件路径
mysql -uroot -p gz24 < c:/gz24.sql
--导入2:在进入mysql并选择了数据库的情况下
source 文件路径
权限相关
修改密码
方式1:在cmd操作
mysqladmin -u用户名 -p password 新密码
方式二:在进入mysql的情况
set password for 用户名@主机=password('123');
方式3:修改mysql库中的user用户表
upadte user set authentication_string=password('abc') where user = 'root';
刷新服务器
flush privileges
注意:低版本的密码字段不是authentication_string,是password;改完之后要记得刷新服务器
添加用户
grant selsect,update,insetr,delete on 库名.表名 to 用户名@主机名 identified by '密码';
例子:
grant all privileges on *.* to
hehe@localhost identified by '123';
创建数据表
create table 表名(
字段1 类型
);
整型
tinyint
取值范围
有符号: -128~127
无符号:0~255
可以用于存年龄、标记,比如商品的状态:1新添加,2表示在售中,3已下架;订单状态、性别
smallint
mediumint
int
取值范围
有符号:正负二十多个亿
无符号:0~40多个亿
用于计算、时间戳
bigint
注意:
1.存入小数会四舍五入
2.超出取值范围报错
非严格模式下,取最大值存入
3.int(5)表示的只是显示宽度,并不是限定只能插入5位数,它具体取值范围,由类型所决定
浮点型
float(浮点型)
double(双精度)
可以表示的范围更广,精度更高
decimal(定点数)
默认为(10,0)
比float更精确
注意:
1.当小数超出规定长度,采用四舍五入保存
2.超出整数范围,报错,无法插入
建议:涉及金钱的存储用int,取出后除以100进行计算;
字符串
char(定长)
取值范围:0~255
定长:char(10)表示固定的占10个字节,哪怕你存的是abc,在存储的时候占的空间也是10个字节
什么时候定长?
手机号、邮编、md5的密码(32)
varchar(变长)
取值范围:0~65535
变长:varchar(10)表示最大只能存10个字符,但是你存个abc,实际占的字节数是4,引文它需要用1个字节来表示字符串的长度,还需要用1个字节来表示是否为null
注意:
1.字符串的值必须要加引号(单双引号都可以)
2.不管是char还是varchar超出指定长度都不行
3.char会截取掉后面的空格,而varchar不会
4.char(10)或者varchar(10)表示是10个字符,而不是10个字节,存储时实际占用的字节数跟字符集相关。
text
用于存储大文本,比如一篇文章、简介信息等等
枚举
enum
集合
set
总结:
1.取值范围需要在建表的时候显式指定,超出集合范围报错,无法插入
2.enum类型允许有0~65535个成员;对于1-255个成员,需要占1个字节存储,对于256~65535个成员需要用2个字节储存
3.枚举不区分大小写
4.set可以选多个成员,枚举只能选1个成员
5.set类型可以设置64个成员
1~8 1个字节
8~16 2个字节
17~24 3个字节
25~32 4个字节
33~64 8个字节
日期和时间
我们通常使用时间戳来表示日期和时间,时间戳用int类型存储
date类型
数据字段的属性(字段的约束)
unsigned(常用)
用于表示无符号,可以改变某些类型的取值范围
注意:unsigned必须紧跟在类型的后面
zerofill
用于设置显示宽度不足的时候自动填充0
auto_increment(重要)
用于表示自增,通常我们的ID就是自增的
1.会产生一个唯一的标识或顺序值,值一般从1开始
2.mysql会找出出现过的最大的值加1,作为下一次的自增值
3.插入null会自增
注意:auto_increment必须加在
primary key或者unique的字段上;
☆:往primary key的字段上插入数据时,就算其中一条错导致报错,其他对的数据也会正常插入
null和not null
默认为null,如果知道了not
null,则添加数据时,必须要给它指定值
default
设置字段的默认值
--数据库的索引
索引是数据库中用来提示搜索性能的,做数据库优化的时候,第一步想到就是索引的优化。
索引的分类
1.常规索引
index,最基本的索引,没有任何限制
创建:
create table 表名(
....
index 索引名(要索引的字段)
);
添加:
create index 索隐名 on 表名(
字段名)
删除:
drop index 索引名 on 表名;
2.唯一索引
unique,与普通索引类似,但是表示这一列的值不能有重复的
创建:
create table 表名(
字段 类型 约束 unique,
unique 索隐名(字段名)
);
删除:
drop index 索引名 on 表名(字段名);
添加:
create unique index 索引名 on 表名(字段名);
3.主键索引
primary key,与唯一索引类似,也是用于表示唯一;一张数据表只能有1个主键索引
创建:
create table 表名(
字段 类型 约束 primary key);
create table 表名(
字段 类型 约束,
primary key(字段名)
);
删除:
alter table 表名 drop primary key;
添加:
alter table 表名 modify 字段 类型 约束 primary key;
4.全文索引
-- 存储引擎
mysql中常用的存储引擎就两种:myisam和innodb
基本的差别:
1.myisam不支持事物处理、外键等高级特性,而innodb支持
2.myisam强调的是性能,其执行速度比innodb略块
3.myisam是表锁,innodb是行锁
-- 字符集的设置
mysql的字符集分为4个级别:
服务器基本
库级别
表级别
字段级别
库级别
1.查看数据库的字符集
show create database 库名;
2.建库的时候指定字符集
create database hehe default charset=utf8;
3.修改库的字符集
alter database gz24 default charset=utf8;
表级别
1.查看表的字符集
show create table s1;
2.建表的时候指定字符集
参考之前的代码
3.修改表的字符集
alter table s1 default charset=utf8;
注意:没有指定字符集的时候,默认是向上继承
--表的修改
1.修改表的名字
alter table 旧表名 rename 新表名
2.改字段的类型
alter table s1 modify name char(30) not null;
3.改字段名
alter table s1 change username name varchar(30) default 'no';
4.添加新字段
alter table s1 add sex enum('m','w','y') not null default 'm';
alter table s1 add des varchar(255) first;
alter table s1 add des2 varchar(255) after id;
5.删除字段
alter table s1 drop des2;
6.修改表的存储引擎
alter table s1 engine=myisam;
7.修改表的字符集
alter table s1 charset=utf8;
alter table s1 default charset=utf8;
--数据操作语言(DML)
1.insert 增
1.可以插入单条语句
insert into 表名 value();
2.插入多条语句
insert into 表名 values(),()...;
3.指定字段
insert into 表名(字段1,字段2...)
values(),();
注意:没有指定字段的情况下,必须将所有的字段都一一赋值
2.update 改
update 表名 set 字段=值 where 条件;
3.delete 删
delete from 表名 where 条件;
-- 数据查询语言(DQL)
select语言
1.查询所有
select * from 表名;
2.查询指定字段
select 字段1,字段2 from 表名;
3.给字段指定别名
select 字段1 as 别名,字段2 from 表名;
--as 可以省略
select 字段1 别名,字段2 from 表名;
4.distinct将查询结果取重
select distinct 字段名 from 表名;
5.在select中使用表达式
运算符:+ - * / %
函数:
md5() md5加密
password() mysql的加密
Unix_timestamp() unix时间戳
concat() 将两个字段连接查询
6.where条件
and 和 or
is null 和 is notnull
between 和 not between
like 和not like
_ 表示任意的单个字符
% 表示任意个字符
in
--使用统计函数
count() 统计
sum() 求和
avg() 求平均值
max() 求最大值
min() 求最小值
--排序
--倒序
select * from 表名 order by 字段 desc
--升序查询(默认)
select * from 表名 order by 字段名 asc
--限定结构行数
--只查一条
select * from 表名 limit 1;
--跳过1条取2条
select * from 表名 limit 1,2;
--分组查询
select count(*) from 表名 group by 字段名
--分组并筛选
select count(*),sex,avg(age) from user group by sex having sex='女';
--完整的select语句
select 字段 from 表名 where id>0 group by sex having sex='女' order by sex limit 1;
--多表查询
可以以'表名.字段名'的方式查询
还可以给表取个别名
select u.username from user as u;
-- 子查询
将一个表的查询结果作为另一个表的条件
--php连接数据库
--在使用php操作mysql之前请确认mysql扩展是否开启
1.用phpinfo查看mysqli扩展是否开启
2.如果没有开,在php.ini里面找到extension=php_mysql.dll,将前面的分号干掉
--phpinfo();
--天龙八部
1.连接mysql服务器
1.主机名 数据库服务器的地址
2.用户名
3.密码 如果没有密码就为空字符串
$link = @mysqli_connect('localhost','root','123');
2.判断一下是否连接成功
if(mysqli_connect_errno()>0) {
echo '数据库连接失败:'.mysqli_connect_error();
exit;
}
3.选择数据库:相当于use gz24;
1.数据库的链接标准
2.库名
mysqli_select_db($link,'gz24');
4.设置字符集
mysql_set_charset($link,'utf8');
5.准备sql语句
$sql = 'select * from user where id < 0';
6.发送sql语句
$res = mysql_query($link,$sql);
7.处理结果集
判断sql语句是否有问题;并且判断是否查到结果
if($fes && mysqli_num_rows($res)>0){
$arr = [];
while ($row = mysqli_fetch_assoc($res)){
$arr[] = $row;
}
var_dump($arr);
mysqli_free_result($res);--释放结果集
} else {
echo mysqli_errno($link);--错误号
echo mysqli_error($link);
--错误信息
}
8.关闭数据库连接
mysqli_close($link);
--六脉神剑(查询)
--1.连接数据库并判断
$link = @mysql_conect('localhos','root','123','gz24') or die('数据库连接失败:'.mysqli_connect_error());
--2.设置字符集
mysqli_set_charsset($link,'utf8');
--3.准备sql语句
$id = $_GET['id'];
$sql = "select * from user where id={$id}";
echo $sql;
--4.发送sql语句,查询成功返回的是包括结果集的对象
$res = mysqli_query($link,$sql);
--5.处理结果集
if($res && mysql_num_rows($res)>0){
--1.将结果读取为混合数组
--$row = mysqli_fetch_array($res);
--2.将结果读取为关联数组(常用)
--$row = mysqli_fetch_assoc($res);
--3.将结果读取为索引数组
--$roe = mysqli_fetch_row($res);
--4.将结果读取为对象(了解)
--$row = mysqli_fetch_object($res);
--将结果集全部读出来
--$row = mysqli_fetch_all($res,MYSQLI_BOTH);
$row = mysqli_fetch_all($res,MYSQLI_ASSOC);--常用
--释放结果集
mysqli_free_result($res);
} else {
$row = [];
}
var_dump($row);
--6.关闭数据库
mysqli_close($link);
--新增数据
--连接数据库
$link = mysqli_connect('localhost','root','123','gz24') or die('数据连接失败');
--设置字符集
mysqli_set_charset($link,'utf8');
--准备sql语句
$pwd = md5('333');
--一次性插入两条
$sql = "insert into user values(null, '老马哥', '{$pwd}', '18338383836', '男', '".time()."', '83'),(null, '老马哥', '{$pwd}', '18338383835', '女', '".time()."', '31')";
echo $sql;
--发送sql语句
--插入成功返回的是布尔型,要么为true,要么为false
$res = mysqli_query($link,$sql);
var_dump($res);
--处理结果
--返回受影响行数,插入失败返回-1
echo mysqli_affected_rows($link);
if($res && mysql_affected_rows($link) > 0){
echo '插入成功';
}else {
echo '插入失败';
}
--关闭数据库
mysqli_close($link);
--修改操作
//连接数据库
$link = mysqli_connect('localhost', 'root', '123', 'gz24') or die('数据库连接失败鸟~~~');
// var_dump($link);
//设置字符集
mysqli_set_charset($link, 'utf8');
// mysqli_query($link, 'set names utf8'); //等效上一行
//准备sql语句
$sql = "update user set sex='妖',username='阴森森2' where username='阴森森'";
//发送sql语句
//发送修改语句,返回true或者false;不管有没有改到数据,只要sql语句没有语法问题,结果一定是true
$res = mysqli_query($link, $sql);
var_dump($res);
//处理结果集
echo mysqli_affected_rows($link);
if ($res && mysqli_affected_rows($link) > 0) {
echo '修改成功';
} elseif ($res && mysqli_affected_rows($link) == 0) {
echo '什么都没改';
} else {
echo '修改失败';
}
//关闭数据库
mysqli_close($link);
--删除和获取最后插入id
//连接数据库
$link = mysqli_connect('localhost', 'root', '123', 'gz24') or die('数据库连接失败鸟~~~');
// var_dump($link);
//设置字符集
mysqli_set_charset($link, 'utf8');
// mysqli_query($link, 'set names utf8'); //等效上一行
//准备sql语句
// $sql = "delete from user where id=26 or id=25";
$sql = "insert into user(username,pwd,phone) values('小卓卓', '".md5('123')."', '12345678914'),('小卓卓', '".md5('123')."', '12345678915'),('小卓卓', '".md5('123')."', '12345678916')";
//发送sql语句
$res = mysqli_query($link, $sql);
var_dump($res);
echo mysqli_affected_rows($link); //受影响行数
//处理结果集
if ($res && mysqli_affected_rows($link) > 0) {
echo '删除成功';
} else {
echo '删除失败';
}
//获取最后插入ID,多条同时插入的时候,只能获取第一条的id
echo mysqli_insert_id($link);
//关闭数据库
mysqli_close($link);