数据库常见的查询

这篇具有很好参考价值的文章主要介绍了数据库常见的查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、查询的完全限定写法

二、条件查询

三、模糊查询

四、范围查询

1)关键字:between and

2)关键字:in

3)关键字:is null或者、is not null和<>null和!=null

五、case when

1)方式1

2)方式2

六、排序查询

七、分组查询

1)用到分组函数

2)分组查询语法

3)分组查询特点

4)例子

八、连接查询

1)分类

2)内连接(inner join)

1.等值连接

2.非等值连接

3.自连接

3)外连接(left、right)

4)交叉连接,又称“笛卡尔连接”或"笛卡尔积"

5)全连接full join

九、子查询

1)外查询和内查询、关联子查询

2)子查询分类

1.按返回结果分类

2.按位置分类

3.按执行顺序分类

3)子查询的操作符

1.标量子查询、行子查询

2.列子查询

十、分页查询

1)limit关键字的语法

2)如何分页

十一、联合查询

(1)union、union all

1.含义

2.特点

3.要求

4.例子

(2)minus、intersect

十二、查询时加锁(select xxx for update)

作用

原理

应用案例


一、查询的完全限定写法

select 表名.列名 from 数据库.表名;  //完全引用表名或列名

二、条件查询

select * from 表名 where 条件 [group by] [having] [order by] [limit];

三、模糊查询

关键字:like

说明:

通配符%代表任意多个字符,_代表任意单个字符;

转义符\,防止后面的_被当成通配符

例子:

select * from 表名 where name like %teve%'';

select * from 表名 where name like _\_%'';

四、范围查询

1)关键字:between and

不使用between and

select * from 表名 where id>=4 and id;

使用between and

select * from 表名 where id between 4 and 6;

2)关键字:in

不使用in

select * from 表名 where age =20 or age=21 or age=23;

使用in

select * from 表名 where age in(20,21,23);

3)关键字:is null或者、is not null和<>null和!=null

select * from 表名 where age is not ‘null’;   

select * from 表名 where age <>‘null’;   //注意要加引号

五、case when

1)方式1

select sid,

case sage

when 18 then '18岁'

when then '19岁'

else '其他'

end as '年龄查询'

2)方式2

数据库常见的查询

select sid,

case

when sage< 18 then '小'

when sage>18 then '大'

else null

end as '年龄查询'

数据库常见的查询

六、排序查询

语法

select 查询列表 from 表 where 条件 order by 排序列表 asc/desc; //asc升序,由小到大;desc降序,由大到小

例子

select * from 表名 order by salary asc, employee_id desc; //先按工资升序,再按员工编号降序

七、分组查询

1)用到分组函数

sum、avg、min、max、count

2)分组查询语法

select 分组函数(要统计的列),列1,列2 where 分组前筛选条件 group by 分组列表 order by 子句 having 分组后筛选条件;

3)分组查询特点

分组查询中的筛选条件分为两类


数据源 位置 关键字
分组前筛选 原始表   group by 子句的前面 where
分组后筛选  分组后的结果集 group by 子句的后面  having

4)例子

例子1:查询课程总量(不重复)

select count(distinct courseName) from 表名;


例子2:查询平均工资

select avg(salary) from 表名;


例子4:查询每个工种的最高工资

select max(salary),job_id,job_name from 表名 group by job_id;


例子5:查询每个位置上的部门个数

select count(*),location_id from department group by location_id;


例子6:查询哪个部门的员工个数>=2

(1)查询每个部门的员工个数

select count(*),department_id from 表名 group by department_id;

(2)根据一的结果进行筛选,查询哪个部门员工个数>=2

select count(*),department_id from 表名 group by department_id having count(*)>=2;


例子7:查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资

(1)查询每个工种有奖金的员工的最高工资

select max(salary),job_id from 表名 where commission_pct is not 'null' group by job_id;

(2)根据一的结果进行筛选,筛选出最高工资>12000

select max(salary),job_id from 表名 where commission_pct is not 'null' group by job_id having max(salary)>12000;


例子8:按多个字段进行分组

题目:查询每个部门每个工种的员工的平均工资

select avg(salary),department_id,job_id from group by department_id,job_id;

八、连接查询

1)分类

内连接(inner join)、外连接(左和右)、交叉连接(cross join)、全连接(full join)

2)内连接(inner join)

特点:取两张表查询结果的交集

分类:内连接又分为等值连接、非等值连接和自连接

补充:内连接的inner join中的inner可以省略。

1.等值连接

语法:

select tab1.col1,tab2.col2 from tab1,tab2 where tab1.id =tab2.id;

select tab1.col1,tab2.col2 from tab1  inner join  tab2  ON  tab1.id =tab2.id;


例子1:查询哪个部门的员工数大于等于3的部门名和员工个数,并按个数降序。

select count(*) as 个数,department_name from employee e

inner join department d ON e.department_id =d.department_id

group by department_id having count(*)>=3 order by count(*) desc;


例子2(三表连接):查询员工名、部门名、工种名,并按部门名降序

select name,department_name,job_tietle from employee as e

inner join department as d on e.department_id =d.department_id

inner join jobs as j ON e.job_id =j.job_id

order by department_name desc;

2.非等值连接

例子:

select e.name,j.grade_level from employee as e inner jonin job_grade as j ON e.salary between j.lowest_sal and highest_sal;

3.自连接

一张表自己连接自己

例子:查询员工名和其上级的名称。

select e.name,m.name from employee as e inner join employee as m on e.mannager_id =m.id;

3)外连接(left、right)

左外连接:left outer join(特点:查询结果以左边表(主表)为准。左边表查出来有几条数据,一共就有几条数据)

右外连接:right outer join(特点:查询结果以右边表(主表)为准。右边表查出来有几条数据,一共就有几条数据)

数据库常见的查询

 数据库常见的查询

4)交叉连接,又称“笛卡尔连接”或"笛卡尔积"

假如A表中的数据为m行,B表中的数据有n行,那么A和B做笛卡尔积,结果为m*n行

例子:

表1
id1  name1
1 张一
李二
表2
id2 name2
1 zs
2 ls
3 ww

查询SQL:select * FROM 表1 CROSS JOIN 表2;

查询结果
id1  name1 id2 name2
1 张一 1  zs
1 张一 2 ls
1 张一 3  ww
2 李二 1 zs
2 李二 2 ls
2 李二 3 ww

5)全连接full join

特点:取两张表查询结果的并集

注意:mysql不支持full join,执行会报错

例子:

表1
id1 name1
1 张一
2 李二
5 王五
表2
id2  name2
1 zs
2 ls
3 ww

查询SQL:select * FROM 表1 FULL JOIN 表2;

查询结果
id1 name1  id2 name2
1 张一 1 zs
2 李二 2 ls
5 王五 null null 
null  null  3 22

九、子查询

1)外查询和内查询、关联子查询

查询语句分为:外(父)查询(主查询)、内查询(子查询)

外查询仅使用内查询的最终结果,外查询和内查询没关联。

关联子查询:内查询会引用外查询的对象。比如select name,age from student where sid<=3 as sResult and age>(select age from sResult limit 1);

2)子查询分类

1.按返回结果分类

  • 标量子查询(单行子查询):1行1列
  • 列子查询(多行子查询):1列多行
  • 行子查询:1行多列
  • 表子查询:多行多列

2.按位置分类

  • select后from前:标量子查询
  • from后where前:表子查询
  • where后:标量子查询、列子查询、行子查询

3.按执行顺序分类

可分为相关(关联)子查询、不相关(非关联)子查询。

(1)相关子查询:先执行主查询,再执行子查询

标量子查询中:where 20>(子查询语句);

多行子查询中:exists

(2)不相关子查询:先执行子查询,再执行主查询

标量子查询中:where 列名>(子查询语句)

多行子查询中:in、all、some(any)

3)子查询的操作符

1.标量子查询、行子查询

(1)操作符有哪些

>、=、和!=、between and

(2)例子

标量子查询:

例子1:查询工资最少的员工的基本信息

select * from employee where salary=(select min(salary) from employee);

例子2:查询最低工资高于4号部门的最高工资的部门id和其最低工资

select depart_id,min(salary) from employee

group by depart_id

having min(salary)>(select max(salary) from employee where depart_id=4);

行子查询:

例子1:查询公号最小且工资最高的员工的基本信息

SELECT *FROM employee WHERE (employee_id,salary)=(SELECT MIN(employee_id),MAX(salary) FROM employees);

2.列子查询

(1)操作符有哪些

in和not in、some(any)、all、exists和not exists

(2)in

等于子查询结果的任意一个值

(3)any(some)

和子查询结果中的任意一个比较     

注意:=any相当于in,<>any相当于not in

(4)all

和子查询结果中的所有值比较

(5)exists

检查子查询结果是否为空。存在数据就返回值True,否则返回False

注意:和and一起用的情况特殊,例子如下:

查询 course 表中是否存在 id=1 的课程,如果存在,就查询出 student 表中 age 字段大于 24 的记录。

SELECT * FROM student

WHERE age>24 AND EXISTS(SELECT course_name FROM course WHERE id=1);

(6)补充说明

列子查询的all和any(some)可以被单行子查询替代

例子1:返回比job_id为“IT_ProG”任一工资低的员工


select name from employee where salary<any(select distinct salary from employee where job_id='IT_ProG');


可以替换为

select name from employee where salary<(select max(salary) from employee where job_id='IT_ProG');

例子2:返回比job_id为“IT_ProG”所有工资低的员工


select name from employee where salary<all(select distinct salary from employee where job_id='IT_ProG');


可以替换为

select name from employee where salary<(select min(salary) from employee where job_id='IT_ProG');

十、分页查询

1)limit关键字的语法

语法1:select * from student limit 起始位置,size

语法2:select * from student limit 起始位置 offset size

起始位置:要显示条目的起始索引(默认从0开始)

size:要显示的条目个数

案例:查询第10条到第13条(共4条)

写法1:select * from student limit 9,4;  //4表示返回4行,9表示从表的第10行开始

写法2:select * from student limit 4 offset 9;  

2)如何分页

select * from studnet limit (当前页码-1)*每页记录条数 ,每页记录条数;

十一、联合查询

(1)union、union all

1.含义

将多次查询结果合并成一个结果

2.特点

适用于合并多个表的查询结果;

union默认去重,union all 包含所有的重复项;

union去除重复的方式等效于distinct关键字,它是指输出字段列表的组合无重复,不是指剔除单个字段下的重复值

3.要求

两个查询结果集的列数必须相等,否则会报错

4.例子

数据库常见的查询

其中第一个select出的id只有2、3;第二个select出的t_id只有1、4

(2)minus、intersect

用于比较2个查询结果的差异

Oracle特有的,mysql和sqlserver都没有。不过mysql、sqlserver可以通过NOT EXISTS配合LEFT JOIN来实现

minus:取差集,左表减去右表剩余的数据

intersect:取交集

例子:

查询sql1  minus  查询sql1 

十二、查询时加锁(select xxx for update)

作用

查询时锁定查询记录,防止查询时内容被修改出现并发问题(脏读、幻读、不可重复读),导致查询结果不是我们想要的

原理

查询时加悲观锁:


  • 如果查询条件用了含索引,那么select xxx for update就会进行行锁;
  • 如果查询条件都是普通字段(不含索引),那么select xxx for update就会进行锁表

应用案例

select a,b from 表名 where a=1 for update;
update 表名 set b=2 where a=1;
commit


与直接“update 表名 set b=2 where a=1”的区别在于:

可以防止第三方在commit之前修改数据文章来源地址https://www.toymoban.com/news/detail-450517.html

到了这里,关于数据库常见的查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何限定IP访问服务器端口(只允许指定IP访问数据库服务器的1433端口)

    1、找到“控制面板”-“Windows防火墙”-“高级设置”-“入站规则” 2、选中左侧的\\\"入站规则\\\",并点击右侧的\\\"新建规则\\\"   3、选择\\\"端口\\\",点击\\\"下一步\\\" 4、输入要限定访问的端口,这里是要限定访问数据库1433端口的IP,点击\\\"下一步\\\"    5、选择\\\"只允许连接(A)\\\"-“下一步”-“

    2024年02月12日
    浏览(49)
  • 【解惑】介绍三大数据库的with语句的写法及使用场景

    WITH 子句通常被称为 \\\"Common Table Expressions\\\"(CTE),俗称内存临时表,当使用 WITH 语句时,应注意具体的数据库版本和支持情况。以下是对 MySQL、Microsoft SQL Server(MSSQL)和 Oracle 数据库的 WITH 语句用法示例,以及在 WHERE 子句中添加分组关联条件实现对比最大聚合值: 在 MySQL5.

    2024年02月14日
    浏览(42)
  • Dapper 操作 PostgreSQL 数据库完全指南

    Dapper 是一个高性能的 ORM 框架,可用于简化与数据库的交互。本文将详细介绍如何使用 Dapper 操作 PostgreSQL 数据库,包括连接配置、CRUD 操作以及示例代码。 首先,确保你的项目中已经添加了 Dapper 和 Npgsql 包。你可以使用以下命令进行安装: 在 appsettings.json 中添加 PostgreSQL

    2024年02月11日
    浏览(65)
  • 数据库-SQLServer安装和配置及完全卸载

    1、安装server2008r2数据库 默认安装即可,如果可以该路径的话看个人情况改路径 2、注意有一步需要选择 SQL Server代理 选 SYSTEM SQL Server Database engine 选 NETWORK SERVICE SQL Server Analysis services 选 NETWORK SERVICE SQL Server Reporting services 选 NETWORK SERVICE SQL Server Integration services 选 NETWORK SERVI

    2024年02月07日
    浏览(43)
  • 初体验完全托管型图数据库 Amazon Neptune

    嗨,大家好呀!最近我跟一个学摄影的高中朋友突然聊起天,发现摄影真的是一门我根本无法达到的艺术,我作为普通人,那只能说叫做拍照,哈哈。但给我更大的启发的是,这位朋友同时对星球星际也特别感兴趣,但正因为人类对宇宙的探索是十分有限的,我们即使通过高

    2024年01月16日
    浏览(30)
  • mysql数据库数据如何迁移目录

    默认位置 C:ProgramDataMySQLMySQL Server 8.0 步骤2中Data文件夹就是mysql存放数据的位置 这里举例移动到E盘下 原来my.ini文件不要修改文件位置,如果修改需要另行学习

    2024年02月07日
    浏览(80)
  • Hbase数据库完全分布式搭建以及java中操作Hbase

    基础的环境准备不在赘述,包括jdk安装,防火墙关闭,网络配置,环境变量的配置,各个节点之间进行免密等操作等。使用的版本2.0.5. 参考官方文档 分布式的部署,都是在单节点服务的基础配置好配置,直接分发到其他节点即可。 jdk路径的配置,以及不适用内部自带的zk. 配

    2024年02月03日
    浏览(49)
  • Mysql实现Linux下数据库目录迁移

    Centos中迁移Mysql的数据目录,一般是硬盘满了不够用,然后挂载了新的数据盘,那么就可以将Mysql数据迁移到新的数据盘。 可以查看pid后kill停止,可以进入目录stop,可以变量停止 复制当前目录到新目录 更改mysql数据存储路径

    2024年02月12日
    浏览(57)
  • 数据库原理-数据查询 单表查询【二】

    聚集函数: 统计元组个数 COUNT(*) 统计一列中值的个数 COUNT([DISTINCT|ALL]列名) 计算一列值的总和(此列必须为数值型) SUM([DISTINCT|[ALL]列名) 计算一列值的平均值(此列必须为数值型) AVG([DISTINCT|ALL]列名) 求一列中的最大值和最小值 MAX([DISTINCT|ALL]列名) MIN([DISTINCT|ALL]列名) 查询学

    2024年02月03日
    浏览(45)
  • 头歌MySQL数据库实训答案 有目录

    头歌MySQL数据库答案 特别感谢黄副班、小青提供代码,有问题联系公众号【学思则安】留言更正 其他作业链接 数据库1-MySQL数据定义与操作实战 MySQL数据库 - 初识MySQL MySQL数据库 - 数据库和表的基本操作(一) MySQL数据库 - 数据库和表的基本操作(二) MySQL数据库 - 单表查询

    2024年04月28日
    浏览(92)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包