ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
where语句字段,必须是”数据表中存在的”字段 having:语句字段,必须是查询结果集中存在的字段 select \[all | distinct\] 字段或表达式列表 \[from子局\] \[where 子局\] \[group by子句\] \[having 子句\] \[order by子句\] \[limit 子句\]; select可以单独用不跟from,如果想跟from可以from一个dual(伪表) all和distinct用于设定select出来的数据,是否消除’重复行’,可以不写,那就是默认all,如果是distinct表示会消除 结果集中可以使用字段别名,但是where条件中要用表的名字 查询时间戳用select unix\_timestamp(); where子句: where中的字段要来自表不能用之前取的别名 算术运算符: +, -, \*, /, % 比较运算符: >, >=, <, <=, =(等于), <>(不等于), !=(不等于) =即代表赋值也代表比较运算 \[not\] between and 介于两者之间或不介于2者之间 is null 为空 is not null 不为空 逻辑运算符: and, or, not is运算符: xx is null:判断某个字段是”null”值就是没有值 xx is not null: 判断某个字段不是”null”值 xx is true:判断某个字段为真 xx is false:判断某个字段为假 0, 0.0, ‘’, null between运算符:判断某个值是否在给定值的范围内---适用于数字类型 xx between 值1 and 值2 in运算符:给定确定数据的范围判断,后面罗列的字段用()包括 语法:xx in (值1,值2,值3,….) 表示字段在所列出中的一个就满足条件 like运算符:对字符串进行模糊查找 语法:xx like ‘要查找的内容’; %代表任何个数的任何字符 \_:它代表一个任何字符 要找%或\_,转义就行了\\%和\\\_ group by子句:分组 形式:group by 字段1 \[desc | asc\], 字段2 \[desc | asc\] 每一组的数量信息,就是用count(\*)获得,count(字段名)不计空值,count(\*)计算空值 最大值:max(字段名) 最小值:min(字段名) 平均值:avg(字段名) 总和值:sum(字段名) group\_concat(字段名):可以显示一个分组的普通字段的所有值 having子句:只对分组的结果数据进行筛选 where对原始数据筛选,having对分组之后的数据筛选 order by子句 order by字段1 \[asc | desc\], 字段2 \[asc | desc\],………. desc倒序 asc 顺序(排序默认小到大) limit子句 limit offset,pagesize offset为偏移量,如果为0可以省略. pagesize每页显示的行数 分页公式:pagesize:每页显示条数,page:当前页. limit(page-1)\*pagesize,pagesize #### 连接的分类 **交叉连接**:cross join **自然连接:**natural join会自动的去找两张表中的相同字段,然后利用相同字段去进行连接,并且相同字段只会显示一个.如果两张表有多个同名字段,只有当多个同名字段值全部相等,才会显示这条记录 **自然左连接**: natural left join以左表为主,然后利用相同字段去连接,自然右类似 **内连接:**inner join 形式:select \* from 表1 \[inner\] join 表2 on 连接条件 没有连接条件其实就是交叉连接 一般都写连接条件:例:select \* from product inner join product\_type on product .protype\_id=product\_type.protype\_id; **左(外)连接:**left (outer) join 形式:表1(左表) left \[outer\] join 表2(右表) on 连接条件 其实就是将两个表的内连接的结果再加上左边表的不符合内连接所设定条件的那些数据结果,右边没有对应位置填null,不加on条件不行 **右外连接:**right(outer) join **全(外)连接:**full(outer) join mysql不支持全连接语法 using(字段名) 在左连接,右连接和内连接时可以不使用on,直接使用using(),指定一个同名字段去自动连接,指定的同名字段只显示一次 #### 子查询 形式:select 字段或表达式或子查询\[as 别名\] from 表名或链接结果或子查询 where 字段或表达式或子查询的条件判断 分为: **表子查询:**一个子查询返回的结果理论上是多行多列的时候.此时可当做一个表来使用,通常放在from后面 **行子查询:**一个子查询返回的结果理论上是”一行多列”的时候,此时可以当做一个行来使用,通常放在”行比较语法中” 行比较语法类似:where row(字段1,字段2)=(select 行子查询) **列子查询:**一个子查询语句返回的结果理论上是多行一列的时候.此时可以当多个值来使用,类似(5,17,18,2,6) **标量子查询:**一个子查询返回的结果,理论上是”一行一列”的时候.此时可以当做一个单个值来使用,即单个数据值 any 满足任意一个值就true all(some) 满足所有才true 例:查询所有非最高价商品 (只会小于上述所有价格中的某一个) select \* from product where price < any (select price from product); 查询所有最高价商品(大于等于”所有价格”) select \* from product where price >= all(select price from product); #### exists查询 形式:where exists(子查询) 如果子查询有数据,则exists的结果是true,否则是false select \* from product where exists (select \* from product\_type where protype\_name like ‘%电%’ and protype\_id = product.protype\_id) #### 联合查询union 语法形式:select 语句1 union \[all | distinct\] select 语句2; 此联合查询默认会”自动消除重复行”,即默认distinct,如果想都显示,就用all,而且默认使用第一个select的字段名,相同的数据只显示一个 order by子句和limit子句只能对整个联合之后的结果进行排序,如果第一个select子句用别名,order by必须用别名,如果2个子都想使用order by,在order by后面要跟limit 连接查询横向,联合查询纵向