数据库常用查询 *** 作

数据库常用查询 *** 作,第1张

--注释

--select *|字段名1,字段名2... from 表名

--1)

--查询|检索|获取 所有员工的所有信息

--查询的数据: 员工的所有信息

--数据的来源:员工表  emp

--条件:

select * from emp

--2)

--查询所有的员工名字

select ename from emp

--3)

--查询所有的员工编号和员工名称,员工上级的编号

--查询的数据: empno,ename,mgr

--数据的来源:员工表  emp

select empno,ename,mgr from emp

--4)

--查询所有部门部门编号

select deptno from dept

--5)

--查询出所有员工所在的部门的部门编号

select distinct  deptno from emp

--对查询数据进行去重(非字段去重) distinct

--6)

--查询出所有存在员工的部门的部门编号,以及员工名称

select deptno,ename from emp

select distinct sal,deptno from emp

--7)

--查询表达式,结果是表达式的值,显示的字段名就是表达式,计算值

select 1+1 from emp

select 'a' from emp

--8)

--给字段取别名  select 字段1 (as) 别名1,字段2 别名2 from 表名 别名  表的别名不能加as

--查询所有员工的名称(别名为:名字),员工编号(编号)

--别名默认变大写,别名中的内容原封不动出现 ""->中的内容原封不动出现

select 123+456 "get sum" from emp

select empno as 员工编号,ename "员工 姓名" from emp

--9)

--字符串 ''  原封不动显示""

select distinct '哈哈' 笑 from emp e

--10)

--字符串拼接 java中使用+  这里使用||

--查询 ab--cd  表达式

select distinct 'ab-'||'-cd' from emp

--查询所有的员工名字,给他们来一个前缀SXT

select 'sxt-'||ename from emp

--11)

--伪列 : 不存在的列就是伪列  比如:表达式,字符串

--12)

--虚表: 在oracle中不存在的表,也可以说是这个表中没有任何数据,没有任何字段 --oracle中的虚表:dual

--虚表的作用:可以不使用distinct就可以去重的效果,因为里面没有数据,不会出现多行

select * from dual

select distinct 123*456 from emp

select 123*456 from dual

select sysdate from dual

--比如查询当前时间

--13)

--给每一个员工在原来的基础上+100块钱奖金

--null 空

--null与数字运算,结果还为null

--null与字符串运算,结果原串

--nvl(参数1,参数2) 处理null使用  如果参数1为null,最终结果参数2,如果参数1不为null,最终的结果就是参数1

select comm 原奖金,comm||'100' 新奖金 from emp

select comm 原奖金,nvl(comm,0)+100 新奖金  from emp

--一节结尾小练习

--查询所有员工的名字, 工种, 年薪(不带奖金)

select ename,job,sal*12 年薪 from emp

--查询所有员工的名字,工种,年薪(带12月奖金的)

select ename,job,(sal+nvl(comm,0))*12 年薪 from emp

--查询所有员工的名字, 工种, 年薪(带一次奖金的)

select ename,job,sal*12+nvl(comm,0) 年薪 from emp

--select *|表达式|字符串|伪列|字段1 别名1,字段2 as 别名2... from 表名 别名|结果集 where 行过滤条件

--执行流程: from-->where-->select确定结果集

-- 查询20部门的员工信息

--数据: *

--来源: emp

--条件: deptno=20

select * from emp where deptno=20

-- ><>=  <=  = !=  <>

-- 查询工资大于1000的员工的姓名 工作岗位  工资  所属部门编号

--数据: ename,job,sal,deptno

--来源: emp

--条件: sal>1000

select ename,job,sal,deptno from emp where sal=1000

-- 查询不在20部门工作的员工信息

select * from emp where deptno != 20

select * from emp where deptno <>20

--where 中不能使用字段的别名

-- 查询员工的年薪大于20000的 员工名称、岗位 年薪

select ename 姓名,job 岗位,(sal+nvl(comm,0))*12 sum from emp where ((sal+nvl(comm,0))*12)>20000

select ename 姓名,job 岗位,(sal+nvl(comm,0))*12 sum from emp

select 岗位, sum

  from (select ename 姓名, job 岗位, (sal + nvl(comm, 0)) * 12 sum from emp)

where sum >20000

-- 查询  any(任意一个)  some(任意一个)  all(所有)

select * from emp where deptno = any(10,20)

select * from emp where deptno = some(10,20)

--大于最小的

select * from emp where sal>any(1500,2000)--薪资>1500的就可以

--大于最大的

select * from emp where sal>all(1500,2000)--薪资>2000的就可以

-- 查询 工种不为’SALESMAN’的员工信息 (注意 内容区分大小写)

select * from emp where not job ='SALESMAN'

--or或 and并且|都  not取反

-- -检索 工资 1600, 3000员工名称 岗位 工资

select ename,job,sal from emp where sal=1600 or sal=3000

select ename,job,sal from emp where not (sal=1600 or sal=3000)

-- 工资在2000到3000之间的员工信息

select * from emp where sal>2000 and sal<3000

--between 小范围值  and 大范围的值  两者之间  <= >=

select * from emp where sal between 1600 and 3000

---查询 岗位 为 CLERK 且部门编号为 20的员工名称 部门编号,工资

select ename ,deptno ,sal from emp where job='CLERK' and deptno=20

-- 查询 岗位 为 CLERK 或部门编号为 20的员工名称 部门编号,工资

select ename ,deptno ,sal,job from emp where job='CLERK' or deptno=20

--查询 岗位 不是 CLERK 员工名称 部门编号,工资

select ename ,deptno ,sal,job from emp where job!='CLERK'

select ename ,deptno ,sal,job from emp where not job='CLERK'

select ename ,deptno ,sal,job from emp where job<>'CLERK'

-- 查询 岗位 不为 CLERK 并且部门编号不为 20的员工名称 部门编号,工资

select ename ,deptno ,sal,job from emp where job!='CLERK' and deptno!=20

select ename ,deptno ,sal,job from emp where not (job='CLERK' or deptno=20)

--存在佣奖金的员工名称

select ename,comm from emp where not comm is null

select ename,comm from emp where comm is not null

--不存在奖金的员工名称

select ename,comm from emp where comm is null

--集合

--Union,并集(去重) 对两个结果集进行并集 *** 作,不包括重复行同时进行默认规则的排序;

--Union All,全集(不去重) 对两个结果集进行并集 *** 作,包括重复行,不进行排序 ;

--Intersect,交集(找出重复) 对两个结果集进行交集 *** 作,不包括重复行,同时进行默认规则的排序;

--Minus,差集( 减去重复 ) 对两个结果集进行差 *** 作,不包括重复行,同时进行默认规则的排序

--查询工资大于1500 或 含有佣金的人员姓名

select ename,sal,comm from emp where sal>1500 or comm is not null

select ename,sal,comm from emp where sal>1500

select ename,sal,comm from emp where comm is not null

--并集

select ename,sal,comm from emp where sal>1500

Union

select ename,sal,comm from emp where comm is not null

select ename,sal,comm from emp where sal>1500

Union all

select ename,sal,comm from emp where comm is not null

--查询显示不存在雇员的所有部门号。

--求出所有的部门号

select deptno from dept

--有员工的部门号

select distinct deptno from emp

select deptno from dept

Minus

select distinct deptno from emp

-- 查询显示存在雇员的所有部门号。

select deptno from dept

Intersect

select distinct deptno from emp

--模糊匹配  like %任意任意字符  _一个任意字符  一起使用

--查询员工姓名中包含字符A的员工信息

select * from emp where ename like '%A%'

--完全匹配

select * from emp where ename like 'SMITH'

--查询员工姓名以'A'结尾的员工信息

select * from emp where ename like 'A%'

--查询员工姓名中第二个字母为A的员工信息

select * from emp where ename like '_A%'

insert into emp(empno,ename,sal) values(1000,'t_%test',8989)

insert into emp(empno,ename,sal) values(1200,'t_tes%t',8000)

--escape('单个字符')指定转义符

--查询员工姓名中包含字符%的员工信息

select * from emp where ename like '%B%%' escape('B')

--当执行插入数据,删除数据,修改的时候,默认开启事务

--可提交  commit 

--可回滚  rollback

--多个人中任意一个值就可以

select * from emp where sal=1600 or sal=3000 or sal=1500

select * from emp where sal in(1500,1600,3000)

--select 字段.. from 结果集 where 行过滤条件 order by 排序字段 desc降序|asc升序(默认)..

--执行流程: from-->where-->select-->排序

select empno,ename,sal from emp order by sal desc,empno asc

--按照奖金升序排序,如果存在null值,所有的奖金null值的数据最先显示

select empno,ename,sal,comm from emp where deptno in (10,30) order by comm asc nulls first

接下来,我们将使用员工相关的四张样本数据表,来学习SQL,建议你在学习过程中多动手练习,理解才会更深刻。表和字段含义,如下图:

如何利用SQL语句来 *** 作以上数据呢?我们必须将样本数据导入MySQL客户端(如:Navicat)中。可以在客户端 *** 作数据,或者在终端窗口。工作中经常在客户端 *** 作,所以本文所有SQL语句将在Navicat中学习。

首先将sql脚本保存到桌面(获取方式:关注"Python之每日一课"公众号,后来回复"sql基础数据",即可。),导入SQL脚本的具体 *** 作流程如下:

现在数据准备完成。这里是导入sql脚本;导出同理,选择”转储SQL“文件。当然了,Navicat也支持将当前表或查询结果导出Excel、CSV等文件类型。

下面可以写SQL语句了(每个sql脚本可以保存,下次直接使用),如下:

类似于Python中 :print(要打印的东西)

①通过select查询完的结果 ,是一个虚拟的表格,不是真实存在

② 要查询的东西 可以是常量值、表达式、字段、也可以是函数

补充:可以给字段起别名,好处是提高可读性,更方便理解;多表连接时,区分字段。用AS 或 空格来实现。如下:

2、 条件查询

条件查询:根据条件过滤原始表的数据,查询到想要的数据

1)语法

2)分类

①条件表达式

②逻辑表达式

③模糊查询

⭐ 注意:where 一定要放到 from 后面。NULL 不是假,也不是真,而是"空";任何运算符,判断符碰到NULL,都得NULL;NULL的判断只能用is null,is not null;NULL 影响查询速度,一般避免使值为NULL。exists查询可以与in型子查询互换,它们之间区别以后语句优化时会详细讲解。

3、 排序查询

1)语法

2)举栗

⭐ 注意:order by 一定要放到 语句最后(limit前面)

4、分组查询

1)语法

2)特点

①可以按单个字段分组

②和分组函数一同查询的字段最好是分组后的字段

③分组筛选(where 和 having区别)

④可以按多个字段分组,字段之间用逗号隔开

⑤可以支持排序

⑥having后可以支持别名

3)举栗

⭐ 注意:关键字顺序是where —>group by—>having—>order by—>limit( having不能单独使用,需结合group by ,表示对分组后的结果进行筛选;而 group by 必须结合分组聚合函数一起使用 ,比如:count()、max()等)

5、 常见函数

1)单行函数

2)分组函数

3)分组函数特点

①以上五个分组函数都忽略null值,除了count(*)

②sum和avg一般处理数值型,max、min、count可以处理任何数据类型

③都可以搭配distinct使用,用于统计去重后的结果

④count的参数可以支持:字段、*、常量值,一般放1

6、连接查询(多表查询)

单个表不能满足需求时,需要结合多张表,去除有关联的数据。这时就需要用连接查询,连接查询有三种,通常join使用的最多。

①等值连接的结果 = 多个表的交集

②多个表不分主次,没有顺序要求

③一般为表起别名,提高阅读性和性能

①语法

②好处

语句上,连接条件和筛选条件实现了分离,简洁。

⭐ 注意:左右连接可互换 A left join B 等价于B right join A;内连接是左</pre>

右连接的交集;mysql没有外连接。

自连接相当于等值连接,但是等值连接涉及多个表,而自连接仅仅是它自己。如下:在员工信息表里,查询员工名和直接上级的名。

7、子查询

一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询。在外面的查询语句,称为主查询或外查询。

①子查询都放在小括号内

②子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧

③子查询优先于主查询执行,主查询使用了子查询的执行结果

④子查询根据查询结果的行数不同分为以下两类:

2)举栗

8、分页查询 (可选)

实际web开发中,当显示的数据,一页显示不完时,需要分页提交sql请求。

2)特点

①起始条目索引默认从0开始

②limit子句放在查询语句的最后

③公式:select * from 表 limit (page-1)*sizePerPage,

3)举栗

9、union联合查询

union用于把涉及多个表的SELECT语句的结果组合到一个结果集合中。适用于查询条件较多,多个表之间没有连接关系的场景。</pre>

2)特点

①多条查询语句的查询的列数必须是一致的

②多条查询语句的查询的列的类型几乎相同

③union 代表去重,union all 代表不去重

3)举栗

UNION 和 UNION ALL 运行结果的区别如下:

⭐ 注意:在多个 SELECT 语句中,第一个 SELECT 语句中被使用的字段名称将被用于结果的字段名称。当使用 UNION 时,MySQL 会把结果集中重复的记录删掉,而使用 UNION ALL ,MySQL 会把所有的记录返回,且效率高于 UNION

好,今天学习到这里。工作中用的最多就是查询。如果能消化本文涉及到的所有内容,大概能解决80%的工作需求。本文更多的是原理介绍,例子不多,只有先知道是什么,才能知道怎么学。那么,接下来最重要的是要多练习实践。因为实际的业务场景要复杂很多,给大家推荐两个刷题的网站,力扣和牛客网,里面有大量的sql面试题。能进一步提高我们sql的水平。这篇文章主要是SQL的常用查询。明天继续学习SQL的DML增删改。一起加油!

原定计划从本篇开始就要给大家介绍 ASP 内建的 ActiveX

组件 但是考虑到我们在往后的学习中将会接触到大量的数据库查询 因此作者临时决定花一到两篇的篇幅向大家简要介绍一些数据库查询语言的基本知识 这其实也是学习

ASP

所必须掌握的一门知识 是否能够灵活地运用数据库查询语言 将直接关系到

ASP 程序的执行效率等一系列问题 所以请各位务必重视

相信很多朋友都听说过 SQL

这个名字 如果你是计算机方面的行家 SQL

的大名一定是如雷贯耳 那么 SQL 究竟是什么呢?SQL 一词实际上是

"Structured Query Language"

结构式查询语言的缩写 是用于对存放在计算机数据库中的数据进行组织 管理和检索的一种工具是一种特定类型的数据库

关系数据库 而控制这种数据库的计算机程序就是我们常说的

DBMS 数据库管理系统 譬如 SQL Server Oracle Sybase DB

等等 当用户想要检索数据库中的数据时 就通过 SQL

语言发出请求 接着 DBMS 对该 SQL

请求进行处理并检索所要求的数据 最后将其返回给用户 此过程被称作为数据库查询 这也就是数据库查询语言这一名称的由来

SQL 并不是象 C COBOL 和 Fortran 语言那样的完整的计算机语言 SQL

没有用于条件测试的 IF 语句 也没有用于程序分支的 Goto

语句以及循环语句 For 或 Do 确切的讲 SQL 是一种数据库子语言 SQL

语句可以被嵌入到另一种语言中 从而使其具有数据库存取功能 SQL

也非严格的结构式语言 它的句法更接近英语语句 因此易于理解 大多数

SQL 语句都是直述其意 读起来就象自然语言一样明了 SQL

还是一种交互式查询语言 允许用户直接查询存储数据 利用这一交互特性 用户可以在很短的时间内回答相当复杂的问题 而同样问题若让程序员编写相应的报表程序则可能要用几个星期甚至更长时间

在大部分 ASP 应用程序中我们都会接触到数据库 而我们在编写

ASP 应用程序时用来进行数据库 *** 作的标准语法正是 SQL 因此 SQL

语法的重要性是不言而喻的 下面 我们就从最常用的 SQL 语句 SELECT

着手 一步一步地来学习 SQL

查询是 SQL 语言的核心 而用于表达 SQL 查询的 SELECT

语句则是功能最强也是最为复杂的 SQL

语句 它从数据库中检索数据 并将查询结果提供给用户 在本文中我们将建立一个名为

tianjiao 的简单数据库 该库中存放了一个叫 sales

的销售记录表 如下所示 :

姓名

性别

工资

销售目标

销售额

地区

书生

上海

吴冠军

北京

雷鸣

四川

雪儿

广州

顾一

大连

阿卓

天津

熠天

全国

在该表中有六列即六个字段 :

姓名 性别 工资 销售目标 销售额 地区 首先我们用 Select

语句列出姓名 销售目标和销售额 :

Select 姓名 销售目标 销售额 From sales

结果如下 :

姓名

销售目标

销售额

书生

吴冠军

雷鸣

雪儿

顾一

阿卓

熠天

然后 我们再列出所有男性的姓名 销售目标和销售额 :

Select 姓名 销售目标 销售额 From sales Where 性别 =" 男

"

结果如下 :

姓名

销售目标

销售额

书生

吴冠军

雷鸣

顾一

熠天

接下来 我们做一个相对复杂的查询 列出销售额大于销售目标的所有男性的姓名 销售目标和销售额 并且按销售目标排序

Select 姓名 销售目标 销售额

Form sales

Where 销售额 >销售目标

And 性别 =" 男 "

Order By 销售目标

结果如下 :

姓名

销售目标

销售额

书生

雷鸣

顾一

熠天

大家可以看到 对于简单查询 SQL Select

语句和英文语法很相象 我们来分析一下 SELECT

语句的完整格式 它包括六个子句 其中 SELECT 和FROM

子句是必须的 其它子句可以任选 每个子句的功能如下 :

Select 子句列出所有要求 SELECT 语句检索的数据项 它放在

SELECT

语句开始处 指定此查询要检索的数据项 这些数据项通常用选择表表示 即一组用“ ”隔开的选择项 按照从左到右的顺序 每个选择项产生的一个列的查询结果 一个选择项可能是以下项目

( ) 列名 标识 FROM

子句指定表中的列 如果列名作为选择项 则 SQL

直接从数据库表中每行取出该列的值 再将其放在查询结果的相应行中

( ) 常数 指定在查询结果的每行中都放上该值

( ) SQL

表达式 说明必须将要放入查询结果中的值按表达式的规定进行计算

From 子句列出包含所要查询数据的表 它由关键字 FROM

后跟一组用逗号分开的表名组成 每个表明都代表一个包括该查询要检索数据的表 这些表称为此

SQL 语句的表源 因为查询结果都源于它们

Where 子句告诉 SQL

只查询某些行中的数据 这些行用搜索条件描述

Group By

子句指定汇总查询 即不是对每行产生一个查询结果 而是将相似的行进行分组 再对每组产生一个汇总结果

Having 子句告诉 SQL 只产生有 Group By

得到的某些组的结果 和 Where

子句一样 所需要的组也用一个搜索条件指定

Order By

子句将查询结果按一列或多列中的数据排序 如果省略此子句 则查询结果将是无序的

下面作者将提供一个简单但实用的运用 SQL 语句查询的 ASP

程序供大家参考

为了使大家更清楚更直接地了解 SQL 语法在 ASP

中的应用 我们先将查询的所有核心过程写成一个名为 query table 的SUB 然后利用

ASP 的服务器端包容功能调用该 SUB 请将以下语句剪贴到记事簿 保存为

subdBTable inc 文件 并置于虚拟目录 asptest 下:

<%

sub query table(inputquery)

set conntemp=server createobject("adodb connection")

conntemp open "DSN=Studentuid=studentpwd=aspmagic"

set rstemp=conntemp execute(inputquery)

howmanyfields=rstemp fields count

统计数据库中的列数

%>

<table border= ><tr>

<%

for I= to howmanyfields

%>

<td><b><%=rstemp(I) name%></B></TD>

<% next %>

</tr>

<%

do while not rstemp eof

%>

<tr>

<% for I = to howmanyfields

thisvalue=rstemp(I)

If isnull(thisvalue) then

thisvalue="?

如果字段为空 则将变量 thisvalue 的值定义为一个空格

end if%>

<td valign=top><%=thisvalue%></td>

<% next %>

</tr>

<%rstemp movenext

loop%>

</table>

<%

rstemp close

set rstemp=nothing

conntemp close

set conntemp=nothingend sub%>

完成了 SUB 的定义过程 在下面几个 ASP

程序中我们只要加入想要使用的 SQL

查询语句 并调用该过程就可以非常方便的得到查询结果 将以下四段代码分别保存为

asp a asp asp b asp asp c asp asp d asp 四个 asp 文件

<HEAD><TITLE>asp a asp</TITLE></HEAD>

<HTML><body bgcolor="#FFFFFF">

<%

call query table("select * from publishers where name like A%% ")

将表 publishers 中所有姓名中有字母 A 的记录查询出来

%>

<! #include virtual="/asptest/subdBTable inc" ></BODY><

/HTML>

<HEAD><TITLE>asp b asp</TITLE></HEAD><HTML><

body bgcolor="#FFFFFF">

<%

call query table("select * from titles where Year_Published >= ")

将表 titles 中所有发表年份大于或等于 年的记录查询出来

%>

<! #include virtual="/asptest/subdBTable inc" ></BODY><

/HTML>

<HEAD><TITLE>asp c asp</TITLE></HEAD><HTML><

body bgcolor="#FFFFFF">

<%

call query table("select * from publishers where amount>and

sex= male ")

将表 publishers 中所有数量大于 且性别为男的记录查询出来

%>

<! #include virtual="/asptest/subdBTable inc" ></BODY><

/HTML>

<HEAD><TITLE>asp d asp</TITLE></HEAD><HTML><

body bgcolor="#FFFFFF">

<%

call query table("select * from publishers where state<>NY ")

将表 publishers 中所有所在城市不为纽约的记录查询出来

%>

<! #include virtual="/asptest/subdBTable inc" ></BODY><

/HTML>

利用 subdBTable inc 文件中的所定义的过程 query table 你就可以非常迅速地对数据库进行查询 你所要做的只是将“conntemp open

"DSN=Studentuid=studentpwd=aspmagic"”中的数据库名称 用户身份和密码稍加改动 并在调用

query table 时输入想要使用的 SQL 查询语句即可 是不是很简单 ?

这就是 ASP 和 SQL 的魅力所在 !!!

今天 我们虽然用了一整篇的篇幅只学习了一个 SQL

指令 但请你相信你所获得远不同于一个 DOS 指令 SELECT

指令使得你可以非常容易地对数据库进行查询 或许在这之前你对数据库查询还一无所知 但是通过本篇的学习 你其实已经会使用

ASP 进行常用的数据库查询了 是不是很激动 ?

lishixinzhi/Article/program/net/201311/14199


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9884508.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存