<?php
//header("Content-type:text/html;charset=utf-8");
库的增删查
create database 名字 [charset utf8]; 增
drop database 名字 删
show databases 查
表的增删改查
结构
create table 名字(
列名 列类型 [列参数 not null default 默认值 列注释],
...
)[engine=innodb/myisam charset=utf8 comment='注释']
列类型
数值型
整型有无符号和有符号之分,但是浮点数没有
整型 tinyint(6) unsigned zerofill
0填充:
这里的6不代表他的范围占6位
6仅代表显示宽度是6位,不是真实范围
如真实数是1,tinyint(6)显示为 000001
如真实数是123456 他就直接显示真实的数,
浮点型:float: float(8, 2)
8表示这个浮点数共8位,2是小数点后有2位(小数点不算一位,小数点前有6位,后有两位)
定点型: decimal(m, n)和上面浮点型一样,m是位数,这个数的长度,n是小数点的位数
浮点型和定点型的区别就是,浮点型的精度会发生变化,定点型不会发生变化
例如:123465798.23 浮点型存进去小数点后的最后一位
就可能不是3了,可能是别的,但是定点型存什么就是什么,不会发生改变
浮点型的处理速度快,定点型的处理速度慢
字符串型: 常用的是下面这三个
char(n) n代表一个数字 n=[1-255]代表最大存255个字符
(存汉字就没有这么多了,utf8就只能存255/3个字)
varchar(n) n代表一个数字 n=[1-65535]个字符,可以存20000多中文字
特点:
char是定长字符串,varchar是可变长的字符串
char(8)这样写的话,系统会自动分配8位的长度,无论实际参数是几位,这个8位的位置都存在
用carchar(8)的话,实参给几个,他就占几位
还有,如果字符串的前年后面都有空格的话,前面的空格都会保存
但是char后面的空格会丢失,而varchar后面的空格会保存
因为char保存字符是写几位就给几位的空位,所以有可能会有空着没用的位置
所以,在取数的时候,是从第一位开始取,一直取到出现空位为止
所以一旦出现空格或后面还有字符串的情况,他就会丢失掉
如果给定的位数是8位,实际给的也是8位
这样全部占满的情况下,char实际就是8位,但是varchar会超出8位,因为,varchar存的字符串不会忽略空格
所以,就需要多用一两个字节来做一个标记,标记这个varchar存的字符到底有多长
text n 系统给定65535 text无默认值
除非不得已,一般不用text定义一个字符串,一般用前两个,
因为在mysql在低版本的时候,varchr范围也是255,所以才要text的大范围
日期时间 项目中时间多用整数代替,因为用整数好计算
时间戳: 设定好一个时间,例如1998.08.23 00.00 到现在这个之间的秒数就是时间戳
用整数记时间直接做减法就可以了
其他类型
修改表结构
alter table 表名 add 列 增加列
alter table 表名 drop 列 删除列
alter table 表名 change 修改列
数据
增
insert into 表名(列1, ...) values(值1,...);//列和值一一对应,这样写一次插入一条信息
insert into 表名(列1, ...) values(值1,...),(值1,...),(值1,...),(值1,...)...;这样写一次插入多条信息
改
update 表名 set 列1=值1,...[where 修改条件 ]
//最后一个值不写逗号,where必须写,不写整个表都被改掉了
//真实项目中where是必须要写的
$sql = "update student set sex=2";
$sql = "update student set name='李雷' where number='180402'";
此处如果不加where条件的话,sex这一列全部都会变成2
set后面的 列=值 是修改列,而where后面的条件是确定行
行列都有设置才能准确定位要改的具体信息
$sql = "update student set name='李雷' where number='180402'";
$result = mysqli_query($link, $sql) or die(mysqli_error($link));
//mysqli_query 对数据库执行一次查询 返回一个mysqli_result对象
//mysqli_result中有一个fetch_all方法,获取所有查到的值
//下面之所以要这样写,而不是成功输出成功,失败输出失败
//是因为前面的mysqli_query查询完成之后返回的,每次刷新都会返回
//无论有没有修改成功,只要刷新浏览器,就会返回操作成功
//因此,要用mysqli_affected_rows接收受影响的行数,如果受影响(修改过),
//就返回1,没有就返回0
//用它来判断操作成功之后是否修改过具体内容,这样做更精确一些
if($result){
if(mysqli_affected_rows($link) > 0){
echo '操作成功';
}else{
echo '操作成功,没有修改任何数据';
}
}else{
echo '操作失败';
}
mysqli::$affected_rows -- mysqli_affected_rows
获取之前mysql操作受影响的行数(就是获取之前修改过的行数)
删除
delete from 表名 [where 删除条件]删除条件必须写
$sql = "delete from student where number='180402'";
mysqli_result::fetch_all 将查询结果转为一个数组
mysqli_result::free mysqli_free_result释放资源
关系型数据库 表的三范式
1NF 一条记录要具有原子性,不可再分割(关系型数据库自动满足)
意思就是例如一个学生的所有信息,就只属于他,不可能他的信息还能分割成两个部分
2NF 一条记录要具有唯一性(加主键则可以满足 主键一般用id表示)
就是不能出现两个一模一样的记录
3NF 数据字段不能冗余
建表练习
有如下信息:
学号
姓名
年龄
性别
email
手机
简介
毕业薪水
入学日期
下面not null之所以不允许出现null这个数据类型,是因为在查值的时候,例如 a=null 或a != null 都查不出来数据,显示是空的,只有form student where a is null才能查出来
所以,项目中不允许出现null,所以要写not null
creat table student( //myisam插入数据的速度比engine快很多
id smallint unsigned primary key auto_increment //primary key主键 auto_increment自增长,只能给主键
number char(6) not null default '' unique comment='学号', //unique唯一
name varchar(30) not null default '',
age tinyint unsigned not null default 0,
sex tinyint not null default 0 conment='性别 1男2女0未知'
)myisam charset=utf8;
php使用mysqli的函数库来操作MYSQL数据库
步骤
1.连接数据库
2.选择库
3.设置编码 mysqli_set_charset
4.执行SQL语句(指令) 返回值是对象
5.处理上一步的结果
6.释放资源 mysqli_result::free mysqli_free_result释放资源
(如果第四步是查询语句,才需要释放
因为查询返回的是一个对象,查询得到的结果会在内存里,不释放的话,存多了占资源)
7.关闭连接 可有可无 // mysqli_close($link);php并不能立刻关闭连接
$link = @mysqli_connect('localhost', 'root', 'root', '180301') or die (mysqli_connect_error());
mysql_set_charset($link, 'utf8') or die(mysqli_error($link));//设置编码
$sql = "insert into student(number, name, sex, age) values ('180401', '张三', '1', '18')";
//1表示性别,用不用单引号都可以 用单引号可以存进字符串里,如果是varchar就必须是字符串
$sql = "update student set sex=2";//修改
$result = mysqli_query($link, $sql) or die(mysqli_error($link));//修改之后执行
if($result){//执行后输出
echo '操作成功';
}else{
echo '操作失败';
}
$sql = "select id, number, name, age, sex, student";
$result = mysqli_query($link, $sql) or die(mysqli_error($link));
$list = mysqli_fetch_all($result, MYSQLI_ASSOC);//mysqli_result::fetch_all 将查询结果转为一个数组
MYSQLI_ASSOC 关联下标,在写的时候,关联起来就不会乱
否则,列表项顺序 $sql 和下面输出的echo "<tr><td>...{$v['age']}</td><td>{$v['sex']}</td></tr>";}不一致就乱了
在下面输出信息的时候,也用number/name/age/sex等信息关联起来,因为他关联起来了,输出不会乱
获取一行数据 mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_row d都只能拿到一行数据
mysqli_free_result($result);//释放资源,这步必须要有 如果第四步是查询语句,才需要释放
mysqli_close($link);//关闭连接
while($row = mysqli_fetch_row($result)){//获取一行数据,赋值给$row
$list[] = $row;
}
//var_dump($list);
// if($result){
// echo '操作成功';
// }else{
// echo '操作失败';
// }
//最终这样显示
echo '<table width="600" border="1">';
echo '<tr><th>学号</th><th>姓名</th><th>年龄</th><th>性别</th></tr>';
foreach($list as $v){
echo "<tr><td>{$v['number']}</td><td>{$v['name']}</td><td>{$v['age']}</td><td>{$v['sex']}</td></tr>";
}
echo '</table>';
?>
删除
delete from 表名 [where 删除条件]删除条件必须写
$link = @mysqli_connect('localhost', 'root', 'root', '180301') or die(mysqli_connect_error());
mysqli_set_charset($link, 'utf8') or die(mysqli_error($link));
$sql = "delect from student where number='180401'";
//删除整行,不加where后面的条件会把所有数据全部删掉
//用delect删除数据,原来的索引还会保存,例如之前删掉两行数据
//再增加数据的话,索引就会是3,而不是从1开始
//因为id是自增长的
$result = mysqli_query($link, $sql) or die(mysqli_error($link));//mysqli_query 对数据库执行一次查询 返回一个mysqli_result对象,mysqli_result中有一个fetch_all方法,获取所有查到的值
if($result){
if(mysqli_affected_rows($link) > 0){
echo '操作成功';
}else{
echo '操作成功,没有修改任何数据';
}
}else{
echo '操作失败';
}
$sql = "select id, number, name, sex, age from student";
$result = mysqli_query($link, $sql) or die(mysqli_error($link));
$list = mysqli_fetch_all($result, MYSQLI_ASSOC);
//mysqli_fetch_all 获取数组的所有行,fetch的其他方法只能获取一行
//有三个默认值,这个是把下标变成关联下标, MYSQLI_NUM是默认值
//下标是索引下标,MYSQLI_BOTH. 是两个都保存
//要用关联下标,省的顺序乱了
mysqli_close($link);//关闭连接,可有可无,php关闭不了链接
echo '<table width="600" border="1">';
echo '<tr><th>ID</th><th>学号</th><th>姓名</th><th>年龄</th><th>性别</th></tr>';//这一行是输出的表头
foreach ($list as $v){
echo "<tr><td>{$v['id']}</td><td>{$v['number']}</td><td>{$v['name']}</td><td>{$v['age']}</td><td>{$v['sex']}</td></tr>";
//这一行是输出的内容,对应上面数据库查询的顺序
//上面用MYSQLI_ASSOC,这里就写关联下标,不易错。
//用其他的这里$v['0']就要写上对应的索引下标了
//一旦顺序写错,这里输出到浏览器的顺序也是错的
//用MYSQLI_ASSOC的话,只要查询的列表项和这里的关联下标是同一个词,不用管顺序是什么样,都会一一对应起来
//mysqli_fetch_all获取到的数组的下标就是表的字段名
}
echo '</table>';
代码:
<?php
/*
步骤
1.连接数据库
2.选择库
3.设置编码 mysqli_set_charset
4.执行SQL语句(指令) 返回值是对象
5.处理上一步的结果
6.释放资源 mysqli_result::free mysqli_free_result释放资源
(如果第四步是查询语句,才需要释放
因为查询返回的是一个对象,查询得到的结果会在内存里,不释放的话,存多了占资源)
7.关闭连接 可有可无 mysqli_close($link);php并不能立刻关闭连接
*/
$link = @mysqli_connect('localhost', 'root', 'root', '180301') or die(mysqli_connect_error());
mysqli_set_charset($link, 'utf8') or die(mysqli_error($link));
//$sql = "update student set sex=2";
$sql = "update student set name='李雷' where number='180402'";
//此处如果不加where条件的话,sex这一列全部都会变成2
//set后面的 列=值 是修改列,而where后面的条件是确定行
//行列都有设置才能准确定位要改的具体信息
//$sql = "insert into student(number, name, sex, age) values ('180401', '张三', '1', '18')";
//$sql = "select id, number, name, sex, age from student";
$result = mysqli_query($link, $sql) or die(mysqli_error($link));//mysqli_query 对数据库执行一次查询 返回一个mysqli_result对象,mysqli_result中有一个fetch_all方法,获取所有查到的值
if($result){
if(mysqli_affected_rows($link) > 0){
echo '操作成功';
}else{
echo '操作成功,没有修改任何数据';
}
}else{
echo '操作失败';
}
$sql = "select id, number, name, sex, age from student";
$result = mysqli_query($link, $sql) or die(mysqli_error($link));
$list = mysqli_fetch_all($result, MYSQLI_ASSOC);
//mysqli_fetch_all 获取数组的所有行,fetch的其他方法只能获取一行
//有三个默认值,这个是把下标变成关联下标, MYSQLI_NUM是默认值
//下标是索引下标,MYSQLI_BOTH. 是两个都保存
//要用关联下标,省的顺序乱了
mysqli_free_result($result);
//释放资源,只有前面是查询语句才需要释放
//因为插入等返回值是布尔值,而查询返回值是对象,所以要释放资源
//$result里查到的东西已经转到了$list里,$result就不需要了
mysqli_close($link);//关闭连接,可有可无,php关闭不了链接
// var_dump($result);
// if($result){
// echo '操作成功';
// }else{
// echo '操作失败';
// }
echo '<table width="600" border="1">';
echo '<tr><th>ID</th><th>学号</th><th>姓名</th><th>年龄</th><th>性别</th></tr>';//这一行是输出的表头
foreach ($list as $v){
echo "<tr><td>{$v['id']}</td><td>{$v['number']}</td><td>{$v['name']}</td><td>{$v['age']}</td><td>{$v['sex']}</td></tr>";
//这一行是输出的内容,对应上面数据库查询的顺序
//上面用MYSQLI_ASSOC,这里就写关联下标,不易错。
//用其他的这里$v['0']就要写上对应的索引下标了
//一旦顺序写错,这里输出到浏览器的顺序也是错的
//用MYSQLI_ASSOC的话,只要查询的列表项和这里的关联下标是同一个词,不用管顺序是什么样,都会一一对应起来
//mysqli_fetch_all获取到的数组的下标就是表的字段名
}
echo '</table>';
?>
网友评论