SQL Select 语法总结
对于一个刚刚步入社会的程序员来说,人家是谈虎色变,我们还有谈SQL色变。
博哥说过 少于8张表的 不算大业务,SQL 查询和优化 成为后端人员必须掌握的知识之一
数据库查询 —-> 执行
语法,语义,执行计划,返回结果
业务+技术
需求+数据库
JAVA 入门三年:1、SQL优化
数据库查询计划
1. MYSQL执行计划 10^3–SQL执行路径
2. 借助mycat 读写分离,设置写库 innodb 支持..;
MYISAM
电商应用很少用外键
目录
SELECT 语法
SELECT [ALL|DISTINCT|DISTINCTROW|TOP]
{|talbe.|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
FROM table_source
[ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]
执行步骤:
1.先从from字句一个表或多个表创建工作表
2.将where条件应用于1)的工作表,保留满足条件的行
3.GroupBy 将2)的结果分成多个组
4.Having 将条件应用于3)组合的条件过滤,只保留符合要求的组。
5.Order By对结果进行排序。
2.FROM子句
FROM子句是SELECT语句中必不可少的子句,可以使用FROM子句指定查询所需要的数据源名称。
FROM table_source
其中,table_source指定要在SQL语句中使用的表,视图。虽然语句中可用的表源个数的限值可以用内存和查询中其他表达式的复杂性而有所不同,但一个语句中可最多使用256个表源。
注:如果查询中引用了很多表,查询性能会受到影响,编译和优化时间也受到其他因素的影响。
![](/qrcode.jpg)
3.WHERE子句
在数据库中查询数据时,有时只希望查询所需要的数据,而非数据表中的所有数据,那么就可以使用SELECT语句中的WHERE子句来实现。
WHERE子句通过条件表达式描述关系中元组的选择条件。数据库系统处理该语句时,按行为单位,逐个检查每个行是否满足条件,将不满足条件的行筛选掉。WHERE子句的基本格式如下:
WHERE search_conditions
其中,search_conditions为用户所选所需要查询数据行的条件,即查询返回行记录的满足条件。对于用户所需要的所有行,search_conditions条件为true;而对于其他行,search_conditions条件为false或未知。
WHERE子句使用的条件
类别 | 运算符 | 说明 |
---|---|---|
比较运算符 | =,<,>,<=,>=,<> | 比较两个表达式 |
逻辑运算符 | AND ,OR, NOT | 组合两个表达式的运算结果或取反 |
范围运算符 | BETWEEN,NOT BETWEEN | 搜索值是否在范围内 |
列表运算符 | IN,NOT IN | 查询值是否属于列表值之一 |
字符匹配符 | LIKE ,NOT LIKE | 字符串是否匹配 |
- 3.1 比较运算符
mybatis的xml 文件中 需要添加
<![CDATA[a.update_date >= #{startTime} ]]>
- 3.2 逻辑运算符
运算符 | 功能 |
---|---|
AND | 只有所有条件满足时才会返回结果结果 |
OR | 只要其中一个条件满足就会返回查询结果 |
NOT | 条件不成立时返回查询结果 |
- 3.3 字符匹配符
在WHERE子句中 使用字符匹配符LIKE或NOT LIKE 可以把表达式与字符串进行比较,从而实现对字符串的模糊查询。
-
-
语法
-
WHERE expression [NOT] LIKE ‘string’
其中,[NOT]为可选项,‘string’表示进行比较的字符串。WHERE子句实现对字符串的模糊匹配,进行模糊匹配是在string字符串中使用通配符。
通配符 | 说明 | 示例 |
---|---|---|
% | 任意多个字符 | H% 表示查询以H开头的任意字符串,如Hello —– %h 表示查询以h结尾的任意字符串,如Growth —— %h% 表示查询在任何位置包含字母的h的所有字–符串,如hui,zhi |
_ | 单个字符 | H_ 表示查询以H开头,后面跟任意一个字符的两位字符串,如Hi,He |
[] | 指定范围的单个字符 | H[ea]% 表示查询以H开头,第二个字符是e或a的所有字符串,如:Health,Hand ———- [A-G]% 表示查询以A到G之间的任意字符开头的所有字符串,如:Apple,Banana,Guide |
[^] | 不在指定范围的单个字符 | H[^ea]% 表示查询以H开头,的一个字符不是e或a的所有字符串,如:Hope,Hub ——— [^A_G]% 表示查询不是以A到G之间的任意字符开头的字符串,如;Job,Zoo |
4.ORDER BY 子句
有些时候,在使用SELECT语句进行数据查询后,想先看到众多数据中最新的信息或某列的最大值,就可以使用ORDER BY子句对生成的结果集进行排序。
-
-
语法
-
ORDER BY order_experssion[ASC | DESC]
其中,order_experssion表示用于排序的列或列名及表达式。当有多个排序列时,每个排序了列用逗号隔开,而且列后都可以跟一个排序要求。
ASC—–升序排序(默认值)
DESC—降序排序
5.GROUP BY 子句
使用GROUP BY 子句可以将查询结果按照某一列数据值进行分类,换句话说,就是对查询结果的信息进行归纳,以汇总相关数据。
-
-
语法
-
GROUP BY group_by_expression[ WITH ROLLUP|CUBE ]
其中 ,group_by_expression表示分组所依据的列,ROLLUP表示只返回第一个分组条件指定的列的统计行,若改变列的顺序就会使返回的结果行数据发生变化。CUBE是ROLLUP的扩展,表示除了返回由GROUP BY子句指定的列外,还返回按组统计的行。GROUP BY 子句通常与统计函数联合使用。如下表:
函数名 | 功能 |
---|---|
% | 任意多个字符 |
COUNT | 求组中项数 |
SUM | 求和 |
AVG | 求平均值 |
MAX | 求最大值 |
MIN | 求最小值 |
ABS | 求绝对值 |
ASCII | 求ASCII码 |
RAND | 产生随机数 |
在使用GROUP BY子句时,将GROUP BY子句中的列称为分割列或分组列,而且必须保证SELECT语句中列是可计算的值并且GROUP BY列表中。
6.HAVING
HAVING子句的用法类似WHERE子句,它指定了组或集合的搜索条件。HAVING子句通常与GROUP BY子句一起使用。HAVING子句的语法格式为:
HAVING search_conditions
其中search_conditions为查询所需的条件,即返回查询结果的满足条件。在使用GROUP BY 子句时,HAVING子句将限定整个GROUP BY子句创建的组。其具体规则如下:
1.如果指定了GROUP BY 子句,则HAVING 子句的查询条件应用于GROUP BY子句创建的组
2.如果指定了WHERE子句而没有指定GROUP BY子句,则HAVING子句的查询条件将应用于WHERE子句的输出结果集
3. 如果既没有指定WHERE子句又没有指定GROUP BY子句,则HAVING子句的查询条件将用于FROM子句的输出结果集