group by[col1,col2,col3]
将查询出来的数据根据col进行分组,简单理解就是将col1,col2,col3这三列数据相同的记录合成一条,col1,col2,col3因为是一样的很轻松就能合成一条并展示,那其他尾部的记录就可能每条都不一样无法合成,默认是取第一条的记录,或者可以用聚合函数处理3条不同的尾巴,比如求和,求平均然后在展示处理,如下:
order by[col1,col2,col3]
order by也可以多个字段进行,先col1,排好以后,如果有相同的col1,再根据col2进行排序,同理col3,col也可以简化成1,2,3这种形式,对应select的第一个,第二个,第三个字段。
case….when….else….end
用于加工查询出来的语句,将某一个字段的值进行修改加工
SELECT stud_id, sex=CASE gender
WHEN’男’ THEN ’M’
WHEN’女’ THEN ’F’
ELSE ‘F&M’
END
FROM stud_info
select * from (select[col] from t) aliasname
可以通过select查询构建一个临时表,表的字段就是select出来的col,注意后面必须加上这个临时表的名字。
on duplicate key update
这个语句主要用在insert语句后面,当insert数据的时候发生唯一索引或者主键冲突的时候,就会对被冲突的那条原数据进行update操作,具体update什么就看你需要了。当然如果没有发生冲突,新数据就直接insert了。
group_concat & concat
concat(str1,str2,str3),如selectconcat(name,sex,age) as info from t1 where id = 1。应该返回info->jamehollman18,注意没有分割符号的,如果str中只要有一个为空,那么返回就会为空。
group_concat(col1,col2,col3),顾名思义,是在进行groupby时使用的,也是一个聚合函数,可以将之前说的冲突尾巴合成一个新建字段,并且字段之间自动会以”,”分割开。
(?=pattern) &(?<=pattern)
这两个在正则上很重要!两者都是非捕获分组,与(?:pattern)性质一样,列如正则为/zhanhong,(?=hello)/,一个字符串为zhanhong,loveyou,因为zhanhong后面不是hello,所以zhanhong这个字符串不会匹配出来,相应zhanhong,hello就行,注意hello是不会匹配出来的,只是匹配(?=pattern)前面的字符,这个就叫正向预处理。(?!pattern)就与(?=pattern)相反
第二个是反向的预处理,放在zhanhong前面/(?<=hello),zhanhong/,会匹配hello,zhanhong中的zhanhong,不会匹配其他的,相应的,还有/(?<!hello),zhanhong/。
(?:)是不会单独匹配,但是整个一起的时候它会参与被匹配展示,(?=)这一类更像是修饰作用,从来不会匹配到并展示出来
php建表等操作
alter table tableaname change colname [datatype][null|not null] [default] , add [primary key(col) | indexindexname(col1,col2,col3) | unique indexname(col1,col2,col3)]
insert table cloname[datatype] [null|not null] [default] , add [primarykey(col) | index indexname(col1,col2,col3) | unique indexname(col1,col2,col3)]
creat table tablename (colname [datatype][null|not null] [default] , add [primary key(col) | indexindexname(col1,col2,col3) | unique indexname(col1,col2,col3)]
)
PDO类
代表 PHP 和数据库服务之间的一个连接,创建方式如下:new PDO($dsn, $user, $password);
最常用的就是他的事务处理beginTransaction,PDO::commit ,PDO::rollBack
这几个都是pdo类的静态函数。还有几个常用的函数:
- PDO::errorCode — 获取跟数据库句柄上一次操作相关的 SQLSTATE
- PDO::inTransaction — 检查是否在一个事务内
- PDO::lastInsertId — 返回最后插入行的ID或序列值
这里着重讲下面几个:
PDO::exec $obj->exec($sql);
这个函数用于执行一条$sql语句,注意他只返回受影响的记录条数。所以select这种操作就只会返回0,所以尽量不要用返回值判断是否执行成功。
PDO::query
这个函数执行一条sql语句,然后将结果集作为一个PDOstatement对象返回,打印的时候PDO对象只有一个queryString属性,内容是这条sql语句,但是遍历输出时却能打印出查询出来的数据,这里有一点疑惑。注意query出来的数据需要读完以后才能再使用query语句,如果不想读完,可以对PDOstatement使用PDOStatement::closeCursor() 函数。
PDO::prepare
函数作用是预编译一条sql语句,返回PDOstatement对象,这一条sql语句可以使用参数绑定,也就是将值使用“?”或者“:varname_diy”代替,一条sql语句中只能选择其中一种样式来绑定。另外fetch等操作和execute操作都是PDOstatement的函数。
PDOstatement类
PDOstatement实例有两种来源,一个是PDO::query返回以及PDO::prepare返回。
PDOstatement::bindColumn
将查询出来的数据字段分别复制给自己的变量,绑定需要在execute以后才能成功,绑定的时候有两种方式,一种是通过字段号,一种是根据字段名:
$sql = ‘SELECT name, colour, calories FROM fruit’;
$stmt = $dbh->prepare($sql);
$stmt->execute();
$stmt->bindColumn(1, $name);
$stmt->bindColumn(2, $colour);
$stmt->bindColumn('calories', $cals);
然后用fetch获取数据的时候就可以用自己的变量来输出了
while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {
$data = $name . "\t" . $colour . "\t" . $cals . "\n";
print $data;
}
PDOstatement::bindParam
用于绑定参数,如果占位符是“:varname”,那么第一个参数应该也是它,如果是“?”那么第一个参数是以1开始的序号:
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(1, $calories, PDO::PARAM_INT);
注意这个函数第二个参数只能是一个变量,而不能是一个具体的值,bindValue就可以是值。第三个参数指定变量的类型,比如PDO::PARAM_STR等等。
PDOstatement::bindValue
与上面类似,只是可以绑定具体的值,
PDOstatement::closeCursor
上面已经提过,就是释放到数据库服务的连接,即时有未读完的数据仍然可以继续下一个查询。
PDOstatement::execute bool PDOStatement::execute ([ array $input_parameters ] )
执行编译过后的sql语句,也就是PDOstatement对象,除此之外,他也可以解决参数绑定的问题,不需要使用bindcolumn或者bindvalue,原因就是$input_parameters这个变量,对应的列子如下:
$sth->execute(array(':calories' => $calories, ':colour' => $colour));
$sth->execute(array($calories, $colour));
sql中含有IN操作的解决办法
<?php
/* 使用一个数组的值执行一条含有 IN 子句的预处理语句 */
$params = array(1, 21, 63, 171);
/* 创建一个填充了和params相同数量占位符的字符串 */
$place_holders = implode(',', array_fill(0, count($params), '?'));
/*
对于 $params 数组中的每个值,要预处理的语句包含足够的未命名占位符 。
语句被执行时, $params 数组中的值被绑定到预处理语句中的占位符。
这和使用 PDOStatement::bindParam() 不一样,因为它需要一个引用变量。
PDOStatement::execute() 仅作为通过值绑定的替代。
*/
$sth = $dbh->prepare("SELECT id, name FROM contacts WHERE id IN ($place_holders)");
$sth->execute($params);
?>
PDOstatement::fetch
PDOStatement::fetch ([ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT[, int $cursor_offset = 0 ]]])
从一个 PDOStatement 对象相关的结果集中获取下一行。fetch_style 参数决定 POD 如何返回行。fetch_style默认是PDO::FETCH_BOTH,也就是不管以字段名返回,还要以序号返回,所以数组大了一倍。PDO::FETCH_ASSOC就是以字段返回的数组,更多类型看手册。PDO::FETCH_BOUND:返回 TRUE ,并分配结果集中的列值给 PDOStatement::bindColumn() 方法绑定的 PHP 变量。
PDOstatement::fetchAll
返回一个包含结果集中所有行的数组
想要返回一个包含结果集中单独一列所有值的数组,需要指定 PDO::FETCH_COLUMN 。通过指定 column-index 参数获取想要的列。
PDOstatement::fetchColumn
PDOStatement::fetchColumn ([ int $column_number = 0 ])
从结果集中下一行单独返回一个列的数据。
你想从行里取回的列的索引数字(以0开始的索引)。如果没有提供值,则 PDOStatement::fetchColumn() 获取第一列。
如果使用 PDOStatement::fetchColumn() 取回数据,则没有办法返回同一行的另外一列。
其他重要函数
- PDOStatement::columnCount — 返回结果集中的列数
- PDOStatement::debugDumpParams — 打印一条 SQL 预处理命令
- PDOStatement::nextRowset — 在一个多行集语句句柄中推进到下一个行集
- PDOStatement::rowCount — 返回受上一个 SQL 语句影响的行数
特殊例子
<?php
/* 使用 INOUT 参数调用一个存储过程 */
$colour = 'red';
$sth = $dbh->prepare('CALL puree_fruit(?)');
$sth->bindParam(1, $colour, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 12);
$sth->execute();
print("After pureeing fruit, the colour is: $colour");
?>
更多预定义常量查看手册,至少熟悉常用的几个!!!