MySQL查询进阶操作从函数到表连接的使用

目录
  • 前言
  • 一、MySQL函数的使用
    • 1、单行函数
  • 二、MySQL的分组
  • 三、分页以及查询关键字的执行顺序
  • 四、子查询
    • 1、where子查询
    • 2、from子查询
  • 五、表连接
    • 1、内连接
    • 2、(左)外连接
    • 3、自连接

前言

书接上文,今天学习查询的进阶操作,包括函数、分组、分页、子查询和表连接。内容比较实用,建议收藏或者订阅专栏方便学习和复习。

一、MySQL函数的使用

  • mysql中内置了很多函数,每个函数都代表一个特定功能

1、单行函数

  • 特点:每行数据都会产生一个对应的结果

表中有多少行,就会有多少行的结果

  • 位置:select之后,from之前 或作为筛选条件

1.concat(…,列名,…,列名)
用来拼接多列的值

例如:以firstname+lastname的形式显示所有员工的姓名

select concat(first_name,last_name) as 全名 from employees

2.mod(值1,值2)
求值1和值2的取余结果 ,相当于数学运算中的 %(值1%值2)

  • 标准SQL规范中不存在%取余的写法,所以取余操作应该使用mod()
  • 例如:select mod(10,3) from dual

注: dual虚拟表,作用为使当前SQL符合语法规范,不写时会做自动填充

3.length(列名|数据)
获取长度

查询所有firstname长度>6的员工信息

select * from employees where length(first_name)>6

4.now() | sysdate()
获取系统当前时间

select now()
select SYSDATE()
select now() from dual

2、多行函数(组函数)

  • 以组为单位获取结果,一组得到一个结果
  • 如果未手动进行分组,则默认整张表为一组

1.sum(列名)

求某一列的总和

2.avg(列名)

求某一列的平均值

3.max(列名)

求某一列的最大值

4.min(列名)

求某一列的最小值

5.count(列名)

求某一列值的个数(非空)

示例:

-- 组函数操作salary
select
SUM(salary) 总和,AVG(salary) 平均值,MAX(salary) 最大值,min(salary) 最小值,COUNT(salary) 非空值的数量
from employees
-- 计算表中绩效列不为空的员工数量
select COUNT(commission_pct) from employees
-- 求表中的行数
select COUNT(*) from employees
select COUNT(employee_id) from employees

二、MySQL的分组

在MySQL中一个组就是一个操作单位

1.简单分组

select 列名 from 表名 group by 列名

以部门为单位求每个部门的平均薪资

select department_id,AVG(salary) 平均薪资 from employees group by department_id

2.where + 分组

-- 查询部门id为10、20、30的部门的平均薪资、
select department_id,AVG(salary) 平均薪资
from employees
where department_id in(10,20,30) -- 先筛选
GROUP BY department_id -- 后分组查询

3.having + 分组

select department_id,AVG(salary) 平均薪资
from employees
group by department_id -- 先分组
having department_id in(10,20,30)  -- 后筛选

4.分组中 where 和 having 的区别

  • where是在分组前执行,having是在分组后执行
  • where不能在分组时使用组函数,但是having可以
  • 当两者都可使用时,优先使用where,效率更高

三、分页以及查询关键字的执行顺序

1.limit:用来限制显示的查询结果条数,通常用于分页查询

select 列名 from 表名 limit 显示的起始下标,显示条数

查询所有员工数据的前十条

select * from employees limit 0,10
select * from employees limit 10 下标为0时可以省略

下标为0时可以省略

  • 当limit和其他查询关键字联用时,limit一定最后执行

查询的执行顺序:

语法顺序		执行顺序
select			5
from			1
where			2
group by		3
having			4
order by		6
limit			7

四、子查询

  • 当一个SQL需要借助于另一个SQL的执行结果,在当前SQL中嵌套另一个SQL,该写法称为子查询

1、where子查询

1.1、单值子查询

嵌套的子SQL只会返回一行一列的结果

-- 查询员工id为100的员工的部门id
select department_id from employees where employee_id=100

-- 子查询::查询员工id为100的员工所在的部门信息
select * from departments
where department_id=(select department_id from employees where employee_id=100)
  • 优先执行内层SQL,再执行外层SQL
  • 子SQL需写入小括号

1.2、多值子查询 嵌套的子SQL会返回多个结果

--查询firstname中包含s的员工所在的部门信息
select * from departments
where department_id in(select department_id from employees where first_name like '%s%')

2、from子查询

将子SQL的查询结果临时看做一张表进行后续操作

-- 获取薪资最高的前十个员工的平均薪资
-- 先获取薪资最高的前十名员工的薪资
select salary from employees ORDER BY salary desc LIMIT 10
-- 子查询:再根据子SQL的查询结果临时通过别名构建一张数据表进行查询
select avg(salary) from (select salary from employees ORDER BY salary desc LIMIT 10) as e

五、表连接

  • 当查询结果需要从多张表中获取时,则需要将多张表连接起来进行查新操作

表连接的前提:

  • 多张表之间必须存在关联关系(外键)
  • 外键通常连接的是另一张表的主键
  • 在进行表连接时作为连接条件使用

1、内连接

语法:

select 表1.列名,表2.列名,...
from 表1 inner join 表2
on 连接条件
  • 特点:对两张表同时进行约束,只有当所有表都符合连接条件,才会显示信息
  • 使用:inner可省

2、(左)外连接

语法:

select 表1.列名,表2.列名,...
from 表1(左表) left outer join 表2(右表)
on 连接条件
  • 特点:只对右表做约束,左表中的数据都会显示,右表中只有符合连接条件的才会显示
  • 使用:outer可省
  • 左外连接和右外连接就是leftright的不同,位置不同,通常用左外连接
  • 使用:
-- 查询所有的员工信息及符合连接条件的部门信息
select e.*,d.*
from employees e LEFT JOIN departments d
ON e.department_id=d.department_id

全外连接:

  • 将两个查询结果进行合并显示

查询语句1 union 查询语句2

  • 使用:
-- 内连接
select e.*,d.*
from employees e inner join departments d
on  e.department_id=d.department_id

union -- 对内连接和左连接的查询结果进行合并

-- 左连接
select e.*,d.*
from employees e LEFT JOIN departments d
ON e.department_id=d.department_id
  • union会对合并结果进行去重
  • union all不会对结果去重
  • 特点:合并双方都不做约束
  • 合并双方的查询结果字段的个数、顺序必须一致

实际开发中,使用频率较高的是内连接和左外连接

3、自连接

  • 概念:是特殊的表连接,参与连接的是同一张表

具体使用:

表中的某两个字段之间存在关联关系

-- 查询:员工id、员工姓名-firstname、直接领导的id、直接领导的姓名
select e1.employee_id 员工id,e1.first_name 员工姓名,e2.employee_id 领导id,e2.first_name 领导姓名
from employees e1 LEFT JOIN employees e2-- e1代表获取员工信息的表,e2代表获取领导信息的表
ON e1.manager_id=e2.employee_id -- 把两个有关联关系的字段作为连接条件

判断同一字段,作为连接条件

-- 查询工资相同的员工信息
select e1.employee_id 员工1的id,e1.salary 员工1的工资,e2.employee_id 员工2的id,e2.salary 员工2的工资
from employees e1 LEFT JOIN employees e2
on e1.salary=e2.salary -- 连接条件
where e1.employee_id<e2.employee_id -- 防止判断的双方是同一个人,并去重

到此这篇关于MySQL查询进阶从函数到表连接的使用的文章就介绍到这了,更多相关MySQL函数表连接内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL中基本的多表连接查询教程

    一.多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: 由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE, ON或USING条件的时候一般不建议使用,因为当数据表项目太多的时候,会非常慢.一般使用LEFT [OUTER] JOIN或者RIGHT [OUTER] JOIN 2.   内连接INNER JOIN 在MySQL中把I SELECT * FROM table1 CROSS JOIN tabl

  • MySQL多表连接查询详解

    目录 多表连接查询 内连接 左连接 右连接 子查询 总结 多表连接查询 表与表之间的连接分为内连接和外连接 内连接:仅选出两张表互相匹配的记录 外连接:既包括两张表匹配的记录,也包括不匹配的记录,同时外连接又分为左外连接(左连接)和右外连接(右连接) 内连接 首先准备两张表 学生student表 分数score表 内连接:在每个表中找出符合条件的共有记录 查询student表中的学生姓名和分数 第一种写法:只使用where select a.s_name, b.s_score from stud

  • MySQL的LEFT JOIN表连接的进阶学习教程

    LEFT JOIN的主表 这里所说的主表是指在连接查询里MySQL以哪个表为主进行查询.比如说在LEFT JOIN查询里,一般来说左表就是主表,但这只是经验之谈,很多时候经验主义是靠不住的,为了说明问题,先来个例子,建两个演示用的表categories和posts: CREATE TABLE IF NOT EXISTS `categories` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(15) NOT NULL

  • MySQL多表连接的入门实例教程

    连接可用于查询,更新,建立事实外键(指人为建立的两张表的对应关系,相对的,FORGIEN KEY也称物理外键) 表的连接实质就是外键的逆向约束 连接条件 使用ON设定连接条件,也可以用WHERE代替. 一般情况下 ON:设定连接条件 WHERE:进行结果集记录的过滤 没有条件的JOIN内连接实质就是笛卡尔积 [INNER] JOIN 内连接 在MySQL中,JOIN, CROSS JOIN 和 INNER JOIN 是等价的. 内连接表示交集,仅显示A.B两表符合连接条件的记录.不符合连接条件的

  • MySQL中对表连接查询的简单优化教程

    在MySQL中,A LEFT JOIN B join_condition执行过程如下: · 根据表A和A依赖的所有表设置表B. · 根据LEFT JOIN条件中使用的所有表(除了B)设置表A. · LEFT JOIN条件用于确定如何从表B搜索行.(换句话说,不使用WHERE子句中的任何条件). · 可以对所有标准联接进行优化,只是只有从它所依赖的所有表读取的表例外.如果出现循环依赖关系,MySQL提示出现一个错误. · 进行所有标准WHERE优化. · 如果A中有一行匹配WHERE子句,但B中没

  • mysql delete 多表连接删除功能

    单个表的删除: DELETE FROM tableName WHERE columnName = value; 删除表内的所有行: 即:保留表的结构.属性.索引 DELETE FROM tablename; DELETE * FROM tablename; 删除同一张表内的所有内容(删除数据.表结构) TRUNCATE customer; 无法报告删除了几行,且只能用于单一表 多表连接删除: DELETE orders,itrms FROM orders,items WHERE orders.u

  • MySQL查询进阶操作从函数到表连接的使用

    目录 前言 一.MySQL函数的使用 1.单行函数 二.MySQL的分组 三.分页以及查询关键字的执行顺序 四.子查询 1.where子查询 2.from子查询 五.表连接 1.内连接 2.(左)外连接 3.自连接 前言 书接上文,今天学习查询的进阶操作,包括函数.分组.分页.子查询和表连接.内容比较实用,建议收藏或者订阅专栏方便学习和复习. 一.MySQL函数的使用 mysql中内置了很多函数,每个函数都代表一个特定功能 1.单行函数 特点:每行数据都会产生一个对应的结果 表中有多少行,就会有

  • MySQL查询in操作 查询结果按in集合顺序显示

    MySQL 查询in操作,查询结果按in集合顺序显示 复制代码 代码如下: select * from test where id in(3,1,5) order by find_in_set(id,'3,1,5'); select * from test where id in(3,1,5) order by substring_index('3,1,2',id,1); 偶尔看到的...或许有人会注意过,但我以前真不知道 SQL: select * from table where id IN

  • MySQL数据库查询进阶之多表查询详解

    目录 一.多表查询 1.引出 2.笛卡尔积 3. 笛卡尔积的解决方法 二.多表查询分类 1.等值连接和非等值连接 2.自连接和非自连接 3.内连接和外连接 4.UNION 4.自然连接 5.using连接 三.子查询 1.不相关子查询 2.相关子查询 四.聚合函数 1.聚合函数介绍 1.1 AVG和SUM函数 1.2 MIN和MAX函数 1.3 COUNT函数 2.group by 3.使用having进行分组后的筛选 五.where和having的对比 六.select的执行过程 1.关键字顺

  • MySQL单表查询常见操作实例总结

    本文实例总结了MySQL单表查询常见操作.分享给大家供大家参考,具体如下: 创建fruits表: CREATE TABLE fruits ( f_id char(10) NOT NULL, s_id INT NOT NULL, f_name char(255) NOT NULL, f_price decimal(8,2) NOT NULL, PRIMARY KEY(f_id) ) ; INSERT INTO fruits (f_id, s_id, f_name, f_price) VALUES(

  • Go语言集成mysql驱动、调用数据库、查询数据操作示例

    本文实例讲述了Go语言集成mysql驱动.调用数据库.查询数据操作.分享给大家供大家参考,具体如下: 1.安装第三方mysql驱动包 go get -u github.com/go-sql-driver/mysql 2.连接数据库基本代码 复制代码 代码如下: package main import (         _"github.com/go-sql-driver/mysql"  // 注意前面的下划线_, 这种方式引入包只执行包的初始化函数         "dat

  • MySQL查询语句简单操作示例

    本文实例讲述了MySQL查询语句简单操作.分享给大家供大家参考,具体如下: 查询 创建数据库.数据表 -- 创建数据库 create database python_test_1 charset=utf8; -- 使用数据库 use python_test_1; -- students表 create table students( id int unsigned primary key auto_increment not null, name varchar(20) default '',

  • MySQL查询排序与查询聚合函数用法分析

    本文实例讲述了MySQL查询排序与查询聚合函数用法.分享给大家供大家参考,具体如下: 排序 为了方便查看数据,可以对数据进行排序 语法: select * from 表名 order by 列1 asc|desc [,列2 asc|desc,...] 说明 将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推 默认按照列值从小到大排列(asc) asc从小到大排列,即升序 desc从大到小排序,即降序 例1:查询未删除男生信息,按学号降序 select * from st

  • MySql常用查询命令操作大全

    MYSQL常用查命令: mysql> select version(); 查看MySQL的版本号 mysql> select current_date(); 查看MySQL的当前日期 mysql> select version(),current_date(); 同时查看MySQL的版本号和当前日期 mysql> show databases; 显示当前存在的数据库 mysql> USE mysql 选择使用数据库(USE和QUIT命令不需要分号结束) Database ch

  • MySQL必备基础之分组函数 聚合函数 分组查询详解

    目录 一.简单使用 二.搭配DISTINCT去重 三.COUNT()详细介绍 四.分组查询 一.简单使用 SUM:求和(一般用于处理数值型) AVG:平均(一般用于处理数值型) MAX:最大(也可以用于处理字符串和日期) MIN:最小(也可以用于处理字符串和日期) COUNT:数量(统计非空值的数据个数) 以上分组函数都忽略空NULL值的数据 SELECT SUM(salary) AS 和,AVG(salary) AS 平均,MAX(salary) AS 最大,MIN(salary) AS 最小

随机推荐