分页查询
语法:
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;