基础查询:select 查询列表 from 表名;
查询列表可以是表中字段,常量值,表达式,函数
取别名:as(可省略)
去重:查询字段名前加distinct
+的作用:加法,有字符串试图转换,转换不了直接为0,有null结果为null
concat(str1,str2…)拼接字符串,有null则全部为null
ifnull(可能为空字段,为空时值) null字段操作
条件查询:select 查询列表 from 表名 where 筛选条件
条件运算符:> < = != <> >= <=
逻辑表达式:&& || ! and or not
模糊查询:like, between and , in , is null, is not null
like:%包含任意字符;_包含一个字符;查询下划线用转义,escape “$”自定义转义符
between and:等价于>=… and <=… 语句简洁,包含临界值,范围数值不能颠倒
in:某字段值是否属于in列表某项,列表项值类型兼容,比or简洁
is null is not null
安全等于:<=> 可判空或其他数值: <=> null 等于空 ;可读性差;
排序查询:筛选条件后order by desc降序 asc升序(默认)
相同值排序乱序解决:加入唯一性字段排序,例如id
支持按别名、按函数、按多字段
一般放于最后(limit子句除外)
常见函数:
length(字节个数):中文gbk一个汉字占两个字节,utf8占三个字节
upper() lower()大小写转化
substr(字段,索引位置截取) 索引从1开始 同substring()
substr(字段,指定索引位置,字符长度)
instr(给定字段,查询字段) 查出需要查询字段的起始索引,查不出为0
trim(指定内容 from 给定字段) 去除给定字段前后指定内容
lpad(给定字段,填充后总长度,填充内容) 左填充
rpad(给定字段,填充后总长度,填充内容) 右填充
replace(给定字段,需要替换的内容,替换成的内容)
数学函数:
round(数字) 四舍五入
round(数字,小数点后取位数) 四舍五入
ceil(数字) 向上取整,返回>=该数字的最小整数
floor(数字) 向下取整,返回<=该数字的最大整数
truncate(数字,截断小数点后几位)
mod(被除数,除数) 取模 符号同被除数
日期函数
#返回日期日期比较大小,>0 DATE1大,<0 +++DATE2大
DATEDIFF(DATE1,DATE2);
#返回当前系统年月日时分秒
SELECT NOW();
#时间戳,适用于datetime
SELECT CURRENT_TIMESTAMP();
返回年月日
SELECT CURDATE();
SELECT CURRENT_DATE();
返回时分秒
SELECT CURTIME();
SELECT CURRENT_TIME();
年
SELECT YEAR(NOW());
年加今年第几周
SELECT YEARWEEK(NOW());
年加?
SELECT YEARWEEK(NOW(),2);
月
SELECT MONTH(NOW());
英文几月
SELECT MONTHNAME(NOW());
日
SELECT DAY(NOW());
SELECT DATEDIFF('2018-5-2','2018-4-22'); 前面日期减后面日期的天数
星期几
SELECT DAYNAME(NOW());
本月第几天
SELECT DAYOFMONTH('2017-9-4');
1-7:星期天到周六
SELECT DAYOFWEEK(NOW());
今年第几天
SELECT DAYOFYEAR(NOW());
日期格式化:都转化为1990-3-23
SELECT STR_TO_DATE('1990-3/23','%Y-%c/%d');
日期转化为指定字符串
SELECT DATE_FORMAT(NOW(),'%Y年%c月%d日');
其他函数:
SELECT VERSION();
SELECT DATABASE();
SELECT USER();
流程控制函数:
#同三元运算符
SELECT IF(10>11,'大','小');
#case:
一、同switch case
SELECT CASE 'ok'
WHEN 'o' THEN 'o'
WHEN 'o1' THEN 'o1'
WHEN 'o2' THEN 'o2'
ELSE 'ok1'
END AS result;
二、多重if
SELECT CASE
WHEN 1>2 THEN '1>2'
WHEN 2>2 THEN '2>2'
WHEN 3>2 THEN '3>2'
END AS result;
分组函数:用作统计,叫做聚合函数、统计函数、组函数(可distinct去重使用)
sum 求和、avg 平均值、max 最大值、min 最小值、count 计数
sum、avg 支持数值型,忽略null
max、min 支持数值、字符、日期,忽略null
count 计算非空字段行数,忽略null,count(*)(效率较高)、count(1)统计总行数
和分组查询一起查询的字段都是group by 后的字段
分组查询
select 分组函数 from 表 where 筛选条件 group by 分组的字段 order by 子句
分组函数做条件则使用having在group by 之后
分组前筛选效率好即用where
支持按表达式或函数分组(用地少)
按多个字段分组
Oracle不支持group by having
连接查询:多表查询
笛卡尔乘积表一m行,表二n行,结果m*n行
原因:没有有效连接条件
避免:添加有效的连接条件
标准分类
年代分类:
Sql92标准:仅支持内连接
Sql99标准【推荐】:支持所有内连接、外连接(左、右)、交叉连接
92标准:
功能分类:
内连接:
等值连接:结果为多表交集部分,n表连接至少有n-1个,多表顺序随意,可搭配排序分组筛选使用
注意:为表起别名(查询也要用别名(视图))
非等值连接:A表值between B表值1 and B表值2
自连接:同表起别名
99标准:
一、内连接:同上
特点:1、表的顺序可以互换
2、结果为表的连接交集
3、n表连接需要n-1给个连接条件
二、外连接:
特点:1、查询结果为主表中所有行,从表匹配的行或者null
2、left jion左边为主表,right jion 右边为主表,full join两边都是主表
左外连接:select 查询列表 from 表1 as别名 【连接类型】
jion表2 as别名
on 连接条件
where 筛选条件
右外连接:类似左外连接
全外连接:表1有表2没有,表2有表1没有,表1表2都有
mysql暂不支持
三、交叉连接:两表全查
select 表1.,表2. from 表1 cross jion 表2
子查询:查询字表为查询条件
where或having后面:1、标量子查询(结果集只有一行一列)
2、列子查询(多行子查询)
in /not in :在什么范围中的值
any/some:任意一个值
all:所有的值
select 后面(多用):
from后面:查询结果做结果集表,必须起别名
(not)exists后面:子查询有没有值,有为1,否则为0,可用in代替
分页查询:
limit offset,size
offset:起始位置,可省略默认值为0;(page-1)*size
size:查询数量
union联合查询
特点:查询的表没有连接关系但是查询信息(列数、列的类型和顺序)一致,自动去重,不去重用union all查询
查询语句1
union
查询语句2
union
……
网友评论