文章目录
- 内置函数
- 时间函数
- 字符串函数
- 数学函数
- 其他函数
- 复合查询
- 多表笛卡尔积
- 自连接
- 在where中使用子查询
- 多列子查询
- 在from中使用子查询
- 内连接
- 外连接
- 左外连接
- 右外连接
内置函数
时间函数
函数 | 描述 |
---|---|
current_date() | 当前日期 |
current_time() | 当前时间 |
current_timestamp() | 当前时间戳 |
date(datetime) | 返回datetime参数的日期部分 |
date_add(date, interval val) | 在date中加上参数的日期或时间 |
date_sub(date, interval val) | 在date中加上参数的日期或时间 |
datediff(date1, date2) | 返回两个日期之间的时间差,单位为天 |
now() | 当前日期和时间 |
字符串函数
函数 | 描述 |
---|---|
charset(str) | 返回字符串的字符集 |
concat(str2 [, …]) | 连接字符串 |
instr(string, ch) | 返回ch在string中出现的位置,没有返回0 |
ucase(str) | 转换为大写 |
lcase(str) | 转换为小写 |
left(str, length) | 从str中的左边起取length个字符 |
length(str) | str的长度 |
replace(string, str, replace_str) | 在string中用replace_str替换str |
strcmp(str1, str2) | 逐字符比较两字符串的大小 |
substring(str, pos [, length]) | 从str的pos开始取length个字符 |
ltrim(str) rtrim(str) trim(str) | 去除前空格或者后空格 |
select concat(name, '的语文是',chinese,'分,数学是',math,'分') as '分数' from
student;
数学函数
函数 | 描述 |
---|---|
abs(num) | 绝对值函数 |
bin(num) | 十进制转换二进制 |
hex(num) | 转换为十六进制 |
conv(num, from_base, to_base) | 进制转换 |
ceiling(num) | 向上去整 |
floor(num) | 向下去整 |
format(num, decimal_places) | 格式化,保留小数位数 |
rand() | 返回随机浮点数,范围[0.0, 1.0) |
mod(num, denominator) | 取模,求余 |
向上去整:往上找比数值大的最小整数
向下去整:往下找比数值小的最大整数
0向去整:找比数值更靠近0的并且里数值最近的整数
其他函数
函数 | 描述 |
---|---|
user() | 查询当前用户 |
md5(str) | 对一个字符串进行md5摘要,摘要后得到一个32为字符串 |
database() | 显示当前正在使用的数据库 |
password() | 对用户加密 |
ifnull(val1, val2) | 如果val1为null,返回val2, 否则返回val1 |
复合查询
为了更好演示效果,演示的数据库中有三张表, emp(员工信息)、dept(部门信息)、salgrad(薪资信息)
多表笛卡尔积
如果想要查询的结果需要多张表结合才能搜索出,则可以直接多表结合去查询。
需要注意,如果查询的列中有大于一张表拥有同名的列信息则需要指明表
可以看到如图的写法就会出现很多重复的员工信息,这是因为直接结合的话会把所有表的数据都结合进去,这样并不符合实际场景。
因此可以加上筛选条件,因为两张表是具有外键关联的,所以可以使用外键的列作为结合的条件
自连接
并不需要有多张真实存在的物理属性的表才可以结合,因为单张表操作得出的结果也可以看作是一张表,在MySQL中一切皆为表结构,所以单张表得出的虚拟表也可以和其本身去结合
不过需要注意如果使用自连接需要对表进行不同的别名,这样系统才能分辨出区别
例如:找出名为SMITH的员工的上级领导的编号和姓名(mgr是员工领导的编号–empno)
在where中使用子查询
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询
例如:显示SMITH同一部门的员工
例如:查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号
其中关键字in的作用是,查询集合是否包含了该条件
例如:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
其中关键字all表示:集合中的所有数据
例如:显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号
其中关键字any表示:集合中的任意一个数据
多列子查询
这是只使用一列作为子查询的条件,也可以同时使用多列作为查询条件
多列子查询是指查询返回多个列数据的子查询语句
例如:查询和SMITH的部门和岗位完全相同的所有雇员
在from中使用子查询
子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用
例如:**查找每个部门工资最高的人的姓名、工资、部门、最高工资 **
内连接
内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选
select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;
外连接
左外连接
左侧的表完全显示就是左外连接,如果右侧的表不对应左侧的表则为NULL
右外连接
右侧的表完全显示就是右外连接,如果左侧的表不对应右侧的表则为NULL