MySQL PHP二

MySQL排序

使用order by子句将查询的数据排序后再返回数据:

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
*你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
*你可以设定多个字段来排序。
*你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升排列。
*你可以添加 WHERE...LIKE 子句来设置条件。
升序排列
select * form test order by author ASC;
降序排列
select * form test order by author DESC;

PHP脚本:

<?php
$sql = 'SELECT w3cschool_id, w3cschool_title,
               w3cschool_author, submission_date
        FROM w3cschool_tbl
        ORDER BY  w3cschool_author DESC';

mysql_select_db('W3CSCHOOL');
$retval = mysql_query( $sql, $conn );
if(! $retval )
{
  die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC))
{
    echo "Tutorial ID :{$row['w3cschool_id']}  <br> ".
         "Title: {$row['w3cschool_title']} <br> ".
         "Author: {$row['w3cschool_author']} <br> ".
         "Submission Date : {$row['submission_date']} <br> ".
         "--------------------------------<br>";
} 
echo "Fetched data successfully\n";
mysql_close($conn);
?>

MYSQL分组

group by 语句根据一个或多个结果集进行分组

在分组的列上我们可以使用COUNT,SUM,AVG等函数 语法

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
select name,count(*) from employee group by name;

使用with rollup with rollup 可以在实现分组的统计数据基础上再进行相同的统计(SUM,AVG,COUNT)

select name,sum(singin) as singin_count from employee group by name with rollup;

SELECT coalesce(name, ‘总数’), SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;

MySQL连接的使用

JOIN 按照功能大致分为如下三类:

INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。

LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。

RIGHT JOIN(右连接): 与 LEFT JOIN

相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

select a.id,a.author,a.count from testa a inner join testb b on a.author=b.author;
等价于
select a.id,a.author,b.count from testa a,testb b where a.author=b.author;
MySQL LEFT JOIN
MySQL left join 与 join 有所不同。 MySQL LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据
select a.id,a.author,b.count from testa a,left join testb b on a.author=b.author;

以上实例中使用了LEFT JOIN,该语句会读取左边的数据表w3cschool_tbl的所有选取的字段数据,即便在右侧表tcount_tbl中没有对应的w3cschool_author字段值

MySQL RIGHT JOIN 会读取右边数据表的全部数据,即便左边边表无对应数据

select b.id,b.author,a.count from testa a,right join testb b on a.author=b.author;

以上实例中使用了 RIGHT JOIN,该语句会读取右边的数据表 w3cschool_tbl 的所有选取的字段数据,即便在左侧表tcount_tbl中没有对应的w3cschool_author字段值 在PHP脚本中使用JOIN。

<?php
$sql = 'SELECT a.w3cschool_id, a.w3cschool_author, b.w3cschool_count FROM w3cschool_tbl a INNER JOIN tcount_tbl b ON a.w3cschool_author = b.w3cschool_author';

mysql_select_db('W3CSCHOOL');
$retval = mysql_query( $sql, $conn );
if(! $retval )
{
  die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC))
{
    echo "Author:{$row['w3cschool_author']}  <br> ".
         "Count: {$row['w3cschool_count']} <br> ".
         "Tutorial ID: {$row['w3cschool_id']} <br> ".
         "--------------------------------<br>";
} 
echo "Fetched data successfully\n";
mysql_close($conn);
?>

MYSQL NULL值处理

MySQL使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。

为处理这种情况,MYSQL提供了三大运算符:

*IS NULL :当列的值是NULL,此运算符返回true

*IS NOT NULL :当列的值不为NULL时返回true

*<=> 比较操作符,当比较的两个值为NULL时返回true

NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 在MySQL中,NULL值与任何其它值的比较(即使是NULL)永远返回false,即 NULL = NULL 返回false 。

MySQL中处理NULL使用IS NULL和IS NOT NULL运算符

命令提示符中使用NULL值

select * from testb where count=null;

select * from testb where count!=null;

以上两个是不起作用的,必须使用IS NULL IS NOT NULL

select * from testb where count is null;

select * from testb where count is not null;

<?php
if(isset($count)){//php isset()函数一般用于检测变量是否设置
$sql='select author,count from testb where count=$count';
}
else{
$sql='select author,count from testb where count is $count';
}
mysql_select_db('lq');
$retval =mysql_query($sql,$conn);
if(!$retval){
die('could not get data':mysql_error());
}
while($row=mysql_fetch_array($retval,MYSQL_ASSOC)){
echo "Author:{$row['w3cschool_author']}  <br> ".
         "Count: {$row['w3cschool_count']} <br> ".
         "--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>

MYSQL 正则表达式

MySQL同样也支持其他正则表达式的匹配,MySQL中使用REGEXP操作符来进行 正则表达式匹配

查找name字段中以'st'为开头的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';
查找name字段中以'ok'为结尾的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
查找name字段中包含'mar'字符串的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';
查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

MySQL事务

MySQL事务主要用于处理操作量打,复杂度高的数据,比如在人员管理 系统中,删除一个人员,需要删除该人员的基本资料,也要删除饥饿该人员 相关的信息,比如信箱,文章等,这些数据库操作语句就构成了一个事务:

*在MySQL中只有使用了Innodb数据库引擎的数据库或表才能支持事务

*事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行, 要么全部不执行

*事务用来管理Insert,update,delete语句

一般来说,事务必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性):

*事务的原子性:一组事务,要么成功,还么撤回

*稳定性:有非法的数据(外键约束之类),事务撤回

*隔离性:事务独立运行,一个事务处理后的结果,影响了其他事务,那么其他事务 会撤回,事务的100%隔离。需要牺牲速度

*可靠性:软,硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改,可靠性和高速度 不可兼得。innodb_flush_log_at_trx_commit选项决定什么时候把事务保存在日志里

在MySQL控制台使用事务来操作

1.开始一个事务 start transaction

2.做保存点 savepoint 保存点名称

3.操作

4.可以回滚,可以提交,没有问题,就提交,有问题,就回滚、 PHP中使用事务的实例

<?php
$handler=mysql_connect('localhost','root','password');
mysql_select_db("task");
mysql_query('set autocommit=0');//设置为不自动提交,因为MYSQL默认立即执行
mysql_query('begin');//开始事务定义
if(!mysql_query("insert into trans (id) values('2')"))
{
mysql_query('rollback');//判断当执行失败时回滚
}
if(!mysql_query("insert into trans (id) values('4')"))
{
mysql_query('rollback');//判断执行失败回滚
}
mysql_query('commit');//执行事务
mysql_close($handler);
?>

MYSQL ALTER命令

当我们需要修改数据表名或者修改数据表字段时,就需要使用到MYSQL ALTER命令

使用ALTER命令以及DROP子句来删除表

ALTER TABLE testb DROP i;

如果数据表只剩一个字段则无法使用DROP来删除字段

添加字段

ALTER TABLE testc ADD i INT;

执行命令后,i字段会自动添加到数据表字段的末尾

新增字段制定位置

ALTER TABLE testalter_tbl DROP i;

ALTER TABLE testalter_tbl ADD i INT FIRST;

ALTER TABLE testalter_tbl DROP i;

ALTER TABLE testalter_tbl ADD i INT AFTER c;

FIRST 和 AFTER 关键字只占用于 ADD 子句,所以如果你想重置数据表字段的位置就需要先使用 DROP 删除字段然后使用 ADD 来添加字段并设置位置

修改字段类型及名称

如果需要修改字段类型及名称, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。

例如,把字段 c 的类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令:

ALTER TABLE testalter_tbl MODIFY c CHAR(10);

CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段的类型及名称

ALTER TABLE testalter_tbl CHANGE i j BIGINT;

想把字段 j 从 BIGINT 修改为 INT,SQL语句如下:

ALTER TABLE testalter_tbl CHANGE j j INT;

指定默认值

ALTER TABLE testc modify j bigint not null default 100;
ALTER TABLE testc alter i set default 1000;
alert table testc alter i drop default;

修改数据表类型,可以使用alter命令和type子句来完成

alert table testc type=MYISAM;
show table status like 'testc'\G;//表示在整个字符串中搜索

修改表名 alter table testc rename to tesctd;

MYSQL索引 索引可以大大提高MYSQL的检索速度

过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

建立索引会占用磁盘空间的索引文件。

创建索引 create index indename on mytable (username(length));

修改表结构

alter mytable add index [indexname] on (username(length));
创建表的时候直接指定
create  table mytable(
id int not null,
username varchar(16) not null,
INDEX  [indexName] (username(length))
);

删除索引的语法

drop index [indexname] on mytable;

唯一索引 索引列的值必须唯一,但允许有空值,如果是组合索引,则列值组合必须唯一 创建索引

CREATE UNIQUE INDEX indexName ON mytable(username(length)) 修改表结构

ALTER mytable ADD UNIQUE [indexName] ON (username(length)) 创建表的时候直接指定

CREATE TABLE mytable(  
 
ID INT NOT NULL,   
 
username VARCHAR(16) NOT NULL,  
 
UNIQUE [indexName] (username(length))  
 
); 

使用ALTER 命令添加和删除索引

有四种方式来添加数据表的索引:

ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。

ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。

ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。

ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。

添加索引。
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
删除索引:
mysql> ALTER TABLE testalter_tbl DROP INDEX (c);

使用 ALTER 命令添加和删除主键

主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)

ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
 ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
ALTER 命令删除主键:
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;

删除指定时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。

显示索引信息,你可以使用 SHOW INDEX 命令来列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息。

SHOW INDEX FROM table_name\G

MySQL复制表

完整的复制MySQL数据表的步骤如下:

*使用SHOW CREATE TABLE 命令获取创建数据表(CREATE TABLE)语句, 该语句包含了原数据表的结构,索引等。

*复制一下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上 命令将完全的复制数据表结构

*如果想复制表内容,可以使用INSERT INTO …SELECT语句来实现

1.获取数据表的完整结构。

SHOW CREATE TABLE w3cschool_tbl \G;

2.修改SQL语句的数据表名,并执行SQL语句。

CREATE TABLE `clone_tbl` (
  -> `w3cschool_id` int(11) NOT NULL auto_increment,
  -> `w3cschool_title` varchar(100) NOT NULL default '',
  -> `w3cschool_author` varchar(40) NOT NULL default '',
  -> `submission_date` date default NULL,
  -> PRIMARY KEY  (`w3cschool_id`),
  -> UNIQUE KEY `AUTHOR_INDEX` (`w3cschool_author`)
-> ) ENGINE=InnoDB;

3.执行完第二步骤后,你将在数据库中创建新的克隆表 clone_tbl。

如果你想拷贝数据表的数据你可以使用 INSERT INTO… SELECT 语句来实现。

INSERT INTO clone_tbl (w3cschool_id,
    ->                        w3cschool_title,
    ->                        w3cschool_author,
    ->                        submission_date)
    -> SELECT w3cschool_id,w3cschool_title,
    ->        w3cschool_author,submission_date
    -> FROM w3cschool_tbl;