php连表查询 mysql_php连表查询以及thinkphp连表查询

本文详细介绍了PHP中实现多表联接查询的方法,包括内部联接、左联接、右联接和完全联接,并提供了SQL查询语句的格式示例。此外,还讲解了如何在ThinkPHP框架中进行连表查询,通过实例展示了链式操作的使用,以提升数据查询的效率和代码可读性。
摘要由CSDN通过智能技术生成

php连表查询

多表的联接查询

联接查询是指涉及两个或两个以上的表的查询,联接查询是关系数据库最主要的查询。

实现方法:

1) 用WHERE子句实现多表间的联接查询

2) 指定联接类型实现多表间的联接查询

3) 使用嵌套查询实现多表间的联接查询

内部联接(INNER JOIN):只有满足条件的记录才显示;

左联接(LEFT JOIN) :满足条件的记录+左边不满足条件的都显示;

右联接(RIGHT JOIN):满足条件的记录+右边不满足条件的都显示;

完全联接(FULL JOIN) :满足条件的记录+左、右边不满足条件的都显示;

SQL_SELECT语句的常用格式

SELECT [ ALL/DISTINCT]

FROM

[[INNER/LEFT[OUTER]/[RIGHT[OUTER]/FULL[OUTER]JOIN

[][ON 联接条件] ]…]

[INTO ]|[TO | TO printer| TO screen]

[WHERE [ AND / OR 条件表达式 ]…]

[GROUP BY[, …] [HAVING条件表达式]]

[ORDER BY [ASC/DESC] [,…][ASC/DESC]]

向数据库表插入数据

INSERT INTO 语句用于向数据库表添加新记录。

语法

INSERT INTO table_name

VALUES (value1, value2,....)

您还可以规定希望在其中插入数据的列:

INSERT INTO table_name (column1, column2,...)

VALUES (value1, value2,....)

注释:SQL 语句对大小写不敏感。INSERT INTO 与 insert into 相同。

为了让 PHP 执行该语句,我们必须使用 mysql_query() 函数。该函数用于向 MySQL 连接发送查询或命令。

4、删除重复行

Select语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。使用DISTINCT选项时,对于所有重复的数据行在Select返回的结果集合中只保留一行。

5、限制返回的行数

使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。例如:

Select TOP 2 *FROM testtable Select TOP 20 PERCENT * FROM testtable

6、使用 TOP 和 PERCENT 限制结果集

TOP 子句限制返回到结果集中的行数。

TOP n [PERCENT]

n 指定返回的行数。如果未指定 PERCENT,n 就是返回的行数。如果指定了 PERCENT,n 就是返回的结果集行的百分比,如下所示:

TOP 120 /*Return the top 120 rows of the result set. */

TOP 15 PERCENT /* Return the top 15% of the result set. */.

如果一个 SELECT 语句既包含 TOP 又包含 ORDER BY 子句,那么返回的行将会从排序后的结果集中选择。整个结果集按照指定的顺序建立并且返回排好序的结果集的前 n 行。

限制结果集大小的另一种方法是在执行一个语句之前执行 SET ROWCOUNT n 语句。SET ROWCOUNT 与 TOP 的不同之处在于:

SET ROWCOUNT 限制适用对 ORDER BY 取值后在结果集中生成行。如果指定了 ORDER BY,SELECT 语句将在从某个已根据指定的 ORDER BY 分类进行了排序的值集中选择 n 行后终止。

TOP 子句适用于指定了该子句的单个 SELECT 语句。在执行另一个 SET ROWCOUNT 语句之前,SET ROWCOUNT 会一直有效,例如执行 SET ROWCOUNT 0 将会关闭此选项。

(二) FROM子句

FROM子句指定Select语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。

在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:

Select username,citytable.cityid

FROM usertable,citytable

Where usertable.cityid=citytable.cityid

在FROM子句中可用以下两种格式为表或视图指定别名:

表名 as 别名

表名 别名

例如上面语句可用表的别名格式表示为:

Select username,b.cityid

FROM usertable a,citytable b

Where a.cityid=b.cityid

Select不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。例如:

Select a.au_fname+a.au_lname

FROM authors a,titleauthor ta

(Select title_id,title

FROM titles

Where ytd_sales>10000

) AS t

Where a.au_id=ta.au_id

AND ta.title_id=t.title_id

此例中,将Select返回的结果集合给予一别名t,然后再从中检索数据。

(三) 使用Where子句设置查询条件

Where子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据:

Select *

FROM usertable

Where age>20

Where子句可包括各种条件运算符:

比较运算符(大小比较):>、>=、=、、!>、!<

范围运算符(表达式值是否在指定的范围):BETWEEN…AND…

NOT BETWEEN…AND…

列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……)

NOT IN (项1,项2……)

模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE

空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL

逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR

1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30

2、列表运算符例:country IN ('Germany','China')

3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、varchar、text、ntext、datetime和smalldatetime等类型查询。

可使用以下通配字符:

百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。

下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。

方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。

例如:

限制以Publishing结尾,使用LIKE '%Publishing'

限制以A开头:LIKE '[A]%'

限制以A开头外:LIKE '[^A]%'

4、空值判断符例Where age IS NULL

5、逻辑运算符:优先级为NOT、AND、OR

(四)查询结果排序

使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为:

ORDER BY {column_name [ASC|DESC]} [,…n]

其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排序。例如:

Select *

FROM usertable

ORDER BY age desc,userid ASC

另外,可以根据表达式进行排序。

二、 联合查询

UNION运算符可以将两个或两个以上上Select语句的查询结果集合合并成一个结果集合显示,即执行联合查询。UNION的语法格式为:

select_statement

UNION [ALL] selectstatement

[UNION [ALL] selectstatement][…n]

其中selectstatement为待联合的Select查询语句。

ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一行。

联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。

在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类型,系统将低精度的数据类型转换为高精度的数据类型。

在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:

查询1 UNION (查询2 UNION 查询3)

索引查询

CREATE INDEX 语句

创建一个索引

--------------------------------------------------------------------------------

注意:对于非微软数据库, Microsoft Jet 数据库引擎 不支持 CREATE PROCEDURE 或 DDL 语句的使用。

--------------------------------------------------------------------------------

CREATE [ UNIQUE ] INDEX index

ON table (field [ASC|DESC][, field [ASC|DESC], ...])

[WITH { PRIMARY | DISALLOW NULL | IGNORE NULL }]

CREATE INDEX 语句说明:

index: 要创建的索引的名称。

table: 将包含索引的现有表的名称。

field :要进行索引的字段的名称。若要创建单字段索引,请在表名后的括号中列出字段名。若要创建多字段索引,请列出要包括在索引中的每个字段的名称。要创建降序索引,请使用 DESC 保留字 (保留字:一种语言(如 Visual Basic)的一部分。保留字包括语句名称、预定义函数以及数据类型、方法、运算符和对象。);否则,索引假设为升序。

create index默认建立的是非聚簇索引,索引值可以重复。如果要建立特殊的索引,则需要显示的写出关键字,如create clustered index建立聚簇索引。create unique index建立唯一索引。

thinkphp3连表查询

M('表名1')

->join('表名2 ON 表名1.id= ym_user.id')

->field('表名1.字段名1,字段名2,表名2.*')

->order('表名1字段 or 表名2字段 desc or asc')

->select();

解释:

M方法为实例化表对象

join即为多表联合查询的关键连接词,可多个添加

field则表示自定义个人需求查询对应表字段

order为排序关键词

desc表示按照对应字段从大到小排序

asc表示按照对应字段从小到大排序

select表示查询关键词

thinkphp5连表查询

根据个人的需求和查询表的数据进行对应改装即可完成多表联合查询的功能。

数据库提供的链式操作方法,可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作。

使用也比较简单,假如我们现在要查询一个User表的满足状态为1的前10条记录,并希望按照用户的创建时间排序 ,代码如下:

Db::table('think_user')

->where('status',1)

->order('create_time')

->limit(10)

->select();

这里的where、order和limit方法就被称之为链式操作方法,除了select方法必须放到最后一个外(因为select方法并不是链式操作方法),链式操作的方法调用顺序没有先后,例如,下面的代码和上面的等效:

Db::table('think_user')

->order('create_time')

->limit(10)

->where('status',1)

->select();

其实不仅仅是查询方法可以使用连贯操作,包括所有的CURD方法都可以使用,例如:

Db::table('think_user')

->where('id',1)

->field('id,name,email')

->find();

Db::table('think_user')

->where('status',1)

->where('id',1)

->delete();

链式操作在完成查询后会自动清空链式操作的所有传值。简而言之,链式操作的结果不会带入后面的其它查询。

系统支持的链式操作方法有:

连贯操作作用支持的参数类型

where*

用于AND查询

字符串、数组和对象

whereOr*

用于OR查询

字符串、数组和对象

wheretime*

用于时间日期的快捷查询

字符串

table

用于定义要操作的数据表名称

字符串和数组

alias

用于给当前数据表定义别名

字符串

field*

用于定义要查询的字段(支持字段排除)

字符串和数组

order*

用于对结果排序

字符串和数组

limit

用于限制查询结果数量

字符串和数字

page

用于查询分页(内部会转换成limit)

字符串和数字

group

用于对查询的group支持

字符串

having

用于对查询的having支持

字符串

join*

用于对查询的join支持

字符串和数组

union*

用于对查询的union支持

字符串、数组和对象

view*

用于视图查询

字符串、数组

distinct

用于查询的distinct支持

布尔值

lock

用于数据库的锁机制

布尔值

cache

用于查询缓存

支持多个参数

relation*

用于关联查询

字符串

with*

用于关联预载入

字符串、数组

bind*

用于数据绑定操作

数组或多个参数

comment

用于SQL注释

字符串

force

用于数据集的强制索引

字符串

master

用于设置主服务器读取数据

布尔值

strict

用于设置是否严格检测字段名是否存在

布尔值

sequence

用于设置Pgsql的自增序列名

字符串

failException

用于设置没有查询到数据是否抛出异常

布尔值

partition

用于设置分表信息

数组 字符串

所有的连贯操作都返回当前的模型实例对象(this),其中带*标识的表示支持多次调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值