子查询
当多个表中数据存在关联,且需要先由另一个表数据查询后使用进行当前表数据的查询
由多条sql语句组成用于返回指定数据
子查询中的sql语句一般返回一列数据并且有时可能返回唯一数据
函数
聚合函数
聚合函数:对一组值进行计算,并返回计算后的值 ,具有统计数据的作用,将多行数据进行聚合操作返回一个指定值
注意:在使用聚合函数时一般不会再对其他数据进行单独查询,因为聚合函数执行后仅返回一条数据,所以在进行查询时,如果其他数据存在多条也只返回第一条语句
sum()
求和,将指定列中所有数据求和后返回
avg()
求平均值,获取指定列平均值
max()
min()
count()
返回满足条件的行数
字符串函数
CHARSET(str) | 返回字串字符集 |
---|---|
CONCAT (string2 [,… ]) | 连接字串 |
INSTR (string ,substring ) | 返回substring在string中出现的位置,没有返回0 |
UCASE (string2 ) | 转换成大写 |
LCASE (string2 ) | 转换成小写 |
LEFT (string2 ,length ) | 从tring2中的左边起取length个字符 |
LENGTH (string ) | string长度 |
REPLACE (str ,search_str ,replace_str ) | 在str中用replace_str替换search_str |
STRCMP (string1 ,string2 ) | 逐字符比较两字串大小, |
SUBSTRING (str , position [,length ]) | 从str的position开始,取length个字符 |
LTRIM (string2 ) RTRIM (string2 ) trim | 去除前端空格或后端空格 |
charset()
返回指定字段字符串编码
concat()
连接字符串。将两字段数据或字符串进行连接
instr()
查找指定字符串出现的位置,不存在则返回0
ucase()
将指定字段数据已大写形式返回
lcase()
将指定字段数据已小写形式返回
left()
返回指定字段从左开始指定长度的数据
length()
返回指定字段字符个数
replace()
使用指定字符串替换字段中某一字符串
substring()
返回指定字段自定起始位置开始长度的字符串
trim()
空格替换
日期函数
用于进行日期转换以及日期格式定义的函数
ADDTIME (date2 ,time_interval ) | 将time_interval加到date2 |
---|---|
CURRENT_DATE ( ) | 当前日期 |
CURRENT_TIME ( ) | 当前时间 |
CURRENT_TIMESTAMP ( ) | **当前时间戳 ** |
DATE (datetime ) | 返回datetime的日期部分 |
DATE_ADD (date2 , INTERVAL d_value d_type ) | 在date2中加上日期或时间 |
DATE_SUB (date2 , INTERVAL d_value d_type ) | 在date2上减去一个时间 |
DATEDIFF (date1 ,date2 ) | 两个日期差 |
NOW ( ) | 当前时间 |
YEAR|Month|DATE (datetime ) | 年月日 |
current_date()
返回当前时间(date类型)
current_time()
返回当前时间(time类型)
current_timstamp()
返回当前时间(timestamp类型)
now()
返回当前时间(datatime类型)
date()
返回指定日期字段date部分数据
time()
返回指定日期字段time部分数据
date_add()
为包含date数据的日期类型进行添加
需要使用interval 进行数值的转换
date_sub()
为包含date数据的日期类型进行减少
datediff()
返回两个日期直接相差天数(第一个日期减第二个日期)
year()
返回指定日期类型的年
month()
返回指定日期类型的月
day()
返回指定日期类型的日
数学函数
abs()
返回数值类型绝对值
ceiling()
向上取整
floor()
向下取整
least()
获取一行数据中最小值
rand()
随机数
在数据库表中有以下字符数据,如:
13-1、13-2、13-3、13-10、13-100、13-108、13-18、13-11、13-15、14-1、14-2
现在希望通过SQL语句进行排序,并且首先要按照前半部分的数字进行排序,然后再按照后半部分的数字进行排序,输出要排成这样:
13-1、13-2、13-3、13-10、13-11、13-15、13-18、13-100、13-108、14-1、14-2
#-前面升序 -后面降序
select * from sort order by str
#查找每个-的位置
select instr(str,'-') from sort
#获取-左边的值
select CONVERT(left(str,instr(str,'-')-1),SIGNED) from sort
#获取-右边的值
select CONVERT(right(str,length(str)-instr(str,'-')),SIGNED) from sort
select * from sort order by CONVERT(left(str,instr(str,'-')-1),SIGNED) asc , CONVERT(right(str,length(str)-instr(str,'-')),SIGNED) desc
分组
关键字group by
使用指定字段进行分组,字段数据的个数就是分组的个数,这样在使用聚合函数时只会对相应分组进行聚合操作
聚合函数一般与分组一同使用,但是在进行条件判断时,如果对于聚合函数进行判断且存在分组那么不能使用where进行条件判断必须使用having(只针对于聚合函数的值的判断)
where进行筛选与having的区别
WHERE子句:
用来筛选 FROM 子句中指定的操作所产生的行
GROUP BY子句:
用来分组 WHERE 子句的输出
HAVING子句:
用来从分组的结果中筛选行
多表操作
在进行数据查询时想查询并返回多个表的数据的时候使用多表查询
连接查询
全连接
在进行多表连接查询时返回两表的笛卡尔积,在进行表连接时会将每张表的每一行与另一张表的每一行数据进行连接
注意:使用全连接会造成大量的冗余数据,所以一般在where语句中进行筛选
不建议使用全连接进行连接查询,因为全连接进行连接效率不高,因为是首先现将所有数据返回笛卡尔积之后使用where进行筛选
执行步骤为先将所有数据进行连接之后再进行条件筛选
内连接
INNER JOIN
语法:select *from 表1 inner join 表2 on 连接条件
内连接必须书写on连接条件(如果不写与全连接结构一致)
与全连接不同的是,内连接是在进行连接时直接将数据进行过滤之后进行返回
外连接
左外连接 (LEFT JOIN)
右外连接 (RIGHT JOIN)
语法:select * from 表1 left[right] join 表2 on连接条件
以左表或右表为准,保留左表或右表全部数据的基础上进行连接
sql查询语法总结
select 查询展示的字段与函数
from 数据源(可以是由另一个查询语句返回的结果作为表)
inner /left/right join 连接查询
on 连接条件
where 筛选条件
group by 分组字段
having 分组条件筛选
order by 排序字段 asc /desc
limit 起始行 ,截取行
在进行sql查询语句书写时
1、明确数据源连接
查询展示字段所在的表
2、筛选条件where
根据需求决定展示数据的行有哪些
3、分组条件
根据需求决定使用分组的字段(注意分组字段是以指定字段的值进行分组)
4、排序与截取