存档

‘Program&Database’ 分类的存档

PHP 和 Mysql 学习笔记(三)

2007年7月27日

1. mysql 定界符(反引号`)

当标示符是一个受限的词或包含特殊的字符时使用
select * from `select` where `select`.id >100;
create table orders(`my orders` varchar(100)...);

2. 数据库的大小写

linux下的数据库和表名的大小写是敏感的
其他的数据库对象不区分大小写

3. mysql 分组语句和嵌套子查询

员工表 emp( empno, name, tel, deptno, sal )
部门表 dept( deptno, dname, addr )

显示每个部门收入最高的职工信息
select * from emp
where sal in (
select max(sal)
from emp
group by deptno
);

4. mysql 查询排序 ( SQL Order By )

SELECT "栏位名"
FROM "表格名"
[WHERE "条件"]
ORDER BY "栏位名" [ASC, DESC]

ASC 代表结果会以由小往大的顺序列出,而 DESC 代表结果会以由大往小的顺序列出,默认值为 ASC。

我们可以照好几个不同的栏位来排顺序。在这个情况下, ORDER BY 子句的语法如下(假设有两个栏位):
ORDER BY "栏位一" [ASC, DESC], "栏位二" [ASC, DESC]
若我们对这两个栏位都选择由小往大的话,那这个子句就会造成结果是依据 "栏位一" 由小往大排。若有好几笔资料 "栏位一" 的值相等,那这几笔资料就依据 "栏位二" 由小往大排。

5. mysql limit 子句

数据表同3,查询薪水最低的5名员工。
select * from emp order by sal limit 0, 5;
返回值从第一行开始(第一行偏移量为0)可简写为:
select * from emp order by sal limit 5;
查询3-7号员工信息:
select * from emp limit 2, 5;
这里的 limit 子句是 mysql 特有的,是大多数其他的关系型数据库所没有的。

6. mysql 数据表关联

双表关联
数据表同3,查询某个部门的职工号,姓名:
select emp.empno, emp.name dept.dname
from emp, dept
where dept.name = '软件部'
and emp.deptno = dept.deptno;

多表关联
举例在线书店数据库
客户表 customers (customerid, name, address, city)
定单表 orders (orderid, customerid, amount, date)
书籍表 books (isbn, author, title, price)
订单与图书关联的表 book_items (orderid, isbn, quantity)
查询至少定购了一本关于 java 的书籍的顾客:
select customers.name
from customers, orders, order_items, books
where customers.customerid = order.customerid
and orders.orderid = order_items.orderid
and order_items.isbn = books.isbn
and books.title like '%java%';

在这里同样可以使用表的别名(alias),以上可改写为:
select c.name
from customers as c, orders as o, order_items as oi, books as b
where c.customerid = o.customerid
and o.orderid = oi.orderid
and oi.isbn = b.isbn
and b.title like '%java%';

查找不匹配行,这里查找没有订购任何商品的顾客:
select customers.customerid, customers.name
from customers left join orders
using (customerid)
where orders.orderid is null

这里使用了一个左关联将 customers 表和 orders 表关联起来,如果右边的表中没有匹配行就在结果中加一行,该行右边的列为 null,在这里关联条件所使用的语法一种是上面的 using,它并不需要指定连接属性所来自的表,所以要使用 using 子句,两个表中的列必须有同样的名称,另外还有一个关联条件的语法是 on,它需要指定连接属性所来自的表:
....
on customers.customerid = orders.customerid
....

A left join(左连接)包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。
同理,也存在着相同道理的 right join(右连接),即包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录。
而full join(全连接)顾名思义,左右表中所有记录都会选出来。

Program&Database , ,

PHP 和 Mysql 学习笔记(二)

2007年6月22日

1. 值参和变参
值参:
function swap($a, $b) {
$temp = $a;
$a = $b;
$b = $temp;
}
$x = 100;
$y = 1;
swap($x, $y);
echo "x = $x
y = $y";
?>

输出结果为:
x = 100
y = 1

这里 $x, $y 只是一个值的拷贝

变参:
function swap(&$a, &$b) {
$temp = $a;
$a = $b;
$b = $temp;
}
$x = 100;
$y = 1;
swap($x, $y);
echo "x = $x
y = $y";
?>

输出结果为:
x = 1
y = 100

2. 连接 mysql
格式: mysql -h主机地址 -u用户名 -p用户密码
mysql -uroot -p
mysql -h100.100.100.100 -uroot -p

-h -u和后面都没有空格
选定数据库mysql
use mysql;

3. mysql 指令
显示数据库列表
show databases;
显示数据库中的表
show tables;
显示数据表的结构
describe 表名
简写为
desc 表名

4. SQL(Structured Query Language,结构查询语言)

SQL功能强大,但是概括起来,它可以分成以下几组:

DML(Data Manipulation Language,数据操作语言):用于检索或者修改数据;

SELECT:用于检索数据;
INSERT:用于增加数据到数据库;
UPDATE:用于从数据库中修改现存的数据
DELETE:用于从数据库中删除数据。

DDL(Data Definition Language,数据定义语言): 用于定义数据的结构,比如 创建、修改或者删除数据库对象;

CREATE TABLE
ALTER TABLE
DROP TABLE
CREATE INDEX
DROP INDEX

DCL(Data Control Language,数据控制语言):用于定义数据库用户的权限。DCL命令用于创建关系用户访问以及授权的对象。下面是几个DCL命令:

ALTER PASSWORD
GRANT
REVOKE
CREATE SYNONYM

举例:
create database school; --建立数据库
drop database school; /* 删除数据库 */
drop database if exists school; #如果存在数据库school则删除

这里3种注释方式 "--","#"和"/* ... */"

统计记录数:
select count(*) from table;

Program&Database , , ,

PHP 和 Mysql 学习笔记(一)

2007年6月7日

1. 单引号串和双引号串
$a = 5;
$b = 10;
echo "a=$a\n";
echo 'b=$b';
?>

输出结果为:
a=5 b=$b
变量和转义字符要放到双引号里

2. 变量和函数的大小写区分
变量是严格区分大小写的
$a, $A 是不一样的
函数不区分大小写

3. 变量的变量
$a = "Hello";
$$a = "world"; //$Hello = "world"
echo "$a, $Hello\n"; //Hello, world
echo "$a, ${$a}\n"; //也是 Hello world
echo "$a, $$a"; //Hello, $Hello
?>

4. 赋值运算符
$a = 200;
$a += 10; //$a = $a + 10, 即 $a = 210
$a -= 10; //$a = $a - 10, 即 $a = 200
$a *= 10; //$a = $a * 10, 即 $a = 2000
$a /= 10; //$a = $a / 10, 即 $a = 200
$a %= 10; //$a = $a % 10, 即 $a = 0
$b = "哇";
$b .= "哈"; //$b = "哇哈";

5. 位运算符

& 与运算(And),相乘
| 或运算(Or),相加
~ 非运算(Not)
^ 异或(Xor),相同为0,不同为1
<< 向左移位(乘法)
>> 向右移位(除法)

6. 逻辑运算符

&& 而且(And)
And 而且(And)
|| 或者(Or)
Or 或者(Or)
Xor 异或(Xor)
! 不(Not)

7. 三元运算符(? :)
$score = 90;
echo $score>59 ? "及格" : "不及格";

输出为“及格”

Program&Database ,

WP-PageNavi 2.10 插件的BUG修正

2007年5月25日

这两天突然发现在搜索页和 tag 搜索页上的 pagenavi 不显示,
于是从网上搜到这个,我稍微修改了一下:
修改 pagenavi.php 内的 wp_pagenavi 函数
function wp_pagenavi($before=", $after=", $prelabel='«', $nxtlabel='»') {
global $request, $posts_per_page, $wpdb, $paged;
if (!is_single()) {
if (get_query_var('post_type') == 'post') {
preg_match('#FROM (.*)\s+(GROUP|ORDER) BY#', $request, $matches);
$fromwhere = $matches[1];//var_dump($request);
if(preg_match('#(.*)\s+(GROUP|ORDER) BY#',$fromwhere,$m2)) {
$fromwhere = $m2[1];
}
$numposts = $wpdb->get_var("SELECT COUNT(DISTINCT ID) FROM $fromwhere");
$max_page = ceil($numposts /$posts_per_page);
}
else {
$max_page = 999999;
}
if(empty($paged)) {
$paged = 1;
}

if($max_page > 1) {
echo "$before 页数 ($max_page): ";
if ($paged >= 4) {
echo '« 首页 ... ';
}
previous_posts_link($prelabel);
for($i = $paged - 2; $i <= $paged + 2; $i++) {
if ($i >= 1 && $i <= $max_page) {
if($i == $paged) {
echo "[$i]";
} else {
echo ' '.$i.' ';
}
}
}
next_posts_link($nxtlabel, $max_page);
if (($paged+2) < ($max_page)) {
echo ' ... 尾页 »';
}
echo "
$after";
}
}
}

Program&Database , ,

再谈Wordpress的MySQL乱码问题解决方法

2006年12月27日

在MySQL4.1下,中文的WP就会产生种种的乱码问题。

一个程序( PHP,CGI 等)与MySQL建立连接后,这个程序发送给MySQL的数据采用的是什么字符集,MySQL 是无从得知的。所以解决乱码问题的根本就是我们在程序中告诉MySQL采用的编码是什么,简单的就是在程序中加入这样的一个语句:

SET NAMES 'utf8';

这个语句的效果等同于同时设定了

SET character_set_client='utf8';
SET character_set_connection='utf8';
SET character_set_results='utf8';

为什么这么做?

我们安装MySQL4.1时按照默认配置,那么default-character-set= utf8。在MySQL Command Line Client下查看到的查看系统的字符集和排序方式的设定为:

阅读全文...

Program&Database , ,

Mysql4.1编码详解及WordPress编码完善

2006年7月3日

下面要写的是一篇非常无聊的东西,充斥了大量各式各样的编码、转换、客户端、服务器端、连接……呃,我自己都不愿意去看它,但想一想,写下来还是有点意义的,原因有四:

1. MySQL 4.1 对多语言的支持有了很大变化 (这导致了问题的出现);
2. 尽管大部分的地方 (包括个人使用和主机提供商),MySQL 3 仍然占主导地位;但 MySQL 4.1 是 MySQL 官方推荐的数据库,已经有主机提供商开始提供并将会越来越多;
3. 许多 PHP 程序以 MySQL 作为默认的数据库管理软件,但它们一般不区分 MySQL 4.1 与 4.1 以下版本的区别,笼统地称“MySQL 3.xx.xx 以上版本”就满足安装需求了;
4. 因为 latin1 在许多地方 (下边会详细描述具体是哪些地方) 作为默认的字符集,成功的蒙蔽了许多 PHP 程序的开发者和用户,掩盖了在中文等语言环境下会出现的问题;

简单的说,MySQL 自身的变化和使用 MySQL 的 PHP 程序对此忽略,导致了问题的出现和复杂化,而由于大部分用户使用的是英文,使这种问题不被重视。这里提到的 PHP 程序,主要就 WordPress 而言。
MySQL 4.1 字符集支持的原理

MySQL 4.1 对于字符集的指定可以细化到一台机器上安装的 MySQL,其中的一个数据库,其中的一张表,其中的一栏,应该用什么字符集。但是,传统的 Web 程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置,那么,默认的配置从何而来呢?

1. 编译 MySQL 时,指定了一个默认的字符集,这个字符集是 latin1;
2. 安装 MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;
3. 启动 mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的;
4. 此时 character_set_server 被设定为这个默认的字符集;
5. 当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为 character_set_server;
6. 当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;
7. 在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;
8. 当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;
9. 这个字符集就是数据库中实际存储数据采用的字符集,mysqldump 出来的内容就是这个字符集下的;

简单的总结一下,如果什么地方都不修改,那么所有的数据库的所有表的所有栏位的都用 latin1 存储,不过我们如果安装 MySQL,一般都会选择多语言支持,也就是说,安装程序会自动在配置文件中把 default_character_set 设置为 UTF-8,这保证了缺省情况下,所有的数据库的所有表的所有栏位的都用 UTF-8 存储。

阅读全文...

Program&Database , ,