php学习--操作mysql及mysql基础知识

PHP连接MYSQL数据库
MYSQL数据库知识
show tables:查看数据库中表的清单--------------------------------------------------------------------------------
show databases:查看数据库系统中所有数据库的清单--------------------------------------------------------------------------------
describe 表名称:查看数据库表的相信信息--------------------------------------------------------------------------------
创建索引
create [unique|fulltext] index index_name
on table_name (index_column_name[(length)][asc|desc],...)
Length:允许指定该字段前length个字符将被索引
asc|desc:指定升序或者降序,默认升序
--------------------------------------------------------------------------------
整形数据类型([]里面的占用的字节数)
tinyint[1],bit[1],bool[1],smallint[2],mediumint[3],int[4],integer[4],bigint[8]
--------------------------------------------------------------------------------
浮点类型
float,double,double,real,decimal,numeric,dec,fixed
--------------------------------------------------------------------------------
日期和时间类型
date,time,datetime,timestamp[M],year[2|4]
timestamp中M的值及显示的格式
类型 显示 类型 显示
timestamp YYYYMMDDHHMMSS timestamp(8) YYYYMMDD
timestamp(14) YYYYMMDDHHMMSS timestamp(6) YYMMDD
timestamp(12) YYMMDDHHMMSS timestamp(4) YYMM
timestamp(10) YYMMDDHHMM timestamp(2) YY
--------------------------------------------------------------------------------
字符串
char,varchar,text,blog
其中text和blog适合存储适合长文本或者二进制数据,只是text区分大小写而blog不区分
【可以通过关键字binary指定为区分大小写匹配,要不比较时是不区分大小写的。
例如:select 'a'='A' ===》返回值为1(true)
select 'a'=binary 'A',返回值为0(false)】
--------------------------------------------------------------------------------
特殊类型
set:指定列中的值必须来自一个特定集合中的指定值。列值可以包含来自该集合的过个值。在指定的集合中,最大可以有64个元素。
enum:就是枚举。与vset类型非常类似,但是该类型的列可以只有一个指定集合中的值或者null,最大可以有65535个元素。
enum('v1','v2',...) 65535 该类型的列可以容纳所列值之一或者为null
set('v1','v2',....) 64 该类型的列可以容纳一组或者为null
--------------------------------------------------------------------------------

DML介绍
insert可以一次插入多条数据,如果insert into talbes(name) values('1'),('2'),('3')
insert语句后面,可以添加LOW_PRIORITY或DELAYED关键字。LOW_PRIORITY意味著当数据不是从表格独处时,系统必须等待并且稍后再插入。
delayed意味著插入的数据将被缓存。如果服务器繁忙,我们可以继续运行其他插入,而不是等待这个insert操作的完成。
上面两个关键字后面可以指定ignore,如果尝试插入任何可能导致重复唯一键的记录行,这些记录将被自动忽略。另一种办法是在insert
语句的末尾指定on duplicate key update expression,这可以使用一个常规的update语句修改重复值。

+展开
-SQL
select [options] items [into file_details]
from tables
[where condition] [group by group_type] [having where_condition] [order by order_type]
[limit limit_criteria] [procedure proc_name(arguments)] [lock_option]


在where条件中与标准sql没什么区别,主要介绍mysql的正则比较regexp
使用方法:field regexp pattern
EG:
select 'abc' regexp '^a[a-z]+' ==>1(true)
select 'abc' regexp '^ab$' ==>0(false)

注意正则中指定的字母也是不区分大小写的,要想区分必须加上binary
select 'abc' regexp '^a[A-Z]+' ==>1(true)
select 'abc' regexp binary '^a[a-z]+' ==>0(false)


合计函数
名称 描述
avg(列) 指定列的平均值
count(项目) 为列,给出本列中非空(null)的行数。count(*)将得到所有行数,包括空行
min(列) 指定列的最小值
max(列) 指定列的最大值
std(列)/stddev(列) 指定列的标志背离值
sum(列) 指定列的所有值的和

limit [起始行号,]返回行数 ==>注意行号是从0开始的第一个参数可以省略。
limit 1,2 ==》从记录集中返回2行,从第2行开始
limit 2 ==》从记录集中返回头2行

子查询和操作符(有5种,下面列出4中,最后一个exists单独介绍)
名称 示例语句 描述
any select c1 from t1 where c1>any (select c1 from t2) 如果子查询中的任何行比较条件为true,返回true
in select c1 from t1 where c1 in (select c1 from t2) 等价于=any
some select c1 from t1 where c1>some (select c1 from t2) any的别名,有时更容易阅读
all select c1 from t1 where c1>all (select c1 from t2) 如果子查询中的所有行比较条件为true,返回true

关联子查询,可以在内部查询中使用外部查询的结果
select isbn,title from books where not exists
(select * from order_items where order_items.isbn=books.isbn)
上面语句检索任何没有被订购的图书。
如果子查询中存在任何匹配行,exists返回true。否则,如果子查询中没有任何匹配行,not exists将返回true

行子查询,返回整行,它可以与外部查询的整行进行比较。
select c1,c2,c3 from t1 where (c1,c2,c3) in(select c1,c2,c3 from t2)



update [low_priority] [ignore] tablename
set column1=exp1,column2=exp2,...
[where condition] [order by order_criteria] [limit number]
order by通常只在limit子句的连接中使用。如果值更新前10行,可以将它们放在前面的位置。
limit:限制受影响的总行数。low_priority和ignore与insert语句一样工作。

delete [low_priority][quick] [ignore] from tablename
[where condition] [order by order_criteria] [limit number]
quick可以使得对myisam表的操作执行得更快。其他意思和update一样


show...from...获取信息
show tables;
show databases;
show tables from dbname;
show columns from tbname from dbname; < == >show columns from dbname.tbname
show grants for 用户名:查看该用户所拥有的权限


备份和还原
备份:mysqldump --opt --all-databases > all.sql【操作系统的命令行下使用】

更改语句结束分隔符号,默认为分号(;)
delimiter // ==>将语句分隔符号改为//
delimiter ; ==>将语句分隔符号改为;


存储过程,函数和游标
存储过程EG
========================================================
+展开
-SQL
delimiter //
create procedure total_orders(out total float)
begin
  select sum(amout) into total from orders;
end
//
delimiter ;

========================================================
参数类型可以为in【输入】,out【输出】,inout【输入和输出】


函数EG
EG1========================================================
+展开
-SQL
delimiter //
create function add_tax(price floatreturns float
return price*1.1
//

delimiter ;
EG2========================================================
delimiter //
create function add_tax(price floatreturns float
begin
  declare tax float default 0.10;
  return price*(1+tax)
end
//

delimiter ;

====================参数不需要in或者out指定====================================
游标EG
========================================================
+展开
-SQL
delimiter //
create procedure largest_order(out largest_id int)
begin
  declare this_id int;
  declare this_amount float;
  declare l_amount float default 0.0;
  declare l_id int;
  
  declare done int default 0;
  --下面这句申明一个句柄,类似于存储过程中的一个异常,就目前为止,可以实现continue和exit句柄
  --sqlstate '02000' 意味着无法再找到记录行后被调用
  declare continue handler for sqlstate '02000' set done=1;
  declare cl cursor for select orderid,amout from orders;
  
  open cl;
  repeat
    fetch cl into this_id,this_amount;
    if not done then
      if this_amount>l_amount then
        set l_amount=this_amout;
        set l_id=this_id;
      end if;
    end if;
  until done end repeat;
  close cl;
  
  set largest_id=l_id;
end
//
delimiter ;

========================================================



PHP结合MySQL
连接mysql服务器
@$cn=new mysqli('localhost','username','password','database');//面向对象方法
或者
@$cn=mysqli_connect('localhost','username','password','database');//面向过程的方法
mysqli的大多数函数都有面向对象接口和过程接口。通常,两者的差异在于过程版本的函数名称是以mysqli_开始,同时要求传入通过mysqli_connect()函数获得的资源句柄。对这个规则来说,数据库连接是一个异常,一位它是由mysqli对象的构造函数来创建的。

检查是否成功连接数据库
mysqli_connect_errno():发生错误将返回一个错误号码,否则返回0表示成功连接
mysqli_connect_error():返回错误信息

选择数据库
$cn->select_db(dbname);或者 mysqli_select_db($cn,db_name);

查询数据库
$result=$cn->query($sql);或者 mysqli_query($cn,$sql);

获取行数
$num_result=$result->num_rows; < == > $num_result=mysqli_num_rows($result);

检索查询结果
+展开
-PHP
for($i=0;$i<$num_result;$i++){
$row=$result->fetch_assoc();//$row=mysqli_fetch_assoc($result);
//该函数接受结果集合中每一行并以一个关联数组返回该行
echo $row['列名'];
/*
//使用下面的方法将结果取回到一个索引数组中
$row=$result->fetch_row();//$row=mysqli_fetch_row($result);
echo $row[0];//[]中的数字为该列在结果集中的索引位置

//使用下面的方法将结果取回到一个索引数组/关联数组【根据returnType决定】中
        //如果未传递returnType则返回索引数组
        //如果传递FETCH_ASSOC则返回关联数组
        //如果传递rFETCH_BOTH则返回索引和关联数组,同asp的游标
$row=$result->fetch_array([int returnType]);//$row=mysqli_fetch_row($result);
echo $row[0];//[]中的数字为该列在结果集中的索引位置

//返回一个对象
$row=$result->fetch_object();//$row=mysqli_fetch_object($result);
echo $row->列名;//如: echo $row->title;
*/

}


释放资源
$result->free(); < == > mysqli_free_result($result);//释放结果集合
$cn->close(); < == > mysqli_close($db);


使用prepare语句。它们对于在执行大量具有不同数据的相同查询时,可以提供执行速度。
EG
$sql="insert into books values(?,?,?,?)";
$stmt=$cn->prepare($sql);//对应 mysqli_stmt_prepare
$stmt->bind_param("sssd",$isbn,$author,$title,$price);//对应 mysqli_stmt_bind_param
$stmt->execute();
echo $stmt->affected_rows.' book inserted into database';
$stmt->close();

bind_param:第一个参数是一个格式化字符串【s:字符串 d:双精度 i:整数 b:blob】,
后面列出与语句中的问号数量相同的变量。

*也可以绑定结果。对于select查询,使用$stmt->bind_result()【mysqli_stmt_bind_result()】,每次调用$stmt->fetch()【mysqli_stmt_fetch()】

加支付宝好友偷能量挖...


原创文章,转载请注明出处:php学习--操作mysql及mysql基础知识

评论(0)Web开发网
阅读(143)喜欢(1)PHP/apache/Perl