下面是select语句中子句的顺序,以在select中使用时必须遵循的次序为顺序。
子句 说明 是否必须使用select 要返回的列或表达式 是
from 从中检索数据的表 仅再从表选择数据时使用
where 行级过滤 否
group by 分组说明 仅在按组计算聚集时使用
having 组级过滤 否
order by 输出排序顺序 否
limit 要检索的行数 否
13、使用子查询
什么是子查询呢?子查询就是嵌套在其他查询中的查询, 在where子句中使用子查询,应该保证select语句具有和where子句中相同数目的列,通常,子查询将返回单个列并且与单个列匹配。
14、联结表外键为某一个表中的一列,它包含另一个表的主键值,定义了两个表的关系。如果数据存储在多个表中,使用连接可用单条select语句检索出需要的数据。应该保证所有的连联结都有where子句,否则mysql将返回比想要的多的多的数据,因为此时检索出的行数目是第一个表行数乘以第二个表行数。
联结是SQL中最重要最强大的特性。关系表的设计就是要保证把信息分解成多个表,一类数据一个表。各表通过某些常用的值(即关系设计中的关系relational)互相关联。
SELECT vend_name, prod_name, prod_price FROM vecdors, products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name, prod_name; 创建连接表
使用WHERE子句作为过滤条件,它只包含匹配给定给定条件的行。没有WHERE子句,第一个表中的每个行将于第二个表中的每个行配对,而不管它们逻辑上是否可以配对在一起。SQL对一条SELECT语句中可以联结的表的数目没有限制。
基于两个表之间相等测试的联接称为内部联接。其实,对于这种联结可以使用稍微不同的语法来明确指定联结的类型,下面的SELECT语句返回与前面例子完全相同的数据。
SELECT vend_name, prod_name, prod_price FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id;
15、创建高级联结除了可以给列名和计算字段其别名外,还可以给表起别名。
除了使用内部联接(或称为等值联接)的简单链接,还可以使用自联结、自然联结、外部链接。
自联结:可以在单条SELECT语句中不止一次引用相同的表。
自然联结:无论何时对表进行联结,应该至少有一个列出现在不止一个表中(被联结的列),标准的联结(内部联接)返回所有数据,甚至相同的列多次出现。自然联结排除多次出现,使每个列只返回一次。
外部联结:许多联结将一个表中的行与另一个表中的行相关联,但有时候会需要包含没有关联行的那些行。
select * from persion as haha; 使用表别名
select proid_id, prod_name FROM products WHERE vend_id = (SELECT vend_id FROM products WHERE prod_id = ‘DTNTR’); 找到生产ID为DTNTR的物品的供应商,然后找到这个供应商生产的其他物品。这种方式使用了子查询,下面是使用自联结的操作:
SELECT p1.prod_id, p1.prod_name FROM products AS p1, products AS p2 WHERE p1.vend_id = p2.vend_id AND p2.prod_id = ‘DTNTR’;
SELECT customers.cust_id, orders.order_num FROM customers INNER JOIN orders ON customers.cust_id = orders.cust_id; 这是内部联接方式,下面是外部联结方式
SELECT customers.cust_id, orders.order_num FROM customers LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id;
16、组合查询利用union操作符和组合多条SQL查询,让给出的多条select语句结果组合成单个结果集。注意,union必须有2条或者2条以上的select语句组成,union中每个查询必须包含相同的列、表达式或聚集函数(不过每个列不需要以相同的次序列出)。union会自动去除重复的行,这个是默认的行为,如果不想这样,使用union all而不是使用union。