分页查询

语法:

select 字段列表 from 表名 limit起始索引,查询记录数;

注意:

Ø  起始索引从0开始,起始索引=(查询页码-1)每页显示记录数

Ø  不同数据局实现分页查询方式不同,mysql是用limit。

Ø  如果查询的是第一页数据,起始索引可以省略,如limit 3。

 

例子:

查询第一行

select prod_name from products limit 1;

从第5行开始数6行。不包括第5行。

select prod_name from products limit 5,6;

另一种写法:limit 4 offset 3;从第3行开始取4行,相当于limit 3,4。

select查询语句的顺序

子句

说明

是否必须使用

From

从中检索数据的表

仅在从表选择数据时使用

Where

行级过滤

Group by

分组说明

仅在按组计算聚集时使用

Having

组级过滤

Select

要返回的列或表达式

Order by

输出排序顺序

Limit

要检索的行数


多表查询

多标间的关系分为三种:一对多、多对多、一对一。

 

注意:

实现一对一的原因:

一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率。

实现方法:

在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)。

多表连接分为:内连接、外连接、自连接、子查询。


内部联结:

又叫等值联结;使用 inner join ;是表的交集。

隐式内连接:

select 字段列表 from 表1,表2 where 条件…

显式内连接:

select 字段列表 from 表1 inner join 表2 on连接条件…where 其他筛选条件…

左外连接:

left join ;以左表为主表,包含左表的所有行。

select 字段列表 from 表1 left join 表2 on连接条件…where 其他筛选条件…

右外连接:

right join ;以右表为主表,包含右表的所有行。

select 字段列表 from 表1 right join 表2 on连接条件…where 其他筛选条件…

自连接:

同一个表间;很多时候可以替代子查询,通常效率比子查询高。需要起别名区分。可以结合内连接、左外连接、右外连接处理。

select 字段列表 from 表a  别名1  join 表a 别名2 on连接条件…where 其他筛选条件…

例子:

SELECT  pl.prod_id,pl.prod_name

FROM products AS p1, products as p2

WHERE pl.vend_id=p2.vend_id

 and p2.prod_id = 'DTNTR' ;

 

自然联结:

和内部联结几乎相同,只是不会出现重复列,实现方式是人为指定检索出来的列。

组合查询 union ;union all

用union或者union all将多个select合并。

每个列必须包含相同的列、表达式或聚集函数(不需要相同的次序)。

列数据类型必须兼容:类型不必完全相同,但必须可以隐式转换。

Union all  包含重复行。

使用order by 排序时,放在最后一个select语句之后。

子查询

又称为嵌套查询,多个查询语句的嵌套。可以用在select、update、insert into 、delete任何语句中。可以放在where、from、select之中。

语法1:

……from 表名……where column1 = (select column2 from t2);

据子查询查询结果不同,可分为:

标量子查询(子查询结果是单个值):常用操作符号=、<>、>、>=、<、<=

列子查询(子查询结果是一列):常用操作符号in、not in、any(任意一个)、some(任意一个)、all(所有条件都必须满足)

行子查询(子查询结果是一行):常用操作符号=、<>、in、not in

子查询(子查询结果是多行多列):常用操作符号in

 

Eg:

SELECT cust_id

FROM orders

WHERE order_num IN (SELECT order_num

                               FROM  orderitems

                              WHERE prod_id = 'TNT2');

 

子查询总是从内向外执行。

下面这个例子中的子查询将对检索出的每个客户执行一次。

SELECT  cust_name,

        cust_state,

        (SELECT COUNT(*)

         FROM orders

         WHERE  orders.cust_id = customers.cust_id) AS orders

FROM customers

ORDER BY cust_name;