文章目录

  • 基本使用
  • where 语句
    • 普通比较运算符
    • between ... and ...,匹配指定范围
    • like,模糊匹配
    • is null,匹配空值
    • 特殊比较运算符
    • 逻辑运算符
  • 单行函数
    • 数字函数
    • 日期函数
    • 字符函数
  • 控制流函数
    • case
    • if
  • 多表查询
    • 内连接
    • 左外连接:
    • 右外链接
  • 聚合函数(组函数)
  • group by
  • having
  • order by
  • limit
  • 子查询
    • 单行子查询
    • 多行子查询
    • 多列子查询
    • 特殊子查询

基本语法

select 属性1,属性2,......       # 表示查询的内容
from 表1,表2,......            # 表示从哪些表中查询
where 条件1 and/or ......       # 可选的,限定查询返回的结果
group by 属性1,属性2,......     # 可选的,表示分组查询
having 条件1 and/or ......      # 可选的,限定分组查询返回的结果
order by 属性1,属性2,......     # 可选的,对查询结果排序
limit start,len                # 可选的,从指定位置开始返回指定数量的查询结果

基本使用

  • 查询所有属性:select * from 表名;

  • 查询指定属性:select 属性1,属性2,...... from 表名;

    例:查询emp表中员工的姓名、工资、职位、部门号

          `select ename,job,sal,deptno from emp;`

  • 算术运算:数据类型为数值型、日期型的属性可以进行算术运算

    例:查询emp表中员工的姓名、工资、奖金、月总收入(工资+奖金)、年收入(月收入*12)

      `select ename,sal,comm,sal+comm,(sal+comm)*12 from emp;`
    

  • 空值:如果在表达式中包含空值,则表达式结果为空

  • 别名:改变查询结果中显示的属性名称

    • 语法:属性 as "别名"/属性 "别名"

    • 例:查询emp表中员工的姓名、工资、奖金、月总收入(工资+奖金)、年收入(月收入*12)

      select ename,sal,comm,sal+comm as "月收入",(sal+comm)*12 "年收入" from emp;

  • 去重:distinct,去除查询结果中的重复数据

where 语句

普通比较运算符

=,等于
!=,不等于
>
>=
<
<=

例1:查询20号部门的员工的姓名、职位、工资

  `select ename,job,sal from emp where deptno=20;`

例2:查询工资不超过3000的员工姓名、职位、工资、部门号

  `select ename,job,sal,deptno from emp where sal<=3000;`

例3:查询职位不是’MANAGER’的员工姓名、职位、工资、部门号

  `select ename,job,sal,deptno from emp where job!="MANAGER";`

between … and …,匹配指定范围

  • 语法:属性 between A and B,表示属性的在[A,B]内则满足条件

例:查询工资在[1500,3000]之间的员工信息

select ename,job,sal,deptno from emp where sal between 1500 and 3000;

like,模糊匹配

  • 语法:属性 like 匹配内容
    - _,表示任意一个字符
    - %,表示若干任意字符
   例1:`name like "张_"`,表示名字为2个字,并且第一个字为张例2:`name like "张%"`,表示姓张的人员例3:`name like "_国%"`,表示名字第二个字为国的人员例4:`name like "%国%"`,表示名字中包含国的人员例5:查询emp表中姓名的第二个为"A"的员工的姓名、职位、工资、部门号select ename,job,sal,deptno from emp where ename like "_A%";

is null,匹配空值

例:查询奖金为空的员工信息

select ename,job,sal,comm,deptno from emp where comm is null;

特殊比较运算符

  • in,后面接一个集合,属性匹配集合中的元素,只要任意一个元素与属性值匹配则该行属性会被查询返回

  • 语法:属性 in (值1,值2,......)

    例:查询20号或者30号部门的员工信息

select ename,job,sal,deptno from emp where deptno in(20,30);

逻辑运算符

  • and

参与运算的对象是2个条件,如果2个条件的结果都为真,则整体表达式结果为真;如果任意1个条件的结果为假,则整体表达式结果为假

True and True = TrueTrue and False = FalseFalse and True = FalseFalse and False = False
  • or

参与运算的对象是2个条件,如果2个条件的结果都为假,则整体表达式结果为假;如果任意1个条件的结果为真,则整体表达式结果为真

True or True = TrueTrue or False = TrueFalse or True = TrueFalse or False = False
  例:查询20号或者30号部门的员工信息
select ename,job,sal,comm,deptno from emp
where deptno=30 or deptno=20;
  • not

参与运算的对象是1个条件,如果条件的结果为假,则整体表达式结果为真;如果条件的结果为真,则整体表达式结果为假

not False = Truenot True = False

例:查询奖金不为空的员工信息

select ename,job,sal,comm,deptno from emp
where not comm is null;

单行函数

数字函数

  • floor(x),返回小于等于x的最大整数

    例:floor(7.8)=7 floor(-7.8)=-8

  • ceiling(x),返回大于等于x的最小整数

    例:ceiling(7.8)=8 ceiling(-7.8)=-7

  • mod(x,y),返回x除以y的余数,余数r=x-y*(truncate(x/y,0))

    例:mod(5,3)=2 mod(5,-3)=2

  • round(x,p),返回将x精确到第p位的结果(四舍五入)

    • p=0,表示精确到个位,round(17.8,0)=18
    • p>0,表示精确到小数点后第p位,round(17.897,1)=17.9
    • p<0,表示精确到个位前第p位,round(17.897,-1)=20
  • truncate(x,p),返回将x截取到第p位的结果

    • p=0,表示截取到个位,truncate(17.8,0)=17
    • p>0,表示截取到小数点后第p位,truncate(17.897,1)=17.8
    • p<0,表示截取到个位前第p位,truncate(17.897,-1)=10

日期函数

  • 日期函数

    • now(),返回当前日期和时间
    • curdate(),返回当前日期
    • curtime(),返回当前时间
    • last_day(date),返回日期date所在月份的最后一天的日期
      • 例:last_day(‘2021-07-01’)=2021-07-31
    • date_format(date,fmt),将指定日期进行格式化,返回操作结果
      • date,待操作的日期
      • fmt,格式
        • %Y,4位年
        • %m,2位月
        • %d,2位日
        • %H,小时(24小时制)
        • %i,分钟
        • %S , 秒

字符函数

  • 字符函数

    • upper(str),将字符串转换为大写

    • lower(str),将字符串转换为小写

    • length(str),返回字符串的字节数

    • char_length(str),返回字符串中的字符数

      例:

length('1a中') = 5   # 1个中文占3个字节
char_length('1a中') = 3
  • ifnull(str,value),如果str值为null,返回value;如果str值不为null,返回其本身的值

    例:查询emp表中员工的姓名、工资、奖金、月总收入(工资+奖金)

select ename,sal,comm,sal+comm "月收入" from emp;
select ename,sal,comm,sal+ifnull(comm,0) "月收入" from emp;
select ename,sal,comm,ifnull(sal+comm,sal) "月收入" from emp;
  • replace(str,old,new),将字符串中指定的元素替换为新内容

    例:replace(‘abcd’,‘ab’,‘*’)=‘*cd’

  • substring(str,start,len),从字符串指定的位置开始返回指定长度的内容

    • start>0,表示从左往右计数;start<0,表示从字符串右边往左边计数
    • len,可选的,如果省略表示返回从start位置开始的所有内容

    例:

substring('abcd',1,3)=abc,表示从字符串的第1个位置开始,返回3个字符
substring('abcd',-2)=cd,表示表示从字符串的倒数第2个位置开始,返回所有内容
  • lpad(str,len,new),从字符串str的左边使用指定内容new将其补齐到长度为len

  • rpad(str,len,new),从字符串str的右边使用指定内容new将其补齐到长度为len

    例:

lapd('abcd',10,'*') = '******abcd'
rpad('abcd',10,'*') = 'abcd******'
  • left(str,len),从字符串的左边返回长度为len的子字符串

  • right(str,len),从字符串的右边返回长度为len的子字符串

    例:

left('abcd',2) = 'ab'
right('abcd',2) = 'cd'
  • concat(str1,str2,…),拼接字符串

    例:查询员工的姓名、职位、工资,按格式"xxx的职位是xx,工资为xxxx"

select concat(ename,'的职位是',job,',工资为',sal) '员工信息' from emp;
  • instr(str,obj),返回指定内容obj在字符串中第一次出现的位置,如果字符串中没有obj则返回0

    例:

instr('abcdafg','a') = 1
instr('abcdafg','abs') = 0
  • 练习

    在hello的左右两边各添加5个’',返回hello*(2种方法实现)

select replace('a','a','*****hello*****') from dual;
select rpad(lpad('hello',10,'*'),15,'*') from dual;
select concat('*****','hello','*****') from dual;
select upper(right('abcdefghijklmn',3)) from dual;
select upper(substring('abcdefghijklmn',-3)) from dual;
select ename,job,sal,ifnull(comm,0),deptno from emp
where char_length(ename)>=5;
select empno,ename,job,deptno from emp
where not ename like '%A%';select empno,ename,job,deptno from emp
where instr(ename,'A')=0;
select ename,substring(ename,2) from emp;select ename,right(ename,char_length(ename)-1) from emp;
select ename,lpad(ename,10,left(ename,1)) from emp;
select ename,rpad(ename,char_length(ename)*2,right(ename,1)) from emp;
  使用员工姓名的最后一个字符,从右边将员工姓名补齐到长度为姓名长度的2倍使用员工姓名的第一个字符,从左边将员工姓名补齐到长度为10显示将员工姓名的第一个字符去掉后的字符串,如'ALLEN'显示为'LLEN'查询姓名中不含'A'的员工的编号、姓名、职位、部门号(2种方法实现)查询名字包含5个字符的员工的姓名,工资,奖金(奖金为空则显示为0)、职位、部门号从字符串'abcdefghijklmn'中返回后三位字符,并转换为大写

控制流函数

case

语法:

case 属性 when 值1 then 结果1when 值2 then 结果2......
end case when 条件1 then 结果1when 条件2 then 结果2......
end
select ename,job,deptno,case deptno when 10 then '综合管理部'when 20 then '技术部'when 30 then '销售部'end as "部门名称"
from emp;select ename,job,deptno,case  when deptno=10 then '综合管理部'when deptno=20 then '技术部'when deptno=30 then '销售部'end as "部门名称"
from emp;

if

  • 语法:if(条件,结果1,结果2),如果条件为真,返回结果1,否则返回结果2

例:查询员工的姓名、职位、部门号。如果部门号为10,显示综合管理部;部门号为20,显示技术部;部门号为30,显示销售部

select ename,job,deptno,if(deptno=10,'综合管理部',if(deptno=20,'技术部','销售部')) as "部门名称"
from emp;

多表查询

内连接

  • inner join
  • 语法:表1 inner join 表2 ... on 表1.属性=表2.属性

例1:查询员工的姓名、职位、部门号、部门名称

select emp.ename,emp.job,emp.deptno,dept.dname
from emp inner join dept
on emp.deptno=dept.deptno;select e.ename,e.job,e.deptno,d.dname
from emp e inner join dept d     # 为表取别名
on e.deptno=d.deptno;
  • where

    • 语法:
select 表1.属性1,表2.属性2,......       # 表示查询的内容
from 表1,表2,......            # 表示从哪些表中查询
where 连接条件
  • 例1:查询职位不是MANAGER的员工的姓名、职位、工资、工资等级、部门号、部门名称
select e.ename,e.job,e.sal,s.grade,e.deptno,d.dname
from emp e,dept d,salgrade s
where e.deptno=d.deptno and e.sal between s.losal and s.hisal and e.job!='MANAGER';

左外连接:

表1 left join 表2 on 连接条件

右边表返回与连接条件完全匹配的数据,左边表除了返回与连接条件完全匹配的数据,不匹配的数据也会查询返回

例:查询部门号、部门名称、每个部门的员工的姓名(没有员工的部门也显示在查询结果中)

select d.deptno,d.dname,e.ename
from dept d left join emp e
on d.deptno=e.deptno;

右外链接

表1 right join 表2 on 连接条件

左边表返回与连接条件完全匹配的数据,右边表除了返回与连接条件完全匹配的数据,不匹配的数据也会查询返回

聚合函数(组函数)

  • count,返回非空值的数量

    • 语法:count(*)/count(属性)

    例:统计员工的数量

select count(*) from emp;    # 返回14
select count(comm) from emp;   # 返回4
select count(ifnull(comm,0)) from emp;  # 返回14
  • sum,求和

    • 语法:sum(属性)

    例:查询20号部门员工的总工资支出

select sum(sal) from emp where deptno=20;
  • avg,求算数平均值

    • 语法:avg(属性)

    例:查询30号部门员工的月平均收入(保留2位小数)

select round(avg(sal+ifnull(comm,0)),2) "月平均收入" from emp
where deptno=30;
  • max,返回最大值

    • 语法:max(属性)
  • min,返回最小值

    • 语法:min(属性)

    例:查询员工的最高工资、最低工资

select max(sal),min(sal) from emp;

group by

select语句中同时存在聚合函数和普通属性,此时需要使用group by进行分组,并且select语句中的普通属性都要出现在group by语句中

例1:查询每个部门的部门号及其平均工资

select deptno,avg(sal) from emp
group by deptno;

例2:查询每个部门中每个职位的平均工资

select deptno,job,round(avg(sal),2) from emp
group by deptno,job;

having

对聚合函数的处理结果进行限定

例1:查询每个部门中每个职位的平均工资,返回平均工资大于等于1500数据

select deptno,job,round(avg(sal),2) from emp
group by deptno,job
having avg(sal)>=1500;select deptno,job,round(avg(sal),2) "avg_sal" from emp
group by deptno,job
having avg_sal>=1500;

order by

升序,asc,默认为升序

降序,desc

例1:查询每个部门中每个职位的平均工资,返回平均工资大于等于1500数据,查询结果按部门号降序,平均工资升序显示

select deptno,job,round(avg(sal),2) "avg_sal" from emp
group by deptno,job
having avg_sal>=1500
order by deptno desc,avg_sal;

limit

  • 语法:limit start,len,start表示开始的位置(可以省略,表示从第一行开始),len表示返回的数据的数量

例1:查询工资最高的5个员工的信息

select * from emp
order by sal desc
limit 0,5;

子查询

  • 说明:

    子查询放在比较运算符的右边

    子查询必须使用括号包括起来

单行子查询

子查询返回1个值(1行1列)
单行比较运算符:

=、!=、>、>=、<、<=

多行子查询

子查询返回多行数据(多行1列)
多行比较运算符:in、any、all
- in,后面接一个集合,属性匹配集合中的元素,只要任意一个元素与属性值匹配则该行属性会被查询返回
语法:属性 in (子查询)
例1:查询工资等于员工"MILLER"或者"MARTIN"的员工的姓名、职位、工资

select ename,job,sal from emp
where sal in(select sal from emp where ename="MILLER" or ename="MARTIN");

多列子查询

  • 查询返回多行多列

    • 运算符:in
    • 例1:查询与’ALLEN’在同一个部门并且职位相同的员工的信息
select ename,job,deptno from emp
where job=(select job from emp where ename="ALLEN")
and deptno=(select deptno from emp where ename="ALLEN");select ename,job,deptno from emp
where (deptno,job) in(select deptno,job from emp where ename="ALLEN")

特殊子查询

原理:在关系数据模型中,操作的对象以及操作的结果都是关系(表)
应用:将select语句的查询结果作为一张表使用,在使用时必须为这张表设置一个别名
例1:查询工资排名前三(工资相同只算一个排名)的员工的姓名,职位、工资

select e.ename,e.job,e.sal
from emp e inner join (select distinct sal from emp order by sal desc limit 3) s
on e.sal = s.sal;

测试工程师mysql数据库基础操作之DQL 数据查询篇相关推荐

  1. MySQL数据库基础(五)——SQL查询

    MySQL数据库基础(五)--SQL查询 一.单表查询 1.查询所有字段 在SELECT语句中使用星号""通配符查询所有字段 在SELECT语句中指定所有字段 select fro ...

  2. MySQL数据库基础操作

    DDL:数据库表的操作语句,如:create.drop. DML:数据操作语句. -DQL:数据查询语句. DCL:数据控制语句,事务和权限相关的语句. DBA:数据库管理员. 一.数据库基础操作语句 ...

  3. SQL 100+个最佳入门案例实践(覆盖Oralce、SQL Server、Mysql)之基础操作_1_检索数据

    SQL基础操作_1_检索数据 目录 7.1.1 数据集 7.1.2 学生选课关系表 7.1.3 供应商关系表 7.2.1 从表中查询所有行和列 7.2.2 从表中查询部分行 7.2.3 查询满足某个条 ...

  4. 【笔记】——MySQL数据库——基础知识-——快速回顾——(加深印象篇)

    文章目录 前言 一.MySQL是什么? 二.数据库的常见概念 三.数据库存储数据的特点 四.SQL语言的分类 1.)DML 2.)DDL 3.)DCL 五.数据库的基本操作 5.1.)创建数据库 5. ...

  5. MySQL数据库基础操作初步

    文章目录 MySQL 数据库 〇.安装与配置 一.库管理 二.数据表设计 1.表结构设计思路 2.数据类型 ①.数字类型: ②.字符类型: ③.枚举类型 ④.日期时间类型 三.数据表管理 1.创建表并 ...

  6. mysql做十亿条数据查询_数据库优化:mysql数据库单机数十亿数据查询设计

    很久没写文章,是不是想着写点什么东西,分享下我的数据库设计思路,主要是针对单机数十亿及以上数据查询优化技巧. 如果只是简单的查询,没有频繁的写入操作,对查询速度不要求在毫秒级别,就不需要什么大型的数据 ...

  7. MySQL数据库技术与应用:数据查询

    摘要:数据查询是数据库系统应用的主要内容,也是用户对数据库最频繁.最常见的基本操作请求. 数据查询 数据查询是数据库系统应用的主要内容,也是用户对数据库最频繁.最常见的基本操作请求.数据查询可以根据用 ...

  8. Linux技术--mysql数据库基础操作

    # mysql * 查询    多表联合查询   * 更新   * 删除    * DCL   * mysql 高级应用    * 优化 ## 查询 ``` 1.select * from 表名: 2 ...

  9. 边记边学PHP-(十五)MySQL数据库基础操作2

    四.使用可视化工具创建数据库 尽管使用命令行感觉更像我们程序猿,可是我还是比較喜欢使用workbench来创建数据库. 首先打开workbench , 一个比較友好的界面就打开了,哈哈.我还是比較喜欢 ...

最新文章

  1. Android性能优化案例研究(上)
  2. 天水市一中2021高考成绩查询,天水高中成绩排名2021,天水中考分数线排行榜
  3. 【渝粤教育】电大中专新媒体营销实务 (6)作业 题库
  4. NYOJ 2 括号配对问题
  5. Dreamweaver MX显示汉字为乱码的解决方法
  6. LeetCode 1797. 设计一个验证系统(map)
  7. Java探索之旅(2)——GUI输入输出与代码的规范性
  8. 小米集团2021年Q4净利润45亿元 同比增长39.6%
  9. linux修改last权限,Linux常用命令2/3(有关用户、权限管理的命令)--Unix/Linux操作系统04...
  10. 用python把相同名称的放在一起,python实现将具有相同名称的文件放入相应的文件夹中,把,对应,内...
  11. c语言链表复数,[蓝桥杯][算法提高VIP]复数求和-链表初学者看过来(C语言代码)...
  12. 求数组中最大值和次大值
  13. 061 面向过程编程
  14. 你所想要了解的美国人工智能专业
  15. 零管理费的基金你见过吗?基金行业价格战预演
  16. 插件框架篇一之scrollbars
  17. PHICOMM(斐讯)N1盒子 - Armbian5.77(Debian 9)配置自动连接WIFI无线网络
  18. sqlserver java驱动_sqlserver jdbc驱动
  19. 多源数据 单源数据是什么意思
  20. 安卓仿苹果音量调节_android自定义view仿照MIUI中音量控制效果

热门文章

  1. xxxxxxxxxxxxx
  2. SDIO2019R2游记&入坑2周年感想
  3. 在LaTeX中使用Python的简单介绍
  4. 上大学之前,一定要明白这10大潜规则,你会少走很多人生弯路
  5. Nginx安装配置及使用方法
  6. 介绍一种Android 平台 不需要获取imei imsi 无权限就能获取手机运营商的方法
  7. MTK657X智能机平台系统文件夹文件详解
  8. Oracle序列的概念、创建和使用
  9. 基于标准库函数与基于HAL库函数的stm32编程方式对比
  10. JavaScript 数字格式化怎么写(#,##.00) (实用,赞)