SQL(二)DQL查询总结

SQL(二)DQL查询总结

简单查询

  • 查询一个字段
select 字段名 from 表名;
  • 查询多个字段
selsct 字段1,字段2 from 表名;
  • 查询所有字段
//法一(实际开发中不建议,效率低,可读性差)
select * from 表名;
//法二
select 字段1,字段2,...... from 表名;
  • 起别名as(可省略)
//查询两个字段,其中字段2显示为AAA
select 字段1,字段2 as AAA from 表名;
//省略as
select 字段1,字段2 AAA from 表名;
//别名是中文或含空格用""或''引起来,最好用''
select 字段1,字段2 'A AA' from 表名;
  • 查询字段可以使用数学表达式
//查询员工一年工资
select money*12 from 表名;

条件查询

语法:

select
    字段1,字段2,字段3......

from
    表名
where
    条件;

举例:

//查询员工工资为例
select id,name from 表名 where money=800;
select id,name from 表名 where money!=800;(select id,name from 表名 where money<>800;)
select id,name from 表名 where money=800 and money

and和or优先级

相当于C语言里&和||优先级,写条件时可以加括号

模糊查询

like

//查询名字中含有o的人
select name from 表名 where name like '%o%';
//查询名字以T结尾的人
select name from 表名 where name like '%T';
//查询名字以K开头的人
select name from 表名 where name like 'K%';
//查询名字第三个字母是A的人
select name from 表名 where name like '__A%';
//查询名字中有_的人,需要\转义
select name from 表名 where name like '%\_%';

排序

单个字段

//查询时按员工工资排序(默认升序)
select id,name from 表名 order by money;
//查询时按员工工资排序(指定升序)
select id,name from 表名 order by money asc;
//查询时按员工工资排序(指定降序)
select id,name from 表名 order by money desc;

多个字段

//查询时按工资升序排,工资相同时按名字字典序排
select id,name from 表名 order by money asc,name asc;
//按第二列排序,了解一下
select id,name from 表名 order by 2;

综合

顺序不能变
select
    id,name
from
    表名
where
    money between 800 and 1000
order by
    money asc;
//工资在800~1000的员工按工资升序排列
select id,name from 表名 where money between 800 and 1000 order by 2;

数据处理函数

单行处理函数

  • lower()转小写,upper()转大写
select lower(name) from 表名;
  • substr()截取字符串,下标从1开始不是0
//查询name从下标1开始截取1位
select substr(name,1,1) from 表名;
  • concat()字符串拼接
select concat(id,name) from 表名;
  • length()取字符串长度
select length(name) from 表名;
  • trim()去除字符串空格
select * from 表名 where name=trim('   xpx');
  • round()四舍五入
select round(127.6598,0) from 表名;//128
select round(127.6598,1) from 表名;//127.7
select round(127.6598,2) from 表名;//127.66
select round(127.6598,-1) from 表名;//130
  • rand()随机数
select rand() from 表名;
  • ifnull()空处理函数,只要有null参与的数学运算,得到的结果都是null,2+null=null
//当money为null,将null当作0处理
select name,(money+ifnull(月补助,0))*12 from 表名;
  • case…when…then…when…then…else…end
//当员工是Manager工资上调10%,是Salesman工资上调50%,其他人正常
select
    name,
    job,
    money as oldmoney,
    (case job when 'Manager' then money*1.1 when 'Salesman' then money*1.5 else money end) as newmoney
from
    表名;

分组函数(多行处理函数)

  • count计数
//统计name不为null的总行数
select count(name) from 表名;
//统计总行数
select count(*) from 表名;
  • sum求和
select sum(money) from 表名;
  • avg求平均
select avg(money) from 表名;
  • max求最大
select max(money) from 表名;
  • min求最小
select min(money) from 表名;

注意:

分组函数自动忽略null,分组函数必须在分组后使用,以上默认整张表分为一组

错误例子(分组后才能用分组函数,下面执行where时还没执行group by):

select name from 表名 where money

分组查询

语法执行顺序:

from
where
group by
having
select
order by
  • 按工作岗位job进行分组后求工资和
//在MySql中可以执行但无意义,在Oracle中报错
select name,job,sum(money) from 表名 group by job;
//去掉无关字段
select job,sum(money) from 表名 group by job;
  • 查询每个年龄,不同岗位最高工资
//按多个字段分组
select age,job,max(money) from 表名 group by age,job;
  • having筛选
//查询每个岗位最高工资,显示最高工资大于3000的
select job,max(money) from 表名 group by job having max(money)>3000;//效率低
select job,max(money) from 表名 where money>3000 group by job;//效率高
//优先选择where
  • distinct去重
select distinct job from 表名;
select distinct name,job from 表名;//name和job联合去重
select count(distinct job) from 表名;//统计工作岗位数量

连接查询

内连接

举例:现有两张表,表1中有员工姓名(name)和岗位编号(jobid);表2中有岗位编号(jobid)和岗位名称(jobname)

  • 查询员工姓名和对应岗位名称 (SQL92语法)
//一
select name,jobname from 表1,表2 where 表1.jobid=表2.jobid;
//二(更好)
select 表1.name,表2.jobname from 表1,表2 where 表1.jobid=表2.jobid;
//三(起别名,很重要,效率)
select A.name,B.jobname from 表1 A,表2 B where A.jobid=B.jobid;

内连接之等值连接:

  • 查询员工姓名和对应岗位名称
//SQL92(表连接条件和筛选条件都在where里,比较杂)
select A.name,B.jobname from 表1 A,表2 B where A.jobid=B.jobid;
//SQL99(表连接和筛选条件分离,比较清晰)
select A.name,B.jobname from 表1 A join 表2 B on A.jobid=B.jobid;
//99语法更清晰(join前省略了inner)
select
    ...

from
    ...

join
    ...

on
    ...

where
    ...

内连接之非等值连接:

  • 查询员工,工资,工资等级
//表A有员工姓名name,工资money;
//表B有工资等级grade,工资下限losal,工资上限hisal
select A.name,A.money,B.grade from 表A A join 表B B on A.monry between B.losal and B.hisal;

内连接之自连接(一张表看成两张表):

SQL(二)DQL查询总结

SQL(二)DQL查询总结

外连接

右外连接(主要查右边的表,右边的表全输出):

  • 查询员工姓名,员工岗位,并且将不匹配的岗位表也全部输出
select A.name,B.jobname from 表1 A right join 表2 B on A.jobid=B.jobid;

左外连接:

同上,right换成left

全连接

同上,right换成full

多表连接

语法:

select
    ...

from
    a
join
    b
on
    条件
join
    c
on
    条件
right join
    d
on
    条件;

查找员工名,薪资,工作名,薪资等级:

select
    A.name,A.money,B.jobname,C.grade
from
    表1 A,
join
    表2 B,
on
    A.id=b.id
join
    表3 C
on
    A.money between C.min_money and C.max_money;

子查询

语法:

//select的嵌套
select
    ..(select)
from
    ..(select)
where
    ..(select)

查询比最低工资高的员工名和薪资:

select name,money from 表1 where money>(select min(money) from 表1);

查询按工资分组查询平均薪资的薪资等级:

select
    A.*,B.grade
from
    (select job,avg(money) average from 表1 group by jobname) A
join
    表2 B
on
    A.average between B.min_money and B.max_money;

注意:

子查询(嵌套查询)只能返回一条数据

Union合并查询

举例:

select name from 表1 where jobname='讲师' or jobname='教授';
//上面可以换做下面
select name from 表1 where jobname='讲师'
union
select name from 表1 where jobname='教授';
//union是相加,比笛卡尔积效率高

注意:

进行union时,两条查询的列数及数据类型应相同,只是列数相同也不行(mysql中不报错,oracle语法较为严格会报错)

limit

通常用在分页查询

按薪资降序排序,取出前五条记录:

select name,money from 表 order by money desc limit 5;

取出薪资排名3到5的员工:

select name,money from 表 order by money desc limit 2,3;

注意:

mysql中limit在order by后执行

limit 5:取前5
limit 0,5:从0开始取5条记录

limit分页查询

分页显示3条记录:

第一页:limit 0,3 [0,1,2]

第二页:limit 3,3 [3,4,5]

第三页:limit 6,3 [6,7,8]

第四页:limit 9,3 [9,10,11]

观察发现(页码-1)*3是起始下标

DQL总结

书写顺序:

select
from
where
group by
having
order by
limit

执行顺序:

from
where
group by
having
select
order by
limit

Original: https://www.cnblogs.com/LoginX/p/Login_X39.html
Author: 我没有bug
Title: SQL(二)DQL查询总结

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621690/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 任务25——第一次爬虫测试

    第一题:用resquests库访问百度主页20次,并返回他的text 和content属性的长度。 1 # -*- coding: utf-8 -*- 2 ""…

    Java 2023年6月6日
    089
  • 如何写出同事看不懂的Java代码?

    原创:微信公众号 &#x7801;&#x519C;&#x53C2;&#x4E0A;,欢迎分享,转载请保留出处。 哈喽大家好啊,我是没更新就是在家忙着…

    Java 2023年6月5日
    0101
  • Nginx配置反向代理

    参考:https://www.runoob.com/w3cnote/nginx-setup-intro.html nginx.conf内容如下: user nginx; worke…

    Java 2023年5月30日
    079
  • 《分布式系统原理介绍》读书笔记

    1、在大型集群中每日宕机发生的概率为千分之一左右;在实践中,一台宕机的机器恢复时间通常认为是 24 小时。 2、由于网络数据丢失的异常存在,直接决定了分布式系统的协议必须能处理网络…

    Java 2023年6月7日
    0101
  • 基于 openssl 及 keytool 创建 ssl 证书并配置到 nginx 和 tomcat

    1、openssl 创建 crt 证书示例 2、nginx 配置 crt 证书示例 3、keytool 创建 keystore 证书示例 如需添加 SAN 信息则 通过 -ext …

    Java 2023年5月30日
    074
  • Home Assistant中接入博联WiFi智能遥控

    想要在Home Assistant中通过智能遥控发送红外信号控制空调需有两个步骤:一、智能遥控接入Home Assistant;二、Home Assistant将红外信号数据发往智…

    Java 2023年6月16日
    0162
  • elasticsearch快速安装启动

    准备 docker docker内安装centos容器,模拟服务器环境 centos容器安装 下载centos容器 docker pull centos 启动docker容器 do…

    Java 2023年6月8日
    079
  • SpringSecurity 默认表单登录页展示流程源码

    SpringSecurity 默认表单登录页展示流程源码 本篇主要讲解 SpringSecurity提供的默认表单登录页 它是如何展示的的流程,涉及1.FilterSecurity…

    Java 2023年6月9日
    0116
  • Java泛型用法总结

    普通泛型 <span class="kwd"><span class="kwd">class<span cla…

    Java 2023年6月13日
    084
  • 模块(类)之间解耦利器:EventPublishSubscribeUtils 事件发布订阅工具类

    如果熟悉C#语言的小伙伴们一般都会知道委托、事件的好处,只需在某个类中提前定义好公开的委托或事件(委托的特殊表现形式)变量,然后在其它类中就可以很随意的订阅该委托或事件,当委托或事…

    Java 2023年6月9日
    095
  • java 实体类命名规则

    1,PO(Persistent Object) 持久层对象,它是由一组属性和属性的get和set方法组成,最简单的 PO 就是对应数据库中某个表中的一条记录(也就是说,我们可以将数…

    Java 2023年5月29日
    0101
  • rocketMQ 双机房部署

    posted on2020-05-08 21:43 偶尔发呆 阅读(707 ) 评论() 编辑 Original: https://www.cnblogs.com/allenwas…

    Java 2023年5月30日
    088
  • 搞定了!OAuth2使用验证码进行授权

    现在验证码登录已经成为很多应用的主流登录方式,但是对于 OAuth2授权来说,手机号验证码处理用户认证就非常繁琐,很多同学却不知道怎么接入。 认真研究胖哥 Spring Secur…

    Java 2023年6月8日
    081
  • Java基础—二进制与位运算符之间的关系

    我们知道,计算机中的数据信息都是以二进制0、1形式存在的,具体来说是以该数据的补码形式。在位运算符中有:>>,< package com.basic.day02;…

    Java 2023年6月7日
    065
  • Java应用性能分析与调优实践

    性能问题表象就是应用系统运行慢,影响客户体验。要解决性能问题也无非就是找到原因然后根据原因对症下药。本文从这两方面概述Java应用性能分析与调优方法论。 一、定位性能差的原因 1、…

    Java 2023年5月29日
    075
  • 关键字、标识符和保留字

    关键字 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)特点:关键字中所字母都为小写 保留字 具体哪些保留字:goto 、const注意: 1、自己命名标识符时要避…

    Java 2023年6月7日
    079
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球