SELECT

  1. /* SELECT */ ------------------
  2. SELECT [ALL|DISTINCT] select_expr FROM -> WHERE -> GROUP BY [合计函数] -> HAVING -> ORDER BY -> LIMIT
  3. a. select_expr
  4. -- 可以用 * 表示所有字段。
  5. select * from tb;
  6. -- 可以使用表达式(计算公式、函数调用、字段也是个表达式)
  7. select stu, 29+25, now() from tb;
  8. -- 可以为每个列使用别名。适用于简化列标识,避免多个列标识符重复。
  9. - 使用 as 关键字,也可省略 as.
  10. select stu+10 as add10 from tb;
  11. b. FROM 子句
  12. 用于标识查询来源。
  13. -- 可以为表起别名。使用as关键字。
  14. SELECT * FROM tb1 AS tt, tb2 AS bb;
  15. -- from子句后,可以同时出现多个表。
  16. -- 多个表会横向叠加到一起,而数据会形成一个笛卡尔积。
  17. SELECT * FROM tb1, tb2;
  18. -- 向优化符提示如何选择索引
  19. USE INDEXIGNORE INDEXFORCE INDEX
  20. SELECT * FROM table1 USE INDEX (key1,key2) WHERE key1=1 AND key2=2 AND key3=3;
  21. SELECT * FROM table1 IGNORE INDEX (key3) WHERE key1=1 AND key2=2 AND key3=3;
  22. c. WHERE 子句
  23. -- from获得的数据源中进行筛选。
  24. -- 整型1表示真,0表示假。
  25. -- 表达式由运算符和运算数组成。
  26. -- 运算数:变量(字段)、值、函数返回值
  27. -- 运算符:
  28. =, <=>, <>, !=, <=, <, >=, >, !, &&, ||,
  29. in (not) null, (not) like, (not) in, (not) between and, is (not), and, or, not, xor
  30. is/is not 加上ture/false/unknown,检验某个值的真假
  31. <=>与<>功能相同,<=>可用于null比较
  32. d. GROUP BY 子句, 分组子句
  33. GROUP BY 字段/别名 [排序方式]
  34. 分组后会进行排序。升序:ASC,降序:DESC
  35. 以下[合计函数]需配合 GROUP BY 使用:
  36. count 返回不同的非NULL值数目 count(*)、count(字段)
  37. sum 求和
  38. max 求最大值
  39. min 求最小值
  40. avg 求平均值
  41. group_concat 返回带有来自一个组的连接的非NULL值的字符串结果。组内字符串连接。
  42. e. HAVING 子句,条件子句
  43. where 功能、用法相同,执行时机不同。
  44. where 在开始时执行检测数据,对原数据进行过滤。
  45. having 对筛选出的结果再次进行过滤。
  46. having 字段必须是查询出来的,where 字段必须是数据表存在的。
  47. where 不可以使用字段的别名,having 可以。因为执行WHERE代码时,可能尚未确定列值。
  48. where 不可以使用合计函数。一般需用合计函数才会用 having
  49. SQL标准要求HAVING必须引用GROUP BY子句中的列或用于合计函数中的列。
  50. f. ORDER BY 子句,排序子句
  51. order by 排序字段/别名 排序方式 [,排序字段/别名 排序方式]...
  52. 升序:ASC,降序:DESC
  53. 支持多个字段的排序。
  54. g. LIMIT 子句,限制结果数量子句
  55. 仅对处理好的结果进行数量限制。将处理好的结果的看作是一个集合,按照记录出现的顺序,索引从0开始。
  56. limit 起始位置, 获取条数
  57. 省略第一个参数,表示从索引0开始。limit 获取条数
  58. h. DISTINCT, ALL 选项
  59. distinct 去除重复记录
  60. 默认为 all, 全部记录

连接查询

若一个查询同时涉及两个或两个以上的表,则称之为连接查询。

交叉连接cross join

又叫笛卡尔乘积,两表进行交叉连接,返回的结果是A*B。假如表A有10条数据,表B有10条数据,交叉连接有100条数据。

内连接inner join

后续条件不加on就是求笛卡尔乘积。
有三种写法:

  1. select * from tch_teacher inner join tch_contact
  2. select * from tch_teacher,tch_contact
  3. select * 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

  1. union是会对最后的表结果进行去重操作的, 如果我不想去重, 只想快速得到拼接的结果, 可以使用 union all 来拼接。
  2. <a name="55X13"></a>
  3. # 子查询
  4. ```sql
  5. /* 子查询 */ ------------------
  6. - 子查询需用括号包裹。
  7. -- from型
  8. from后要求是一个表,必须给子查询结果取个别名。
  9. - 简化每个查询内的条件。
  10. - from型需将结果生成一个临时表格,可用以原表的锁定的释放。
  11. - 子查询返回一个表,表型子查询。
  12. select * from (select * from tb where id>0) as subfrom where id>1;
  13. -- where型
  14. - 子查询返回一个值,标量子查询。
  15. - 不需要给子查询取别名。
  16. - where子查询内的表,不能直接用以更新。
  17. select * from tb where money = (select max(money) from tb);
  18. -- 列子查询
  19. 如果子查询结果返回的是一列。
  20. 使用 in 或 not in 完成查询
  21. exists 和 not exists 条件
  22. 如果子查询返回数据,则返回1或0。常用于判断条件。
  23. select column1 from t1 where exists (select * from t2);
  24. -- 行子查询
  25. 查询条件是一个行。
  26. select * from t1 where (id, gender) in (select id, gender from t2);
  27. 行构造符:(col1, col2, ...) 或 ROW(col1, col2, ...)
  28. 行构造符通常用于与对能返回两个或两个以上列的子查询进行比较。
  29. -- 特殊运算符
  30. != all() 相当于 not in
  31. = some() 相当于 in。any 是 some 的别名
  32. != some() 不等同于 not in,不等于其中某一个。
  33. all, some 可以配合其他运算符一起使用。

LIMIT,OFFSET

LIMIT使用方法

  1. LIMIT [参数1]--m,参数2--n
  2. #表示从跳过m条数据开始取n行数据
  3. #参数1为可选参数,表示跳过m条数据(默认为0),eg:1表示从第二行开始
  4. #参数2为必选参数,表示取几行数据
  5. eg1
  6. SELECT * FROM table LIMIT 5; //检索前 5 个记录行
  7. 等价于
  8. SELECT * FROM table LIMIT 0,5; //检索前 5 个记录行
  9. eg2
  10. SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
  11. #为了检索某行开始到最后的所有数据,可以设置第二个参数为-1
  12. eg3
  13. SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last

LIMIT OFFSET使用方法

  1. LIMIT 参数1--m OFFSET 参数2--n
  2. #表示跳过n个数据,取m个数据
  3. #参数1表示读取m条数据
  4. #参数2表示跳过n个数据
  5. eg4
  6. SELECT * FROM table LIMIT 2 OFFSET 1; //跳过1条数据读取2条数据,即读取第2-3条数据

LIMIT和LIMIT OFFSET区别

  1. eg5:
  2. SELECT * FROM table LIMIT 2,1; //跳过2条数据读取1条数据,即读取第3条数据
  3. SELECT * FROM table LIMIT 2 OFFSET 1; //跳过1条数据读取2条数据,即读取第2-3条数据

/