sql层面语法的总结mysql层面语法主要侧重于sql的查询相关的信息量积累这个文章主要是针对sql语法的逻辑内容单表查询相关机制设计的讲解在使用sql之前我们要了解一个基础概念也就是关系型数据库。其实用大白话讲就是一个table表格一个excel表格。列头和数据我们主要研究的就是这个从这个表格里去到我们想要的数据于是就有了select 列from tablewhere 列“对应的数据”and 列“对应的数据”这样就取到了想要的数据。但是为了处理更加复杂的我们的目标就是找到这个table里面的所有的数据我们看看sql查询提供了哪些机制供使用type类型文本时间数据对于查询的列可以限制使用distinct这个关键字处理去重查询where的关键字对应的单个列数据1.对应的列匹配数据列名 某个值对于时间和数字还可以大于小于等于这些空值判断 列 IS NULL / IS NOT NULL 不能用 NULL4.like机制模糊查询对应多个数据1.in机制锁定固定的数据就是列名对应的多个数据2.between机制在某某区间备注多个查询对象可以用and和or连接计算查询第一个阶段对某个列进行操作常见的操作count个数avg平均值max 最大值min 最小值第二个阶段对列的类型去进一步操作groupby 这个就贵吧数据分成一坨坨在计算第三个阶段对计算出来的值做限制只显示对应计算出来的值你总结的这部分已经抓住了单表查询的核心骨架很清晰。在此基础上我帮你补充一些MySQL中常用但容易忽略的SQL语法细节侧重于查询相关的信息量积累让你的“工具箱”更完整。一、SELECT 子句的更多机制1. 列别名ASSELECTcolumn_nameASalias_nameFROMtable;-- AS 可省略SELECTcolumn_name alias_nameFROMtable;2. 常量查询SELECT固定文本ASinfo,100ASnum,NOW()AScurrent_time;3. 表达式计算SELECTprice,quantity,price*quantityAStotalFROMorders;4. 字符串拼接SELECTCONCAT(first_name, ,last_name)ASfull_nameFROMusers;5. 条件分支CASE WHENSELECTname,score,CASEWHENscore90THEN优秀WHENscore60THEN及格ELSE不及格ENDASlevelFROMstudents;二、WHERE 的补充条件操作符说明示例!或不等于WHERE age 18安全等于可比较 NULLWHERE a NULLNOT IN不在列表中WHERE id NOT IN (1,2,3)NOT BETWEEN不在区间WHERE price NOT BETWEEN 10 AND 100NOT LIKE不匹配模式WHERE name NOT LIKE test%LIKE 的通配符%→ 任意个字符含0个_→ 单个字符WHEREnameLIKE张%-- 张开头WHEREnameLIKE%三-- 三结尾WHEREnameLIKE王_-- 王一个汉字转义特殊字符WHEREpathLIKE%\_%ESCAPE\-- 查找包含下划线的三、GROUP BY 与聚合函数的细节常用的聚合函数函数说明注意COUNT(*)总行数包含 NULLCOUNT(column)非 NULL 行数不含 NULLCOUNT(DISTINCT column)去重后计数常用SUM(column)求和忽略 NULLAVG(column)平均值忽略 NULLMAX(column)/MIN(column)最大/最小值忽略 NULLGROUP_CONCAT(column)拼接分组内容MySQL特有SELECTcategory,COUNT(*)AScnt,GROUP_CONCAT(DISTINCTproduct_nameORDERBYpriceDESCSEPARATOR;)ASproductsFROMgoodsGROUPBYcategory;HAVING —— 对分组后的结果筛选SELECTcategory,AVG(price)ASavg_priceFROMgoodsGROUPBYcategoryHAVINGavg_price100;-- 不能用 WHEREWHERE 在分组前过滤HAVING 在分组后过滤。四、排序与分页ORDER BYSELECT*FROMproductsORDERBYpriceDESC,idASC;可按列别名排序可按表达式排序ORDER BY (price * quantity) DESCLIMIT 分页-- 前5条SELECT*FROMtableLIMIT5;-- 从第6条开始取10条偏移量5取10条SELECT*FROMtableLIMIT5,10;-- 推荐写法MySQL 8.0SELECT*FROMtableLIMIT10OFFSET5;大表分页性能问题LIMIT 100000, 10会很慢通常用WHERE id 上次最大id或子查询优化。五、执行顺序非常重要你写SQL的顺序 ≠ 数据库执行的顺序FROM → 确定表 WHERE → 行级过滤 GROUP BY → 分组 HAVING → 组级过滤 SELECT → 计算表达式、别名 ORDER BY → 排序 LIMIT → 分页案例验证SELECTcategory,AVG(price)ASavg_priceFROMgoodsWHEREprice0GROUPBYcategoryHAVINGavg_price50ORDERBYavg_priceDESCLIMIT5;因为 HAVING 能识别avg_price别名是因为它在 SELECT 之后执行。六、常用函数补充查询时会用到时间处理YEAR(date_col),MONTH(date_col),DAY(date_col)DATE_ADD(date,INTERVAL1DAY)DATEDIFF(date1,date2)NOW(),CURDATE(),CURTIME()字符串处理LENGTH(str),CHAR_LENGTH(str)UPPER(str),LOWER(str)TRIM(str),SUBSTRING(str,start,length)REPLACE(str,from,to)数值处理ROUND(num,2),FLOOR(num),CEIL(num)ABS(num),RAND()判断与转换IFNULL(column,默认值)COALESCE(值1,值2,默认值)-- 返回第一个非NULLCAST(columnAS类型)七、一个综合查询示例把所有机制串起来SELECTdepartment,COUNT(*)ASemp_count,ROUND(AVG(salary),2)ASavg_salary,GROUP_CONCAT(DISTINCTnameORDERBYname SEPARATOR, )ASemployeesFROMemployeeWHEREstatusactiveANDhire_date2020-01-01GROUPBYdepartmentHAVINGemp_count3ORDERBYavg_salaryDESCLIMIT10;小结你已经把单表查询的主线理解得很清楚了SELECT→ 拿什么FROM→ 从哪拿WHERE→ 过滤行GROUP BY 聚合→ 分组计算HAVING→ 过滤组ORDER BY LIMIT→ 排序分页
sql层面语法的总结(mysql层面语法,主要侧重于sql的查询相关的信息量积累)
sql层面语法的总结mysql层面语法主要侧重于sql的查询相关的信息量积累这个文章主要是针对sql语法的逻辑内容单表查询相关机制设计的讲解在使用sql之前我们要了解一个基础概念也就是关系型数据库。其实用大白话讲就是一个table表格一个excel表格。列头和数据我们主要研究的就是这个从这个表格里去到我们想要的数据于是就有了select 列from tablewhere 列“对应的数据”and 列“对应的数据”这样就取到了想要的数据。但是为了处理更加复杂的我们的目标就是找到这个table里面的所有的数据我们看看sql查询提供了哪些机制供使用type类型文本时间数据对于查询的列可以限制使用distinct这个关键字处理去重查询where的关键字对应的单个列数据1.对应的列匹配数据列名 某个值对于时间和数字还可以大于小于等于这些空值判断 列 IS NULL / IS NOT NULL 不能用 NULL4.like机制模糊查询对应多个数据1.in机制锁定固定的数据就是列名对应的多个数据2.between机制在某某区间备注多个查询对象可以用and和or连接计算查询第一个阶段对某个列进行操作常见的操作count个数avg平均值max 最大值min 最小值第二个阶段对列的类型去进一步操作groupby 这个就贵吧数据分成一坨坨在计算第三个阶段对计算出来的值做限制只显示对应计算出来的值你总结的这部分已经抓住了单表查询的核心骨架很清晰。在此基础上我帮你补充一些MySQL中常用但容易忽略的SQL语法细节侧重于查询相关的信息量积累让你的“工具箱”更完整。一、SELECT 子句的更多机制1. 列别名ASSELECTcolumn_nameASalias_nameFROMtable;-- AS 可省略SELECTcolumn_name alias_nameFROMtable;2. 常量查询SELECT固定文本ASinfo,100ASnum,NOW()AScurrent_time;3. 表达式计算SELECTprice,quantity,price*quantityAStotalFROMorders;4. 字符串拼接SELECTCONCAT(first_name, ,last_name)ASfull_nameFROMusers;5. 条件分支CASE WHENSELECTname,score,CASEWHENscore90THEN优秀WHENscore60THEN及格ELSE不及格ENDASlevelFROMstudents;二、WHERE 的补充条件操作符说明示例!或不等于WHERE age 18安全等于可比较 NULLWHERE a NULLNOT IN不在列表中WHERE id NOT IN (1,2,3)NOT BETWEEN不在区间WHERE price NOT BETWEEN 10 AND 100NOT LIKE不匹配模式WHERE name NOT LIKE test%LIKE 的通配符%→ 任意个字符含0个_→ 单个字符WHEREnameLIKE张%-- 张开头WHEREnameLIKE%三-- 三结尾WHEREnameLIKE王_-- 王一个汉字转义特殊字符WHEREpathLIKE%\_%ESCAPE\-- 查找包含下划线的三、GROUP BY 与聚合函数的细节常用的聚合函数函数说明注意COUNT(*)总行数包含 NULLCOUNT(column)非 NULL 行数不含 NULLCOUNT(DISTINCT column)去重后计数常用SUM(column)求和忽略 NULLAVG(column)平均值忽略 NULLMAX(column)/MIN(column)最大/最小值忽略 NULLGROUP_CONCAT(column)拼接分组内容MySQL特有SELECTcategory,COUNT(*)AScnt,GROUP_CONCAT(DISTINCTproduct_nameORDERBYpriceDESCSEPARATOR;)ASproductsFROMgoodsGROUPBYcategory;HAVING —— 对分组后的结果筛选SELECTcategory,AVG(price)ASavg_priceFROMgoodsGROUPBYcategoryHAVINGavg_price100;-- 不能用 WHEREWHERE 在分组前过滤HAVING 在分组后过滤。四、排序与分页ORDER BYSELECT*FROMproductsORDERBYpriceDESC,idASC;可按列别名排序可按表达式排序ORDER BY (price * quantity) DESCLIMIT 分页-- 前5条SELECT*FROMtableLIMIT5;-- 从第6条开始取10条偏移量5取10条SELECT*FROMtableLIMIT5,10;-- 推荐写法MySQL 8.0SELECT*FROMtableLIMIT10OFFSET5;大表分页性能问题LIMIT 100000, 10会很慢通常用WHERE id 上次最大id或子查询优化。五、执行顺序非常重要你写SQL的顺序 ≠ 数据库执行的顺序FROM → 确定表 WHERE → 行级过滤 GROUP BY → 分组 HAVING → 组级过滤 SELECT → 计算表达式、别名 ORDER BY → 排序 LIMIT → 分页案例验证SELECTcategory,AVG(price)ASavg_priceFROMgoodsWHEREprice0GROUPBYcategoryHAVINGavg_price50ORDERBYavg_priceDESCLIMIT5;因为 HAVING 能识别avg_price别名是因为它在 SELECT 之后执行。六、常用函数补充查询时会用到时间处理YEAR(date_col),MONTH(date_col),DAY(date_col)DATE_ADD(date,INTERVAL1DAY)DATEDIFF(date1,date2)NOW(),CURDATE(),CURTIME()字符串处理LENGTH(str),CHAR_LENGTH(str)UPPER(str),LOWER(str)TRIM(str),SUBSTRING(str,start,length)REPLACE(str,from,to)数值处理ROUND(num,2),FLOOR(num),CEIL(num)ABS(num),RAND()判断与转换IFNULL(column,默认值)COALESCE(值1,值2,默认值)-- 返回第一个非NULLCAST(columnAS类型)七、一个综合查询示例把所有机制串起来SELECTdepartment,COUNT(*)ASemp_count,ROUND(AVG(salary),2)ASavg_salary,GROUP_CONCAT(DISTINCTnameORDERBYname SEPARATOR, )ASemployeesFROMemployeeWHEREstatusactiveANDhire_date2020-01-01GROUPBYdepartmentHAVINGemp_count3ORDERBYavg_salaryDESCLIMIT10;小结你已经把单表查询的主线理解得很清楚了SELECT→ 拿什么FROM→ 从哪拿WHERE→ 过滤行GROUP BY 聚合→ 分组计算HAVING→ 过滤组ORDER BY LIMIT→ 排序分页