sql语句基础篇(sql语句基础语句)
mhr18 2024-09-15 21:49 21 浏览 0 评论
完整的DQL语句:select … from … where … group by … having … order by … limit …
执行顺序 5 1 2 3 4 6 7
1. 普通查询语句
基础语法: select 字段1,字段2,字段3,… from 表名;
select ename from emp;
select ename, sal*12 as ‘年薪’ from emp;//创建别名‘年薪’,单引号,as可省略
select * from emp; 查询所有字段
1.1 条件查询
运算符:
—————————————————————
= 等于
<>或!= 不等于
或>= 大于、小于
between…and… 两个值之间,左小右大,等同>=and<=。还可以用在字符串:between ‘A’ and ‘C’,[A,C),开区间
is null或is not null 为不为空
and 并且第二个条件
or 或者第二个条件
in 包含,相当于多个or,in(100,1000)指是否等于100或1000这两个值,而不是100到1000的范围
not 取非,主要用在is或者in中,is not, not in
like 模糊查询,%代表任意多个字符,_代表任意单个字符。%A%代表包含A的子串,_A%代表第二个字符是A的。
若要查询包含’%’或’_’,需要转义’\%’,’\_’
————————————————————————–
语法: select 字段1,字段2,字段3,… from 表名 where 条件;
执行顺序: 先from,然后where,最后select
select sal from emp where ename = ‘SMITH’;//VARCHAR类型字符串需要加‘’
select ename, sal from emp where sal>=1000 and sal <= 3000;//查询工资在1000和3000之间
select ename, sal from emp where sal between 1000 and 3000; //功能同上,between..and是闭区间[1000,3000],左小右大
select ename, sal from emp where sal <> 3000; // !=和<>都可以表示不等于
select ename, sal from emp where sal > 1000 and (deptno = 20 or deptno = 30);//and优先级比or高,不确定就加括号
select ename, sal from emp where sal > 1000 and deptno in (20, 30);//功能同上,in等同or
select ename from emp where ename like ‘%A%’;//找出名字中含有A字符的
Note: NULL在数据库中不是一个值,做赋值运算结果总是NULL:300+NULL=NULL,使用is null或is not null
1.2 数据排序
语法: select 字段1,字段2,…from 表名 order by 规则
asc表示升序,desc表示降序。
select ename, sal from emp order by sal;//默认按工资升序排列
select ename, sal from emp order by sal asc;//同上,升序
select ename, sal from emp order by sal desc;//降序排
select ename, sal from emp order by sal desc, ename asc;//按工资降序,工资相同按名字升序
多个条件排序,优先按前面规则,后面规则可能用不上
组合: select 字段 from 表名 where 条件 order by xxx;
执行顺序: from最先,where第二,select第三,order by最后
例子: select ename, sal*12 as ‘年薪’ from emp where job = ‘salesman’ order by ‘年薪’ desc;
例子中select语句先定好年薪,order by是按select定的别名排列
1.3 单行处理函数(输入一行输出一行)
ifnull() 空处理函数
用法: ifnull(可能为NULL的数据,被当做什么)
select ename,(sal+ifnull(comm, 0))*12 from emp;//列出所有人的年薪(工资加补贴)
1.4 分组函数(多行处理函数) 一般和group by联合使用,在group by之后执行
count计数
sum求和
avg平均值
max最大值
min最小值
所有的分组函数都是对‘某一组’数据进行操作的
select sum(sal) from emp;//求和
select max(sal) from emp;//找最大值
select count(ename) from emp;//找出ename的总人数
select count(*) from emp;//找出总人数
NOTE:分组函数自动忽略NULL
select ename, sal from emp where sal > avg(sal);//语法错误!分组函数不能直接出现在where语句中
select ename, sal from emp where sal > (select avg(sal) from emp);//子查询,查询工资高于平均工资的员工
count(*)和count(字段)区别:
count(*): 不是统计某个字段个数,是统计总条数(和某个字段无关)
count(字段): 统计某个字段中不为NULL的总条数
1.5 group by和having
group by: 按照某个字段或某些字段进行分组
having: 对分组后的数据进行再次过滤,只能在group by后联合使用
找出每个工作岗位的最高薪资:先分组再查询
select max(sal),job from emp group by job;
NOTE: 当查询语句中有group by时候,select之后只能跟分组函数和被分组的字段!!
select ename,max(sal),job from emp group by job;//错误! ename没参加分组,此时不能加入查询
多个字段联合分组:(找出每个部门不同工作岗位的最高薪资)
select max(sal), job, deptno from emp group by job, deptno;
找出每个工作岗位的最高薪资,要求显示薪资大于2500的。
select max(sal), job from emp group by job having max(sal)>2500;//效率低
select max(sal), job from emp where sal>2500 group by job;//where先过滤,减少数据查询,效率高
能使用where过滤的不要使用having,除非where不能用。
比如:找出每个岗位的平均薪资,要求显示薪资大于2000的岗位。
select avg(sal), job from emp group by job having avg(sal)>2000;//此处where后不能跟分组函数,只能having
1.6 查询结果去重 distinct
select distinct job from emp;
Note: distinct只能出现在所有字段最前面,代表所有字段联合起来去重
select distinct deptno,job from emp;
select count(distinct job) from emp;//统计岗位的数量
2. 连接查询(多张表联合查询)
根据表的连接方式划分:
内连接 假设表A和表B连接,把A和B能够匹配的记录查询出来,AB两张表没有主副之分
等值连接
非等值连接
自连接
外链接 假设表A和表B连接,AB中有一张是主表,一张副表,主要查询主表数据,捎带查询附表。
假如副表中数据没有和主表匹配上,副表自动模拟出NULL与之匹配。
左外连接(左连接):左边表是主表
右外连接(右连接):右边表是主表
全连接 (很少用)
连接查询,一般用别名,来区分两张表内相同名字的字段(类似类中成员变量)
select e.ename,d.dname from emp as e, dept as d;
2.1 笛卡尔乘积现象:如果连接两张表联合查询没有条件限制,查询结果就变成了两个表乘起来
避免了笛卡尔乘积现象,不能减少匹配次数,只是显示的结果是有效记录
select e.ename,d.dname from emp e, dept d where e.deptno = d.deptno;//SQL92, 老语法
2.2 内连接–等值连接:最大特点是,条件是等量关系
SQL99: join…on…语法
语法: …from A表 (inner 可以省略)join B表 on 连接条件 where … (表连接和where条件分离,SQL99语法更清晰)
select e.ename, d.dname from emp e inner join dept d on e.deptno=d.deptno;
2.3 内连接–非等值连接:最大特点是,条件是非等量关系
//找出员工工资所在的等级,员工表+工资等级表
select e.ename, e.sal, s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
2.4 内连接–自连接: 最大特点是,一张表看做两张表,自己连自己
//找出每个员工的上级领导,要求显示员工名和对应领导名:
//可以分成两个表,一个员工表,一个领导表。关键:员工的领导编号,等于领导的员工编号
select
a.ename as ‘员工名’, b.ename as ‘领导名’
from
emp as a
join
emp as b
on
a.mgr = b.empno;
2.5 外连接:比内连接使用多
//找出每个员工的上级领导,要求显示员工名和对应领导名,King没有领导,也要查出来:
select
a.ename as ‘员工名’, b.ename as ‘领导名’
from
emp as a
left join //左外连接, outer可以省略
emp as b
on
a.mgr = b.empno;
//找出没有员工的部门
select
d.*
from
emp as e
right join
dept as d
on
e.deptno=d.deptno
where
e.ename is null;
NOTE:外连接最重要特点是:主表数据无条件查询出来
2.6 三张表联合查询
A join B on … join C on …表示A先和B连接,连接之后再和C连接
//找出每一个员工的部门名称和工资等级
select
e.ename, d.dname, s.grade
from
emp as e
join
dept as d
on
e.deptno = d.deptno
join
salgrade as s
on
e.sal between s.losal and s.hisal;
//找出每一个员工的部门名称和工资等级以及上级领导
select
e.ename ‘员工’, d.dname, s.grade, m.ename ‘领导’
from
emp as e
join
dept as d
on
e.deptno = d.deptno
join
salgrade as s
on
e.sal between s.losal and s.hisal
left join
emp as m
on
e.mgr = m.empno;
3. 子查询
select语句当中嵌套select语句,被嵌套的select语句是子查询,可以出现在select/from/where之后
3.1 where子语句中使用子查询
select ename,sal from emp where sal > (select avg(sal) from emp);//找出工资比平均工资高的
3.2 from后面嵌套子查询
//找出每个部门平均薪水的薪资等级
select d.deptno, s.grade from
1. select avg(e.sal) from emp as e;//找出所有人平均工资
2. select deptno, avg(sal) as average from emp group by deptno;//找出每个部门平均工资
3. 把上一步查询结果当做一个表temp
select temp.*, s.grade
from temp
join salgrade as s
on temp.average between s.losal and hisal;
也就是
select temp.*, s.grade
from (select deptno, avg(sal) as average from emp group by deptno) temp
//right join dept as d
//on temp.deptno=d.deptno
join salgrade as s
on temp.average between s.losal and hisal;
//找出每个部门薪资的平均等级
select e.deptno, s.grade from emp as e join salgrade as s on e.sal between s.losal and s.hisal;
//select temp.deptno, avg(temp.s.grade) from temp group by temp.e.deptno;不用当做临时表。。
select
e.deptno, avg(s.grade)
from
emp as e
join
salgrade as s
on
e.sal between s.losal and s.hisal
group by
e.deptno;
3.3 在select后面嵌套子查询
//找出每个员工所在的部门名,显示员工名和部门名
原来的方法:
select e.ename, d.dname from emp join dept on e.deptno = d.deptno;
新方法:
select
e.ename, (select dname from dept as d where e.deptno=d.deptno)
from
emp as e;
4. union查询, 拼接查询结果
第一个查询列的数量和第二个查询列的数量要一致!
//找出工作岗位是salesman和manager的员工
方法1: select ename, job from emp where job=’salesman’ or job=’manager’;
方法2: select ename, job from emp where job in (‘salesman’,’manager’);
方法3: select ename, job from emp where job = ‘salesman’
union
select ename, job from emp where job = ‘manager’;
5. limit(分页查询)
5.1 limit是mysql特有的,不通用。Oracle中有个类似的rownum
5.2 limit取结果集中的部分数据
5.3 语法机制
limit startIndex,length 从起始位置取几个,startIndex不写默认从0
例子: 取出工资前5名的员工(先降序,再取)
select ename, sal from emp order by dest limit 0, 5;
相关推荐
- C++开发必知的内存问题及常用的解决方法-经典文章
-
1.内存管理功能问题由于C++语言对内存有主动控制权,内存使用灵活和效率高,但代价是不小心使用就会导致以下内存错误:omemoryoverrun:写内存越界odoublefree:同一块内...
- 缓存用不好,系统崩得早!10条军规让你成为缓存高手
-
凌晨三点,我被电话惊醒:“苏工!首页崩了!”监控显示:缓存命中率0%,数据库QPS10万+,线程阻塞2000+。根本原因竟是同事没加缓存!不会用缓存的程序员,就像不会刹车的赛车手——...
- 彻底搞清楚内存泄漏的原因,如何避免内存泄漏,如何定位内存泄漏
-
作为C/C++开发人员,内存泄漏是最容易遇到的问题之一,这是由C/C++语言的特性引起的。C/C++语言与其他语言不同,需要开发者去申请和释放内存,即需要开发者去管理内存,如果内存使用不当,就容易造成...
- Java中间件-Memcached(Java中间件大全)
-
一、知识结构及面试题目分析缓存技术的大规模使用是互联网架构区别于传统IT技术最大的地方,是整体高并发高性能架构设计中是重中之重的关键一笔,也是互联网公司比较偏好的面试题目。按照在软件系统中所处位置...
- linux内存碎片防治技术(linux内存碎片整理)
-
推荐视频:90分钟了解Linux内存架构,numa的优势,slab的实现,vmalloc原理剖析Linux内核内存分配与回收Linuxkernel组织管理物理内存的方式是buddysystem(伙...
- Redis主从架构详解(redis主从配置详细过程)
-
Redis主从架构搭建Redis主节点配置创建主节点目录(/opt/redis-master),复制redis.conf到该目录下,redis.conf配置项修改#后台启动daemonizeyes...
- 揭开CXL内存的神秘面纱(内存c1)
-
摘要:现代数据中心对内存容量的高需求促进了内存扩展和分解方面的多条创新线,其中一项获得极大关注的工作是基于ComputeeXpressLink(CXL)的内存扩展。为了更好地利用CXL,研究人员建...
- 一文彻底弄懂 TPS RPS QPS(tps cps)
-
以下是关于RPS、QPS、TPS的核心区别与关联的总结,结合实际场景和优化建议:一、核心定义与区别RPS:RequestsPerSecond每秒请求数客户端到服务器的完整请求数量Web服务...
- 用Redis的“集合”找出你和朋友的“共同关注”
-
你是不是在刷抖音、微博、小红书的时候,常常会看到这样的提示:“你和XXX有共同关注的博主/朋友”?或者当你关注了一个新的明星,系统会推荐“你的朋友YYY也关注了这位明星”?这个看似简单的功能背后,其实...
- WOT2016彭哲夫:科班出身开发者对运维人员的期许
-
“运维与开发”是老生常谈的话题,前几天和一个运维人聊天,TA说一些公司运维岗位都不公开招聘了,这让众多运维人员情何以堪?是运维的岗位真的饱和了?是找到合适的运维人才难?还是有这样那样的因素?带着这些疑...
- Java程序员最常用的20%技术总结(java程序员要掌握什么)
-
我听说编程语言,经常使用的是其中20%的技术。在Java这门语言中,这20%包括哪些内容?找到一份Java初级程序员的工作,有哪些是必须掌握的,有哪些是可以现学现卖的?一个完整的Javaweb项目,有...
- 秒杀系统实战(四)| 缓存与数据库双写一致性实战
-
前言微笑挖坑,努力填坑。————已经拥有黑眼圈,但还没学会小猪老师时间管理学的蛮三刀同学本文是秒杀系统的第四篇,我们来讨论秒杀系统中「缓存热点数据」的问题,进一步延伸到数据库和缓存的...
- 头条评论精灵翻牌子(头条评论精灵翻牌子怎么弄)
-
关于“头条评论精灵翻牌子”功能,这通常是指平台通过算法或运营手段,将用户的优质评论随机或定向推送到更显眼的位置(如信息流顶部、独立曝光位等),以提升互动率和用户参与感。以下是详细解析和建议:一、功能理...
- 15个程序员们都应该知道的大模型高级提示词指令模板和示例
-
作为程序员你如何写大模型指令?你写的指令是不是更专业呢?下面是15个程序员使用的专业的大模型指令,如果早知道可以能节省你很多时间。这些指令可以用在chatgpt,deepseek等大模型。1.一键...
- MyBatis-Plus内置的主键生成策略有大坑,要注意!
-
昨天小伙伴使用Mybaits-Plus开发的项目线上(集群、K8S)出现了主键重复问题,其报错如下:Mybatis-Plus启动时会通过com.baomidou.mybatisplus.core.to...
你 发表评论:
欢迎- 一周热门
-
-
Redis客户端 Jedis 与 Lettuce
-
高并发架构系列:Redis并发竞争key的解决方案详解
-
redis如何防止并发(redis如何防止高并发)
-
开源推荐:如何实现的一个高性能 Redis 服务器
-
redis安装与调优部署文档(WinServer)
-
Redis 入门 - 安装最全讲解(Windows、Linux、Docker)
-
一文带你了解 Redis 的发布与订阅的底层原理
-
Redis如何应对并发访问(redis控制并发量)
-
oracle数据库查询Sql语句是否使用索引及常见的索引失效的情况
-
Java SE Development Kit 8u441下载地址【windows版本】
-
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)