1 SELECT语句 2 /* select */ ------------------ 3 4 select [all|distinct] select_expr from -> where -> group by [合计函数] -> having -> order by -> limit ; -- 使用顺序 5 6 a. select_expr 7 8 -- 可以用 * 表示所有字段。 9 10 select * from tb; 11 12 -- 可以使用表达式(计算公式、函数调用、字段也是个表达式) 13 14 select stu, 29+25, now() from tb; 15 16 -- 可以为每个列使用别名。适用于简化列标识,避免多个列标识符重复。 17 18 - 使用 as 关键字,也可省略 as. 19 20 select stu+10 as add10 from tb; 21 22 23 24 b. from 语句 25 26 用于标识查询来源。 27 28 -- 可以为表起别名。使用as关键字。 29 30 select * from tb1 as tt, tb2 as bb; 31 32 -- from子句后,可以同时出现多个表。 33 34 -- 多个表会横向叠加到一起,而数据会形成一个笛卡尔积。 35 36 select * from tb1, tb2; 37 38 39 40 c. where 子句 41 42 -- 从from获得的数据源中进行筛选。 43 44 -- 整型1表示真,0表示假。 45 46 -- 表达式由运算符和运算数组成。 47 48 -- 运算数:变量(字段)、值、函数返回值 49 50 -- 运算符: 51 52 =, <=>, <>, !=, <=, <, >=, >, !, &&, ||, 53 54 55 56 -- 常用的配合有 57 58 in (not) null, 59 60 (not) like, 61 62 (not) in, 63 64 (not) between and, 65 66 is (not), 67 68 and, 69 70 or, 71 72 not, xor 73 74 is/is not 加上ture/false/unknown,检验某个值的真假 75 76 <=>与<>功能相同,<=>可用于null比较 77 78 79 80 81 82 -- 子查询 83 84 什么是子查询?一个查询嵌套另一个查询 85 86 子查询分1. 标量子查询 (返回一个值) 87 88 标量子查询 89 90 把一个sql执行返回的一个值,作为另一个sql的一个条件 91 92 得到的结果是一行一列,一般出现在where之后 93 94 95 96 注意点:标量子查询允许使用的符号 97 98 =,!=,> ,>=,=<,< 99 100 select * from emp where dept2=( 101 102 select dept1 from dept where dept_name="财务" ) ; 103 104 105 106 -- 列子查询 (返回一个列) 107 108 定义:返回的是一列值 109 110 111 112 注意点:通常在where 条件的后使用,使用的是in 或not in ,不允许使用=,>,< 113 114 115 116 select dept_name from dept where dept1 in ( select dept2 from emp group by dept2 ) 117 118 119 120 -- 行子查询 (返回一行多列) 121 122 指子查询返回的结果集是一行多列 123 124 一般出现在where后 125 126 select * from emp1 where (age,dept2) = any (select age ,dept2 from emp1 where name="牛十"); 127 128 129 130 -- 表子查询 (返回一个表) from的后面指子查询返回的结果是一个表(多行多列)select dept2,max(incoming) from emp group by dept2 131 132 133 134 select dept_name ,s.c from dept , 135 136 ( select dept2,max(incoming) c from emp group by dept2) s 137 138 where dept.dept1=s.dept2 ; 139 140 141 142 select DISTINCT(dept_name) from dept 143 144 inner join (select dept2,age from emp where dept2=101 )as s on dept.dept1=s.dept2 ; 145 146 147 148 149 150 151 152 GROUP BY语句 153 group by 语句, 分组语句 154 group by 字段/别名 [排序方式] 155 分组后会进行排序。升序:ASC,降序:DESC 156 SELECT column_name, function(column_name) 157 FROM table_name 158 WHERE column_name operator value 159 GROUP BY column_name; 160 以下[合计函数]需配合 group by 使用: 161 count 返回不同的非NULL值数目 count(*)、count(字段) 162 sum 求和 163 max 求最大值 164 min 求最小值 165 avg 求平均值 166 group_concat 返回带有来自一个组的连接的非NULL值的字符串结果。组内字符串连接。 167 -- 示例 168 +----+--------+---------------------+--------+ 169 | id | name | date | signin | 170 +----+--------+---------------------+--------+ 171 | 1 | 小明 | 2022-02-19 15:25:33 | 1 | 172 | 2 | 小王 | 2022-02-19 15:25:47 | 3 | 173 | 3 | 小丽 | 2022-02-19 15:26:02 | 2 | 174 | 4 | 小王 | 2022-02-19 15:26:14 | 4 | 175 | 5 | 小明 | 2022-02-19 15:26:40 | 4 | 176 | 6 | 小明 | 2022-02-19 15:26:54 | 2 | 177 +----+--------+---------------------+--------+ 178 -- 将数据表按名字进行分组,并统计每个人有多少条记录 179 SELECT name, COUNT(*) FROM employee_tbl GROUP BY name; 180 +--------+----------+ 181 | name | COUNT(*) | 182 +--------+----------+ 183 | 小丽 | 1 | 184 | 小明 | 3 | 185 | 小王 | 2 | 186 +--------+----------+ 187 --WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计 188 SELECT name, SUM(signin) as signin_count FROM employee_tbl GROUP BY name WITH ROLLUP; 189 | name | signin_count | 190 +--------+--------------+ 191 | 小丽 | 2 | 192 | 小明 | 7 | 193 | 小王 | 7 | 194 | NULL | 16 | 195 +--------+--------------+ 196 HAVING语句 197 e. having 语句,条件语句 -- 配合 group by 语句使用 198 与 where 功能、用法相同,执行时机不同。 199 where 在开始时执行检测数据,对原数据进行过滤。 200 having 对筛选出的结果再次进行过滤。 201 having 字段必须是查询出来的,where 字段必须是数据表存在的。 202 where 不可以使用字段的别名,having 可以。因为执行WHERE代码时,可能尚未确定列值。 203 where 不可以使用合计函数。一般需用合计函数才会用 having 204 SQL标准要求HAVING必须引用 GROUP BY子句中的列或用于合计函数中的列。 205 -- 示例 206 +----+--------+---------------------+--------+ 207 | id | name | date | signin | 208 +----+--------+---------------------+--------+ 209 | 1 | 小明 | 2022-02-19 15:25:33 | 1 | 210 | 2 | 小王 | 2022-02-19 15:25:47 | 3 | 211 | 3 | 小丽 | 2022-02-19 15:26:02 | 2 | 212 | 4 | 小王 | 2022-02-19 15:26:14 | 4 | 213 | 5 | 小明 | 2022-02-19 15:26:40 | 4 | 214 | 6 | 小明 | 2022-02-19 15:26:54 | 2 | 215 +----+--------+---------------------+--------+ 216 -- 将数据表按名字进行分组,并统计每个人有多少条记录 217 SELECT name, COUNT(*) FROM employee_tbl GROUP BY name having name ='小明' 218 +--------+----------+ 219 | name | COUNT(*) | 220 +--------+----------+ 221 | 小明 | 3 | 222 +--------+----------+ 223 ORDER BY 语句 224 f. order by 子句,排序子句 225 order by 排序字段/别名 排序方式 [,排序字段/别名 排序方式]... 226 升序:ASC,降序:DESC 227 支持多个字段的排序。 228 -- 示例 229 +----+--------+---------------------+--------+ 230 | id | name | date | signin | 231 +----+--------+---------------------+--------+ 232 | 1 | 小明 | 2022-02-19 15:25:33 | 1 | 233 | 2 | 小王 | 2022-02-19 15:25:47 | 3 | 234 | 3 | 小丽 | 2022-02-19 15:26:02 | 2 | 235 | 4 | 小王 | 2022-02-19 15:26:14 | 4 | 236 | 5 | 小明 | 2022-02-19 15:26:40 | 4 | 237 | 6 | 小明 | 2022-02-19 15:26:54 | 2 | 238 +----+--------+---------------------+--------+ 239 SELECT * FROM employee_tbl ORDER BY ID DESC; 240 +----+--------+---------------------+--------+ 241 | id | name | date | signin | 242 +----+--------+---------------------+--------+ 243 | 6 | 小明 | 2022-02-19 15:26:54 | 2 | 244 | 5 | 小明 | 2022-02-19 15:26:40 | 4 | 245 | 4 | 小王 | 2022-02-19 15:26:14 | 4 | 246 | 3 | 小丽 | 2022-02-19 15:26:02 | 2 | 247 | 2 | 小王 | 2022-02-19 15:25:47 | 3 | 248 | 1 | 小明 | 2022-02-19 15:25:33 | 1 | 249 +----+--------+---------------------+--------+ 250 LIMIT语句 251 g. limit 子句,限制结果数量子句 252 仅对处理好的结果进行数量限制。将处理好的结果的看作是一个集合,按照记录出现的顺序,索引从0开始。 253 limit 起始位置, 获取条数 254 省略第一个参数,表示从索引0开始。limit 获取条数 255 -- 示例 256 +----+--------+---------------------+--------+ 257 | id | name | date | signin | 258 +----+--------+---------------------+--------+ 259 | 1 | 小明 | 2022-02-19 15:25:33 | 1 | 260 | 2 | 小王 | 2022-02-19 15:25:47 | 3 | 261 | 3 | 小丽 | 2022-02-19 15:26:02 | 2 | 262 | 4 | 小王 | 2022-02-19 15:26:14 | 4 | 263 | 5 | 小明 | 2022-02-19 15:26:40 | 4 | 264 | 6 | 小明 | 2022-02-19 15:26:54 | 2 | 265 +----+--------+---------------------+--------+ 266 SELECT * FROM employee_tbl LIMIT 1,3; 267 +----+--------+---------------------+--------+ 268 | id | name | date | signin | 269 +----+--------+---------------------+--------+ 270 | 1 | 小明 | 2022-02-19 15:25:33 | 1 | 271 | 2 | 小王 | 2022-02-19 15:25:47 | 3 | 272 | 3 | 小丽 | 2022-02-19 15:26:02 | 2 | 273 +----+--------+---------------------+--------+ 274 DISTINCT ALL语句 275 276 h. distinct, all 选项 277 distinct 去除重复记录 278 默认为 all, 全部记录 279 -- 示例 280 +----+--------+---------------------+--------+ 281 | id | name | date | signin | 282 +----+--------+---------------------+--------+ 283 | 1 | 小明 | 2022-02-19 15:25:33 | 1 | 284 | 2 | 小王 | 2022-02-19 15:25:47 | 3 | 285 | 3 | 小丽 | 2022-02-19 15:26:02 | 2 | 286 | 4 | 小王 | 2022-02-19 15:26:14 | 4 | 287 | 1 | 小明 | 2022-02-19 15:25:33 | 1 | 288 | 1 | 小明 | 2022-02-19 15:25:33 | 1 | 289 +----+--------+---------------------+--------+ 290 SELECT distinct * FROM employee_tbl; 291 +----+--------+---------------------+--------+ 292 | id | name | date | signin | 293 +----+--------+---------------------+--------+ 294 | 1 | 小明 | 2022-02-19 15:25:33 | 1 | 295 | 2 | 小王 | 2022-02-19 15:25:47 | 3 | 296 | 3 | 小丽 | 2022-02-19 15:26:02 | 2 | 297 | 4 | 小王 | 2022-02-19 15:26:14 | 4 | 298 +----+--------+---------------------+--------+