SQL查询操作及子句优先级

用source .sql文件竟然可以自动建表。

简单数据查询:

select * from table_name;

避免重复查询:

select distinct(field_name) from table_name;

实现简单的数学四则运算:

select 1*2;
select 10 MOD 3;
select field_name*2 from table_name;

实现字符串连接:

select concat("hello","world");
select concat(concat(filed_name,"is"),name) from table_name;

带条件查询:

select * from table_name
where (field_name < 1000 and field_name='123' )or field_name is not NULL;

设定范围的查询(between and)

select * from table_name
where field_name between 1000 and 1500;(1000=<x<=1500);

NULL和""是不同的:

带in关键字的查询:用于指定一个列表

select * from table_name
where field_name in (10,20,30,40);

select * from table_name
where field_name not in (10,20,30);

模糊查询:

模糊查询(like语法)

select <*/field> form <tablename> where <field> like '%value%';

8

通配符说明:

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

%:表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。

[ ]:表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。

SELECT * FROM [user] WHERE u_name LIKE '老[1-9]'

将找出“老1”、“老2”、……、“老9”;

[^ ] :表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。

将排除“老1”到“老4”,寻找“老5”、“老6”、……

SELECT * FROM [user] WHERE u_name LIKE '老[^1-4]';

如何匹配百分号?用反斜杠来转移。

select * from table_name where field_name like "\%";

排序:

select * from table_name order by field_name;
(默认是升序,asc,降序加desc);

还可以多个列:
select * from table_name order by field_name1,field_name_2;
先按照field1排序,再根据field2排序。

用 limit关键字限制记录个数:limit可以限制要显示记录的数量。

select * from table_name limit;
限制前m行;
select * from table_name limit m,n;
限制显示从m行开始的n行。

limit后面必须直接跟整型,不支持变量和表达式。

 统计函数和分组记录查询:

count():记录个数

select count(field_name) from table_name;
count不记录field_name为NULL的记录;

select count(1) from table_name;

 

avg():平均数

sum():总和

max():最大值

min():最小值

select max(field_name),min(field_name) from table_name;

 

分组查询:

select field_name,count(1) from table_name
group by field_name;


多个条件分组:
select field_name1,field_name2,count(1) from table_name
group field_name1,filed_name2;

 

功能分组查询:

select group_concat(field_name2) from table_name group by field_name;
会显示以field1分组,field2字段的列表。

 

多个字段功能分组查询:

利用having在group by的结果集上进行过滤:

select * from table_name
group by field_name
having filed_name > 10;

 


SQL语句执行顺序:

 

处理顺序:

FROM:对FROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1

ON:对VT1应用ON筛选器。只有那些使为真的行才被插入VT2。

OUTER(JOIN):如 果指定了OUTER JOIN(相对于CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 VT2,生成VT3.如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。

WHERE:对VT3应用WHERE筛选器。只有使为true的行才被插入VT4.

GROUP BY:按GROUP BY子句中的列列表对VT4中的行分组,生成VT5.

CUBE|ROLLUP:把超组(Suppergroups)插入VT5,生成VT6.

HAVING:对VT6应用HAVING筛选器。只有使为true的组才会被插入VT7.

SELECT:处理SELECT列表,产生VT8.

DISTINCT:将重复的行从VT8中移除,产生VT9.

ORDER BY:将VT9中的行按ORDER BY 子句中的列列表排序,生成游标(VC10).

TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回调用者。

注:步骤10,按ORDER BY子句中的列列表排序上步返回的行,返回游标VC10.这一步是第一步也是唯一一步可以使用SELECT列表中的列别名的步骤。这一步不同于其它步骤的 是,它不返回有效的表,而是返回一个游标。SQL是基于集合理论的。集合不会预先对它的行排序,它只是成员的逻辑集合,成员的顺序无关紧要。对表进行排序 的查询可以返回一个对象,包含按特定物理顺序组织的行。ANSI把这种对象称为游标。理解这一步是正确理解SQL的基础。

 

posted @ 2016-09-02 19:48  0giant  阅读(8267)  评论(0编辑  收藏  举报