【数据库】sql函数和多表关联查询

news2024/11/13 18:42:17

目录

一,SQL函数

1,聚合函数

1, count函数

2, AVG函数

3, SUM函数

4, MAX函数

5, MIN函数

6,数据分组——GROUP BY

7,限定组的结果,HAVING

8, HAVING与WHERE的区别

9,对结果集排序:order by

 10,MySQL多行数据合并:GROUP_CONCAT

11,查询结果限定

2,数值型函数

3,字符串函数

 示例:

4,日期和时间函数

 示例

5,流程控制函数

1,IF(expr,v1,v2)

2,IFNULL(v1,v2) 

3,CASE value WHEN

4,CASE WHEN

二,多表关联查询

 1,inner join:内连接

 2,leftjoin:左连接

 3,rightjoin:右连接

 4,自连接

 5,​交叉连接


一,SQL函数

1聚合函数

聚合函数对一组值进行运算,并返回单个值。也叫分组函数。

COUNT(*|列名) 统计行数,*表示所有记录都不忽略,指定列名时会忽略null

AVG(数值类型列名) 平均值,忽略null

SUM (数值类型列名) 求和,忽略null

MAX(列名) 最大值,忽略null

MIN(列名) 最小值,忽略null

  

t1的所有记录如下图所示:

 

1, count函数

COUNT(*|列名) 统计行数,*表示所有记录都不忽略,指定列名时会忽略null

(1)统计t1表有多少行

select count(*) from t1;

 

 

(2)统计t1表中的performance 列有多少行,不统计null

select count(performance) from t1;

 

 

2, AVG函数

AVG(数值类型列名) 平均值,忽略null

统计t1表中salary的平均值

select avg(salary) from t1;

 

3, SUM函数

SUM(数值类型列名) 求和,忽略null

统计t1表中salary的和

select sum(salary) from t1;

 

 

4, MAX函数

MAX(列名) 最大值,忽略null

MIN统计t1表中salary的最大值

select max(salary) from t1;

 

 

 

5, MIN函数

 MIN(列名) 最小值,忽略null

统计t1表中salary的最小值

select min(salary) from t1;

 

 

6,数据分组——GROUP BY

GROUP BY子句的真正作用在于与各种聚合函数配合使用。它用来对查询出来的数据进行分组。

分组的含义是:把该列具有相同值的多条记录当成一组记录处理,最后只输出一条记录。

 

 数据分组--GROUP BY

语法:SELECT column,group_function FROM table[WHEREcondition]

 [GROUP BY group_by_expression]

查看dept表下的所有信息:

select * from dept;

 

  查看表employee的所有信息:

select * from employee;

 

 (1)每个部门的平均工资

select dept_id,avg(salary) from employee group by dept_id;

 

(2)出现在select后的字段都,它必须出现在GROUP BY子句中

select dept_id,d_name,avg(salary) from employee group by dept_id,d_name;

(3)出现在group by子句的字段可以不出现在select的列表当中

select dept_id,avg(salary) from employee group by dept_id,d_name;

7,限定组的结果,HAVING

限定组的结果:HAVING子句,HAVING子句用来对分组后的结果再进行条件过滤。

语法:SELECT column, group_function FROM table [WHEREcondition] [GROUP BY group_by_expression]  [HAVING group_condition] [ORDER BY column];

(1)查询部门平均工资大于400部门

select d_name,avg(salary) from employee group by d_name having avg(salary) >400;

 

 

8, HAVING与WHERE的区别

HAVING与WHERE的区别:WHERE是在分组前进行条件过滤, HAVING子句是在分组后进行条件过滤,WHERE子句中不能使用聚合函数,HAVING子句可以使用聚合函数。

 

(1)查找employee表中dept_id>1d_nameavg(salary)

方法一:where

select d_name,avg(salary) from employee where dept_id>1 group by d_name;

方法二:having

select d_name,avg(salary) from employee group by d_name,dept_id having dept_id>1;

9,对结果集排序:order by

对结果集排序:查询语句执行的查询结果默认是按数据插入顺序排列,实际上可能需要按某列的值大小排列,按某列排序采用order by 列名[desc],列名…;设定排序列的时候可采用列名、列别名。

(1)查找employee表中dept_id>1d_nameavg(salary),并对平均工资进行升序排序

select d_name,avg(salary) asalary from employee group by d_name,dept_id having deept_id>1 order by asalary;

(2)查找employee表中按照d_name分组的dept_id>1avg(salary)>=300d_nameavg(salary)并按升序排序

select d_name,avg(salary) asalary from employee where dept_id>1 group by d_name having asalary >=300 order by asalary;

 

 

 10,MySQL多行数据合并:GROUP_CONCAT

 (1)查找employee表中按照组dept_idd_name分组的dept_id,d_name,avg(salary),e_id并把属于一组的e_id合并输出在一行

select dept_id,d_name,avg(salary),group_concat(e_id) from employee group by dept_id,d_name;

(2)查找employee表中dept_idd_name,avg(salary),e_id,name,并把属于一组的e_id与name合并输出在一行

select dept_id,d_name,avg(salary),group_concat(e_id),group_concat(name) from emplloyee

注意:使用 GROUP_CONCAT()函数必须对源数据进行分组,否则所有数据会被合并成一行

(3)查找dept表中的部门名称并将查到的多行结果合并一行

select group_concat(d_name) from dept;

11,查询结果限定

查询结果限定,在SELECT语句最后可以用LIMLT来限定查询结果返回的起始记录和总数量。MySQL特有。

语法:SELECT … LIMIToffset_start,row_count;

offset_start:第一个返回记录行的偏移量。默认为0。

row_count:要返回记录行的最大数目。

dept表有5行数据

select * from dept;

 

 

(1)显示表dep前t三行数据

select * from dept limit 3;

 

 

(2)从第3行开始,显示3行内容(n,m从n+1行开始,显示m行内容)

select * from dept limit 2,3;

 

 

 

 

 

 

2,数值型函数

函数名称

作用

ABS

求绝对值

SQRT

求平方根

POW 和 POWER

两个函数的功能相同,返回参数的幂次方

MOD

求余数

CEIL 和 CEILING

两个函数功能相同,都是返回不小于参数的最小整数,即向上取整

FLOOR

向下取整,返回值转化为一个BIGINT

RAND

生成一个0~1之间的随机数,传入整数参数时,用来产生重复序列

ROUND

对所传参数进行四舍五入

SIGN

返回参数的符号

 

 

3,字符串函数

函数名称

作用

LENGTH

计算字符串长度函数,返回字符串的字节长度

CHAR_LENGTH

计算字符串长度函数,返回字符串的字符长度,注意两者的区别

CONCAT

合并字符串函数,返回结果为连接参数产生的字符串,参数可以是一个或多个

INSERT(str,pos,len,newstr)

替换字符串函数

LOWER

将字符串中的字母转换为小写

UPPER

将字符串中的字母转换为大写

LEFT(str,len)

从左侧字截取符串,返回字符串左边的若干个字符

RIGHT

从右侧字截取符串,返回字符串右边的若干个字符

TRIM

删除字符串左右两侧的空格

REPLACE(s,s1,s2)

字符串替换函数,返回替换后的新字符串

SUBSTRING(s,n,len)

截取字符串,返回从指定位置开始的指定长度的字符换

REVERSE

字符串反转(逆序)函数,返回与原始字符串顺序相反的字符串

STRCMP(expr1,expr2)

比较两个表达式的顺序。若expr1 小于 expr2 ,则返回 -1,0相等,1则相反

LOCATE(substr,str [,pos])

返回第一次出现子串的位置

INSTR(str,substr)

返回第一次出现子串的位置

 

 示例:

统计dept表中d_name的长度

select length(d_name) from dept;

 

 

 

4,日期和时间函数

函数名称

作用

CURDATE() CURRENT_DATE() CURRENT_DATE

两个函数作用相同,返回当前系统的日期值

CURTIME CURRENT_TIME() CURRENT_TIME

两个函数作用相同,返回当前系统的时间值

NOW()

返回当前系统的日期和时间值

SYSDATE

返回当前系统的日期和时间值

DATE

获取指定日期时间的日期部分

TIME

获取指定日期时间的时间部分

MONTH

获取指定日期中的月份

MONTHNAME

获取指定曰期对应的月份的英文名称

DAYNAME

获取指定曰期对应的星期几的英文名称

YEAR

获取年份,返回值范围是 1970〜2069

DAYOFWEEK

获取指定日期对应的一周的索引位置值,也就是星期数,注意周日是开始日,为1

WEEK

获取指定日期是一年中的第几周,返回值的范围是否为 0〜52 或 1 〜53

DAYOFYEAR

获取指定曰期是一年中的第几天,返回值范围是1~366

DAYOFMONTH 和 DAY

两个函数作用相同,获取指定日期是一个月中是第几天,返回值范围是1~31

DATEDIFF(expr1,expr2)

返回两个日期之间的相差天数,如 SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30');

SEC_TO_TIME

将秒数转换为时间,与TIME_TO_SEC 互为反函数

TIME_TO_SEC

将时间参数转换为秒数,是指将传入的时间转换成距离当天00:00:00的秒数,00:00:00为基数,等于 0 秒

 

 示例

查看当前时间:

select CURRENT_DATE;

 

 

 

 

5,流程控制函数

函数名称

作用

IF(expr,v1,v2)

判断,流程控制,当expr = true时,或者为1时返回 v1,当expr = false、null 、0时返回v2

IFNULL(v1,v2)

判断是否为空,如果 v1 不为 NULL,则 IFNULL 函数返回 v1,否则返回 v2

CASE

搜索语句

 

 

1,IF(expr,v1,v2)

判断,流程控制,当expr = true时,或者为1时返回 v1,当expr = false、null 、0, ' '时返回v2

(1)使用IF()函数进行条件判断

如果表达式12>3成立,返回yes,否则返回no;

select if(12>3,'yes','no');

(2)分别显示emp表有奖金和没奖金的员工信息。

在数据库chap04下创建emp表,包含id int primary,name char(30) nut null,comm int三个字段

create table emp(

    id int primary key,

    name char(30) not null,

    comm int

    );

给表emp中插入数据

insert into emp values (1,'xioaming',2000),(2,'xiaohong',300),(3,'xiaohei',3200);

insert into emp (id,name) values (4,'xiaobai'),(5,'xiaolan');

查看表emp的所有信息

select * from emp;

分别显示emp表有奖金和没奖金的员工信息。

select id,name,if(comm is null,'没奖金','有奖金') '备注' from emp;

2,IFNULL(v1,v2) 

IFNULL(v1,v2)  判断是否为空,如果 v1 不为 NULL,则 IFNULL 函数返回 v1,否则返回 v2

IFNULL() 函数语法格式为:IFNULL(expression, alt_value)

IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为NULL 则返回第一个参数的值。

select ifnull(null,2);

3,CASE value WHEN

使用CASE value WHEN语句执行分支操作

语法:CASE  <表达式>

   WHEN<值1> THEN<操作>

   WHEN<值2> THEN<操作>

   ...

   ELSE<操作>

END

 

将 <表达式> 的值逐一和每个 when的 <值> 进行比较,如果跟某个<值>相等,则执行它后面的 <操作> ,如果所有 when的值都不匹配,则执行 else的操作,如果 when的值都不匹配,且没写 else,则会报错。

(1)判断输入的值是否为3,如果是3,输出three;

select case 3 when 1 then 'one' when 2 then 'two' when 3 then 'three' else 'other' end;

(2)

employee的所有信息如下

查找employee表下的dept_id,name,部门,当dept_id等于1,部门为boss,当dept_id等于2,部门为'finamce' ,3 ,'sale'; 4, 'tech'

select dept_id,name,case dept_id when 1 then 'boss' when 2 then 'finamce' when 3 then 'sale' when 4 then 'tech' end '部门' from employee;

4,CASE WHEN

使用CASE WHEN语句执行分支操作

判断条件放到when后面

select name,salary,case

    when salary<=300 then '[0,300]'

    when salary<=500 then '(300,500]'

    when salary<=1000 then '(500,1000]'

    end

    'salary level'

    from employee;

 

 

 

二,多表关联查询

1,inner join:内连接

inner join:内连接,只取得键值一致的部分,代表选择的是两个表键值交叉的部分。

语法如下:

SELECT列名1,列名2... FROM表1 INNER JOIN 表2 ON表1.列=表2.列 [and条件表达式 ][ WhERE条件语句 ] [ orderby列 [desc] ];

查看dept表的所有信息

select * from dept;

查看employee表的所有信息

select * from employee;

employee表中的dept_id是dept表中d_id的外键

(1)查找employeedept_id中和dept表中d_id相等的所有记录

select * from employee e inner join dept d on e.dept_id=d.d_id;

(2)查找职员的部门

select e.name,d_name from employee e inner join dept d on e.dept_id=d.d_id;

(3)查找销售部门的职员姓名

select e.name,d_name from employee e inner join dept d on e.dept_id=d.d_id where d.d_name='sale';

(4)查找工资大于等于300的职员信息

方法一:

select e.name,d_name,e.salary from employee e inner join dept d on e.dept_id=d.d_id and salary>=300;

方法二:

select e.name,d_name,e.salary from employee e inner join dept d on e.dept_id=d.d_id where salary>=300;

2,leftjoin:左连接

leftjoin:左连接,代表选择的是前面一个表的全部。左连接是以左表为标准,只查询在左边表中存在的数据。语法如下:

SELECT列名1 FROM表1 LEFTOUTERJOIN表2 ON表1.列=表2.列 WhERE条件语句;

employee表中的所有记录如下所示:

select * from employee;

dept表中的所有记录如下所示

select * from dept;

显示所有员工的信息,包括没有部门的员工

select * from employee e left join dept d on e.dept_id=d.d_id;

显示所有部门的信息,包括没有员工的部门

select * from dept d left join employee e on e.dept_id=d.d_id;

工资大于等于300的信息

select * from employee e left join dept d on e.dept_id=d.d_id where salary>=300;

工资大于等于300的信息按升序排序

select * from employee e left join dept d on e.dept_id=d.d_id where salary>=300 order by salary;

 

 

3,rightjoin:右连接

3.rightjoin:右连接,代表选择的是后面一个表的全部。右连接将会以右边作为基准,进行检索。语法如下:

SELECT列名1 FROM表1 RIGHTOUTERJOIN表2 ON表1.列=表2.列 WhERE条件语句;

显示所有部门的信息,包括没有员工的部门

select * from employee e right join dept d on e.dept_id=d.d_id;​

 

 

显示所有员工的信息,包括没有部门的员工

select * from dept d right join employee e on e.dept_id=d.d_id;

 

 4,自连接

自连接,自连接顾名思义就是自己跟自己连接,参与连接的表都是同一张表。(通过给表取别名虚拟出)

查找比自己mgr岁数大的员工和mgr的姓名和年龄

(1)创建表t4

create table t4(

    name char(30),

    age int,

    mgr char(20)

    );

 

(2)向表t4中插入数据:

insert into t4 values ('xiaoming',29,'xiao'),('xiaohong',26,'xiao'),('zhouyi',19,'zhou'),('xiao',28,'booss'),('zhou',30,'boss');

 

 (3)查看t4表的所有信息

select * from t4;

 

 (4)查找比自己mgr岁数大的员工和mgr的姓名和年龄(两张表之间的逗号也可以换为join)

select e.name,e.age,m.name mgr,m.age mgr_age from t4 e,t4 m where e.mgr=m.name and e.age > m.age;

5,​交叉连接

交叉连接:不适用任何匹配条件。生成笛卡尔积

表t1的信息如下:

select * from t1;

表dept的信息如下:

select * from dept;

查询表t1与表table的交叉连接

select * from dept,t1;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/343302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在线支付系列【23】支付宝开放平台产品介绍

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录前言支付产品App 支付手机网站支付电脑网站支付新当面资金授权当面付营销产品营销活动送红包会员产品App 支付宝登录人脸认证信用产品芝麻 GO芝麻先享芝麻免押芝麻工作证安全产品交易安全防护其…

Centos7上Docker安装

文章目录1.Docker常识2.安装Docker1.卸载旧版本Docker2.安装Docker3.启动Docker4.配置镜像加速前天开学啦~所以可以回来继续卷了哈哈哈&#xff0c;放假在家效率不高&#xff0c;在学校事情也少点(^_−)☆昨天和今天学了学Docker相关的知识&#xff0c;也算是简单了解了下&…

设计模式C++实现12:抽象工厂模式

参考大话设计模式&#xff1b; 详细内容参见大话设计模式一书第十五章&#xff0c;该书使用C#实现&#xff0c;本实验通过C语言实现。 抽象工厂模式&#xff08;Abstract Factory&#xff09;&#xff0c;提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们…

Python之字符串精讲(下)

前言 今天继续讲解字符串下半部分&#xff0c;内容包括字符串的检索、大小写转换、去除字符串中空格和特殊字符。 一、检索字符串 在Python中&#xff0c;字符串对象提供了很多用于字符串查找的方法&#xff0c;主要给大家介绍以下几种方法。 1. count() 方法 count() 方法…

CHAPTER 5 Jenkins SonarQube

Jenkins & SonarQube5.1 安装SonarQube1. 下载镜像2. 导出到其他服务器3. 准备工作4. docker-compose文件5. 启动容器5.2 登录SonarQube1.登录2. 安装中文语言插件3. 安装其他插件5.3 部署扫描器sonar-scanner1. 部署sonar-scanner2. 新建项目3. 扫描代码4. 查看报告5.4 Je…

Prometheus 的介绍和安装

介绍 Prometheus 是一个开源的监控和报警系统,最初由SoundCloud于2012年创建,随着越来越多的公司采用Prometheus以及非常活跃的社区,Prometheus于2016年加入云原生基金会,成为Kubernetes之后的第二个托管项目,并于2018年毕业。 特点 通过PromQL来对基于指标名称和键值对…

独立产品灵感周刊 DecoHack #047 - 安卓手机上最有用的APP

本周刊记录有趣好玩的独立产品设计开发相关内容&#xff0c;每周发布&#xff0c;往期内容同样精彩&#xff0c;感兴趣的伙伴可以点击订阅我的周刊。为保证每期都能收到&#xff0c;建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。&#x1f4bb; 产品推荐 1. Bouncer Tempor…

算法训练营 day45 动态规划 0-1背包理论 分割等和子集

算法训练营 day45 动态规划 0-1背包理论 分割等和子集 0-1背包理论 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 在下面的讲解中&…

python 使用 thrift 教程

一、前言&#xff1a;   Thrift 是一种接口描述语言和二进制通信协议。以前也没接触过&#xff0c;最近有个项目需要建立自动化测试&#xff0c;这个项目之间的微服务都是通过 Thrift 进行通信的&#xff0c;然后写自动化脚本之前研究了一下。 需要定义一个xxx.thrift的文件&…

【C++】十分钟带你入门C++

目录零 内容概括一 C关键字二 命名空间2.1 命名空间定义2.2 命名空间的使用三 C输入和输出四 缺省参数4.1 缺省参数的概念4.2 缺省参数分类五 函数重载5.1 函数重载的概念六 引用6.1 引用概念6.2 引用特性6.3 常引用6.4 使用场景6.5 效率比较6.6 引用和指针的区别七 内联函数7.…

最简易的教程 -一篇文章教会你 用Python打包文件

前言 嗨嗨&#xff0c;好久不见&#xff0c;我是 我叫 … emmm你们好 我是一堆英文字母&#xff08;名字乱打的不好yi shi ~&#xff09; 看到文章的人多不多&#xff0c;我不知道 &#xff0c;招呼我还是要打一个的 &#x1f44d; 今天文章很简单&#xff0c;打包改图标 用…

C++关键字之const、inline、static

C 关键字总结 1.const const是 constant 的缩写&#xff0c;本意是不变的、不易改变的意思。在C中用来修饰内置类型变量&#xff0c;自定义对象&#xff0c;成员函数&#xff0c;返回值&#xff0c;函数参数使用如下&#xff1a; //修饰普通类型变量 const int a 7; int ba;…

人工智能对教育的冲击有多大?

人工智能对教育有巨大冲击 高考改革也会发生重大变化 教育系统其实是一个坚固的堡垒 再坚固也要适应未来 趣讲大白话&#xff1a;让我未来更有竞争力 *********** 创造和创新的意识和能力 复杂性和不确定性的适应能力 应该是改革的方向 【安志强趣讲信息科技】74期 掌握信息科…

【人工智能】对贝叶斯网络进行吉布斯采样

问题 现要求通过吉布斯采样方法&#xff0c;利用该网络进行概率推理&#xff08;计算 P(RT|SF, WT)、P2(CF|WT)的概率值&#xff09;。 原理 吉布斯采样的核心思想为一维一维地进行采样&#xff0c;采某一个维度的时候固定其他的维度&#xff0c;在本次实验中&#xff0c;假…

分享开放通达信l2接口的过程,开发之后怎么使用?

随着互联网的不断进步&#xff0c;信息技术的不断发展&#xff0c;通达信l2接口技术逐步成熟。那么&#xff0c;这些开放通达信l2接口开发的过程是怎么样的呢?期间又会遇到什么问题&#xff0c;开放之后又会怎么使用呢&#xff1f;这篇文章带你深入了解。 通达信l2接口不像一…

高通8155 GPS HAL层代码移植

1.添加gps hal层代码包 将ublox gps芯片的hal层代码拷贝至apps/LINUX/android/hardware/ublox/路径下&#xff0c;树状图如下&#xff1a; 2.修改编译选项 将新增的ublox gps hal层代码编译进入image&#xff0c;需要修改apps/LINUX/android/device/qcom/msmnile_gvmgh/路径下的…

基于Python来爬取某音动态壁纸,桌面更香了!

至于小伙伴们想要这个封图&#xff0c;我也没有。不过继续带来一波靓丽壁纸&#xff0c;而且是动态的&#xff0c;我的桌面壁纸又换了&#xff1a;每天换着花样欣赏一波波动态壁纸桌面立刻拥有了高颜值&#xff0c;简直跟刷美女短视频一样啊。对的&#xff0c;这些动态壁纸就是…

Linux信号一门搞定

1.信号是什么&#xff1f; 信号其实就是一个软件中断。 例&#xff1a; 输入命令&#xff0c;在Shell下启动一个前台进程。用户按下Ctrl-C&#xff0c;键盘输入产生一个硬件中断。如果CPU当前正在执行这个进程的代码&#xff0c;则该进程的用户空间代码暂停执行&#xff0c;…

Linux | Liunx安装Tomcat(Ubuntu版)

目录 一、下载并上传Tomcat压缩包到Ubuntu 1.1 下载并解压 1.2 执行 startup.sh 文件 二、验证Tomcat启动是否成功 2.1 查看启动日志 2.2 查看启动进程 三、Windows访问 Tomcat 服务 四、停止 Tomcat 服务 Tomcat是一款Web服务器&#xff0c;开发Web项目基本上都会用到…

应用篇|如何精准搜索一个答题考试小程序

应用篇|如何精准搜索一个答题考试小程序在线考试是一种非常节约成本的考试方式&#xff0c;考生通过微信扫码即可参加培训考试&#xff0c;不受时间、空间的限制&#xff0c;近几年越来越受企事业单位的青睐。比如有以下场景&#xff1a;为落实反电信网络诈骗普法宣传教育工作&…