SELECT
/* SELECT */ ------------------SELECT [ALL|DISTINCT] select_expr FROM -> WHERE -> GROUP BY [合计函数] -> HAVING -> ORDER BY -> LIMITa. select_expr-- 可以用 * 表示所有字段。select * from tb;-- 可以使用表达式(计算公式、函数调用、字段也是个表达式)select stu, 29+25, now() from tb;-- 可以为每个列使用别名。适用于简化列标识,避免多个列标识符重复。- 使用 as 关键字,也可省略 as.select stu+10 as add10 from tb;b. FROM 子句用于标识查询来源。-- 可以为表起别名。使用as关键字。SELECT * FROM tb1 AS tt, tb2 AS bb;-- from子句后,可以同时出现多个表。-- 多个表会横向叠加到一起,而数据会形成一个笛卡尔积。SELECT * FROM tb1, tb2;-- 向优化符提示如何选择索引USE INDEX、IGNORE INDEX、FORCE INDEXSELECT * FROM table1 USE INDEX (key1,key2) WHERE key1=1 AND key2=2 AND key3=3;SELECT * FROM table1 IGNORE INDEX (key3) WHERE key1=1 AND key2=2 AND key3=3;c. WHERE 子句-- 从from获得的数据源中进行筛选。-- 整型1表示真,0表示假。-- 表达式由运算符和运算数组成。-- 运算数:变量(字段)、值、函数返回值-- 运算符:=, <=>, <>, !=, <=, <, >=, >, !, &&, ||,in (not) null, (not) like, (not) in, (not) between and, is (not), and, or, not, xoris/is not 加上ture/false/unknown,检验某个值的真假<=>与<>功能相同,<=>可用于null比较d. GROUP BY 子句, 分组子句GROUP BY 字段/别名 [排序方式]分组后会进行排序。升序:ASC,降序:DESC以下[合计函数]需配合 GROUP BY 使用:count 返回不同的非NULL值数目 count(*)、count(字段)sum 求和max 求最大值min 求最小值avg 求平均值group_concat 返回带有来自一个组的连接的非NULL值的字符串结果。组内字符串连接。e. HAVING 子句,条件子句与 where 功能、用法相同,执行时机不同。where 在开始时执行检测数据,对原数据进行过滤。having 对筛选出的结果再次进行过滤。having 字段必须是查询出来的,where 字段必须是数据表存在的。where 不可以使用字段的别名,having 可以。因为执行WHERE代码时,可能尚未确定列值。where 不可以使用合计函数。一般需用合计函数才会用 havingSQL标准要求HAVING必须引用GROUP BY子句中的列或用于合计函数中的列。f. ORDER BY 子句,排序子句order by 排序字段/别名 排序方式 [,排序字段/别名 排序方式]...升序:ASC,降序:DESC支持多个字段的排序。g. LIMIT 子句,限制结果数量子句仅对处理好的结果进行数量限制。将处理好的结果的看作是一个集合,按照记录出现的顺序,索引从0开始。limit 起始位置, 获取条数省略第一个参数,表示从索引0开始。limit 获取条数h. DISTINCT, ALL 选项distinct 去除重复记录默认为 all, 全部记录
连接查询
交叉连接cross join
又叫笛卡尔乘积,两表进行交叉连接,返回的结果是A*B。假如表A有10条数据,表B有10条数据,交叉连接有100条数据。
内连接inner join
后续条件不加on就是求笛卡尔乘积。
有三种写法:
select * from tch_teacher inner join tch_contactselect * from tch_teacher,tch_contactselect * from tch_teacher join tch_contact
外连接outer join
外连接分为左连接和右连接。
- left join 称之为左连接, 连接以左侧表数据为准, 当右表没有数据与之匹配的时候, 则会用null填补
- right join 称之为右连接, 与 left join 相反, 这个是以右表为准
union查询
把多个表的查询表结果拼成一个表结果``sql select Id, Sex, BId,No`, Name, CreateDate from tch_teacher
union
select 0 as Id, Sex, BId, No, Name, CreateDate from tch_teacher_temp
union是会对最后的表结果进行去重操作的, 如果我不想去重, 只想快速得到拼接的结果, 可以使用 union all 来拼接。<a name="55X13"></a># 子查询```sql/* 子查询 */ ------------------- 子查询需用括号包裹。-- from型from后要求是一个表,必须给子查询结果取个别名。- 简化每个查询内的条件。- from型需将结果生成一个临时表格,可用以原表的锁定的释放。- 子查询返回一个表,表型子查询。select * from (select * from tb where id>0) as subfrom where id>1;-- where型- 子查询返回一个值,标量子查询。- 不需要给子查询取别名。- where子查询内的表,不能直接用以更新。select * from tb where money = (select max(money) from tb);-- 列子查询如果子查询结果返回的是一列。使用 in 或 not in 完成查询exists 和 not exists 条件如果子查询返回数据,则返回1或0。常用于判断条件。select column1 from t1 where exists (select * from t2);-- 行子查询查询条件是一个行。select * from t1 where (id, gender) in (select id, gender from t2);行构造符:(col1, col2, ...) 或 ROW(col1, col2, ...)行构造符通常用于与对能返回两个或两个以上列的子查询进行比较。-- 特殊运算符!= all() 相当于 not in= some() 相当于 in。any 是 some 的别名!= some() 不等同于 not in,不等于其中某一个。all, some 可以配合其他运算符一起使用。
LIMIT,OFFSET
LIMIT使用方法
LIMIT [参数1]--m,参数2--n;#表示从跳过m条数据开始取n行数据#参数1为可选参数,表示跳过m条数据(默认为0),eg:1表示从第二行开始#参数2为必选参数,表示取几行数据eg1:SELECT * FROM table LIMIT 5; //检索前 5 个记录行等价于SELECT * FROM table LIMIT 0,5; //检索前 5 个记录行eg2:SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15#为了检索某行开始到最后的所有数据,可以设置第二个参数为-1eg3:SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last
LIMIT OFFSET使用方法
LIMIT 参数1--m OFFSET 参数2--n#表示跳过n个数据,取m个数据#参数1表示读取m条数据#参数2表示跳过n个数据eg4:SELECT * FROM table LIMIT 2 OFFSET 1; //跳过1条数据读取2条数据,即读取第2-3条数据
LIMIT和LIMIT OFFSET区别
eg5:SELECT * FROM table LIMIT 2,1; //跳过2条数据读取1条数据,即读取第3条数据SELECT * FROM table LIMIT 2 OFFSET 1; //跳过1条数据读取2条数据,即读取第2-3条数据
/
