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%';
通配符说明:
_: 表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句。
%:表示任意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的基础。