数据库表查询进阶(1)

数据库表查询进阶(1),第1张

in *** 作符允许我们在 WHERE 子句中规定多个值。

where 字段名 in (值1,值2,值3)

示例: where age in (20,21,25);

age 字段的值 只要是 20或者21或者25 的数据 都满足条件

where not in (值1,值2,值3)</pre>

示例: where age in (20,21,25);

age 字段的值 只要 不是 20或者21或者25 的数据 都满足条件

select

from sc

where score in (70,80,90);

select

from sc

where score not in (70,80,90);

select

from student

where birthday in ('1990-01-01','1990-12-21','2017-12-20','2012-06-06');</pre>

select

from student

where birthday not in ('1990-01-01','1990-12-21','2017-12-20','2012-06-06');

MySQL中的分页查询, limit 通常放在sql 语句的最末尾

limit 4

查询前4条数据

limit 4,3

从第4条数据之后开始,查询3条数据

也就是 第5,6,7条的数据

limit 4 offset 10;

offset后面的数字是指记录数

从第10条 之后的数据开始 查询4条数据

也就是 第 11,12,13,14条数据

select from student limit 5;

select from student limit 9,6;

select from student limit 6 offset 9;

查询成绩表中 前7条的数据;

select from sc limit 7;

查询成绩表中 第 5到10 条的数据

select from sc limit 4,6;

查询成绩表中 第 3到8 条的数据;

select from sc limit 2 , 6;

如果字段没有要求非空,则字段值 可以为空,就是null值。如果要查询某个 字段 为 null的数据,不能使用 字段名=null,要用 字段名 is null;

where 字段名 is null;

字段名 为空的符合条件

where 字段名 is not null;

字段名 不为空的符合条件

1查询teacher表,给tid 起别名为 教师编号,tname 起别名为 教师姓名

select tid as 教师编号,tname as 教师姓名 from teacher

2查询 sc 表, 给 cid 起别名为 课程编号,sid 起别名为 学生编号, score起别名为分数;

select cid 课程编号 ,sid 学生编号,score 分数 from sc

3查询 course 表,给表起别名为 c,使用 c字段查询 表数据

select c from course as c ;

起别名是为了后续学习多表联查 做铺垫,语法十分简单

比如查询 student 表的 学生姓名 和 生日 的sql语句:

select sname,birthday from student;

给 sname,birthday字段 起别名 ,改为中文

select sname as 姓名,birthday as 生日 from student;

起了别名后,查出来的字段会以别名展示。

as 关键字也可以省略,字段名 和 别名之间 用空格隔开即可

select sname 姓名, birthday 生日 from student;

例子:

select asname, abirthday from student as a;

给表 起别名 同样是 使用 as关键字(可以使用空格隔开代替as关键字), a 就代表 student表,查询字段时,可以 使用 asname 代表 student的sname字段。

给表起别名 通常用在 多表查询,本次使用演示,先熟悉语法。

在某些复杂的场景下,可能需要多条sql 才能查询出想要的数据,把多条sql拼接起来 就是嵌套查询

句式1

select XXX from A表 where xx =/in (select XXX from B表)

句式2

select XXX from (select XXX from XXXX)b

句式3

select XXX from A表 a

join (select XXX from B表)b on axx = bxx

select from sc where sid = (select sid from student where sname = '周梅');

select from sc where sid in (select sid from student where sex='女');

select asname,bscore,cscore from student a

inner join (select sid,score from sc where cid =1) b on asid = bsid

inner join (select sid,score from sc where cid = 2) c on asid = csid

where bscore › cscore;

聚合函数对一组值执行计算,并返回单个值,也被称为组函数。

就是sql提供的一种查询方法,比如查询 最大值,最小值,总数,平均等等。

聚合函数不能写在where的查询条件里面

查询 最小值

select min(字段) from 表;

查询 最大值

select max(字段) from 表;

select max(tid) from teacher;

select min(tid) from teacher;

select max(ascore) ,bcname from sc a

inner join course b on acid=bcid

where asid =(select sid from student where sname='周梅') group by bcname limit 1 ;

查询 该字段的 总数

select sum(字段) from 表

查询 该字段的 平均数

select avg(字段) from 表

select avg(score) from sc;

select avg(sscore) from student a inner join sc s on asid = ssid

where asex ='女';

查询 数据 总条数

count( ) 是查询总共有多少条数据

count(字段) 是查询该字段 不为 null的 总共有多少条数据

例:

select count( ) from 表

去重,查询数据时,相同的数据只展示 一条

语法:

select distinct 字段 from 表;

例:去重查询学生表中的生日字段

select distinct birthday from student;

  一 简单查询

简单的Transact SQL查询只包括选择列表 FROM子句和WHERE子句 它们分别说明所查询列 查询的表或视图 以及搜索条件等

例如 下面的语句查询testtable表中姓名为 张三 的nickname字段和email字段

SELECT nickname emailFROM testtableWHERE name= 张三

(一) 选择列表

选择列表(select_list)指出所查询列 它可以是一组列名列表 星号 表达式 变量(包括局部变量和全局变量)等构成

选择所有列

例如 下面语句显示testtable表中所有列的数据

SELECT FROM testtable

选择部分列并指定它们的显示次序

查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同

例如

SELECT nickname emailFROM testtable

更改列标题

在选择列表中 可重新指定列标题 定义格式为

列标题=列名列名 列标题

如果指定的列标题不是标准的标识符格式时 应使用引号定界符 例如 下列语句使用汉字显示列标题

SELECT 昵称=nickname 电子邮件=emailFROM testtable

删除重复行

SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行 默认为ALL 使用DISTINCT选项时 对于所有重复的数据行在SELECT返回的结果集合中只保留一行

限制返回的行数

使用TOP n [PERCENT]选项限制返回的数据行数 TOP n说明返回n行 而TOP n PERCENT时 说明n是表示一百分数 指定返回的行数等于总行数的百分之几

例如

SELECT TOP FROM testtable SELECT TOP PERCENT FROM testtable

(二) FROM子句

FROM子句指定SELECT语句查询及与查询相关的表或视图 在FROM子句中最多可指定 个表或视图 它们之间用逗号分隔

在FROM子句同时指定多个表或视图时 如果选择列表中存在同名列 这时应使用对象名限定这些列所属的表或视图 例如在usertable和citytable表中同时存在cityid列 在查询两个表中的cityid时应使用下面语句格式加以限定

SELECT username citytable cityidFROM usertable citytableWHERE usertable cityid=citytable cityid

在FROM子句中可用以下两种格式为表或视图指定别名

表名 as 别名表名 别名

例如上面语句可用表的别名格式表示为

SELECT username b cityidFROM usertable a citytable bWHERE a cityid=b cityid

SELECT不仅能从表或视图中检索数据 它还能够从其它查询语句所返回的结果集合中查询数据

例如

SELECT a au_fname+a au_lnameFROM authors a titleauthor ta(SELECT title_id titleFROM titlesWHERE ytd_sales> ) AS tWHERE a au_id=ta au_idAND ta title_id=t title_id

此例中 将SELECT返回的结果集合给予一别名t 然后再从中检索数据

(三) 使用WHERE子句设置查询条件

WHERE子句设置查询条件 过滤掉不需要的数据行 例如下面语句查询年龄大于 的数据

SELECT FROM usertableWHERE age>

WHERE子句可包括各种条件运算符

比较运算符(大小比较) > >= = < <= <> !> !<范围运算符(表达式值是否在指定的范围) BEEEN…AND…NOT BEEEN…AND…列表运算符(判断表达式是否为列表中的指定项) IN (项 项 ……)NOT IN (项 项 ……)模式匹配符(判断值是否与指定的字符通配格式相符):LIKE NOT LIKE空值判断符(判断表达式是否为空) IS NULL NOT IS NULL逻辑运算符(用于多条件的逻辑连接) NOT AND OR

范围运算符例 age BEEEN AND 相当于age>= AND age<=

列表运算符例 country IN ( Germany China )

模式匹配符例 常用于模糊查找 它判断列值是否与指定的字符串格式相匹配 可用于char varchar text ntext datetime和 alldatetime等类型查询

可使用以下通配字符

百分号% 可匹配任意类型和长度的字符 如果是中文 请使用两个百分号即%%

下划线_ 匹配单个任意字符 它常用来限制表达式的字符长度

方括号[] 指定一个字符 字符串或范围 要求所匹配对象为它们中的任一个 [^] 其取值也[] 相同 但它要求所匹配对象为指定字符以外的任一个字符

例如

限制以Publishing结尾 使用LIKE %Publishing

限制以A开头 LIKE [A]%

限制以A开头外 LIKE [^A]%

空值判断符例WHERE age IS NULL

逻辑运算符 优先级为NOT AND OR

(四)查询结果排序

使用ORDER BY子句对查询返回的结果按一列或多列排序 ORDER BY子句的语法格式为

ORDER BY {column_name [ASC|DESC]} [ …n]

其中ASC表示升序 为默认值 DESC为降序 ORDER BY不能按ntext text和image数据类型进行排序例如

SELECT FROM usertableORDER BY age desc userid ASC

另外 可以根据表达式进行排序

二 联合查询

UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示 即执行联合查询 UNION的语法格式为

select_statementUNION [ALL] selectstatement[UNION [ALL] selectstatement][…n]

其中selectstatement为待联合的SELECT查询语句

ALL选项表示将所有行合并到结果集合中 不指定该项时 被联合查询结果集合中的重复行将只保留一行

联合查询时 查询结果的列标题为第一个查询语句的列标题 因此 要定义列标题必须在第一个查询语句中定义 要对联合查询结果排序时 也必须使用第一查询语句中的列名 列标题或者列序号

在使用UNION 运算符时 应保证每个联合查询语句的选择列表中有相同数量的表达式 并且每个查询选择表达式应具有相同的数据类型 或是可以自动将它们转换为相同的数据类型 在自动转换时 对于数值类型 系统将低精度的数据类型转换为高精度的数据类型

在包括多个查询的UNION语句中 其执行顺序是自左至右 使用括号可以改变这一执行顺序 例如

查询 UNION (查询 UNION 查询 )

三 连接查询

通过连接运算符可以实现多个表查询 连接是关系数据库模型的主要特点 也是它区别于其它类型数据库管理系统的一个标志

在关系数据库管理系统中 表建立时各数据之间的关系不必确定 常把一个实体的所有信息存放在一个表中 当检索数据时 通过连接 *** 作查询出存放在多个表中的不同实体的信息 连接 *** 作给用户带来很大的灵活性 他们可以在任何时候增加新的数据类型 为不同实体创建新的表 尔后通过连接进行查询

连接可以在SELECT 语句的FROM子句或WHERE子句中建立 似是而非在FROM子句中指出连接时有助于将连接 *** 作与WHERE子句中的搜索条件区分开来 所以 在Transact SQL中推荐使用这种方法

SQL 标准所定义的FROM子句的连接语法格式为

FROM join_table join_type join_table[ON (join_condition)]

其中join_table指出参与连接 *** 作的表名 连接可以对同一个表 *** 作 也可以对多表 *** 作 对同一个表 *** 作的连接又称做自连接

join_type 指出连接类型 可分为三种 内连接 外连接和交叉连接 内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较 *** 作 并列出这些表中与连接条件相匹配的数据行 根据所使用的比较方式不同 内连接又分为等值连接 自然连接和不等连接三种 外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN) 右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种 与内连接不同的是 外连接不只列出与连接条件相匹配的行 而是列出左表(左外连接时) 右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行

交叉连接(CROSS JOIN)没有WHERE 子句 它返回连接表中所有数据行的笛卡尔积 其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数

连接 *** 作中的ON (join_condition) 子句指出连接条件 它由被连接表中的列和比较运算符 逻辑运算符等构成

无论哪种连接都不能对text ntext和image数据类型列进行直接连接 但可以对这三种列进行间接连接 例如

SELECT p pub_id p pub_id p pr_infoFROM pub_info AS p INNER JOIN pub_info AS p ON DATALENGTH(p pr_info)=DATALENGTH(p pr_info)

(一)内连接

内连接查询 *** 作列出与连接条件匹配的数据行 它使用比较运算符比较被连接列的列值 内连接分三种

等值连接 在连接条件中使用等于号(=)运算符比较被连接列的列值 其查询结果中列出被连接表中的所有列 包括其中的重复列

不等连接 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值 这些运算符包括> >= <= < !> !<和<>

自然连接 在连接条件中使用等于(=)运算符比较被连接列的列值 但它使用选择列表指出查询结果集合中所包括的列 并删除连接表中的重复列

例 下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社

SELECT FROM authors AS a INNER JOIN publishers AS pON a city=p city

又如使用自然连接 在选择列表中删除authors 和publishers 表中重复列(city和state)

SELECT a p pub_id p pub_name p countryFROM authors AS a INNER JOIN publishers AS pON a city=p city

(二)外连接

内连接时 返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行 而采用外连接时 它返回到查询结果集合中的不仅包含符合连接条件的行 而且还包括左表(左外连接时) 右表(右外连接时)或两个边接表(全外连接)中的所有数据行 如下面使用左外连接将论坛内容和作者信息连接起来

SELECT a b FROM luntan LEFT JOIN usertable as bON a username=b username

下面使用全外连接将city表中的所有作者以及user表中的所有作者 以及他们所在的城市

SELECT a b FROM city as a FULL OUTER JOIN user as bON a username=b username

(三)交叉连接

交叉连接不带WHERE 子句 它返回被连接的两个表所有数据行的笛卡尔积 返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数 例 titles表中有 类图书 而publishers表中有 家出版社 则下列交叉连接检索到的记录数将等

于 = 行

lishixinzhi/Article/program/SQL/201311/16231

1 SQL优化的原则是:将一次 *** 作需要读取的BLOCK数减到最低,即在最短的时间达到最大的数据吞吐量。

调整不良SQL通常可以从以下几点切入:

检查不良的SQL,考虑其写法是否还有可优化内容

检查子查询 考虑SQL子查询是否可以用简单连接的方式进行重新书写

检查优化索引的使用

考虑数据库的优化器

2 避免出现SELECT FROM table 语句,要明确查出的字段。

3 在一个SQL语句中,如果一个where条件过滤的数据库记录越多,定位越准确,则该where条件越应该前移。

4 查询时尽可能使用索引覆盖。即对SELECT的字段建立复合索引,这样查询时只进行索引扫描,不读取数据块。

5 在判断有无符合条件的记录时建议不要用SELECT COUNT ()和select top 1 语句。

6 使用内层限定原则,在拼写SQL语句时,将查询条件分解、分类,并尽量在SQL语句的最里层进行限定,以减少数据的处理量。

7 应绝对避免在order by子句中使用表达式。

8 如果需要从关联表读数据,关联的表一般不要超过7个。

9 小心使用 IN 和 OR,需要注意In集合中的数据量。建议集合中的数据不超过200个。

10 <> 用 < 、 > 代替,>用>=代替,<用<=代替,这样可以有效的利用索引。

11 在查询时尽量减少对多余数据的读取包括多余的列与多余的行。

12 对于复合索引要注意,例如在建立复合索引时列的顺序是F1,F2,F3,则在where或order by子句中这些字段出现的顺序要与建立索引时的字段顺序一致,且必须包含第一列。只能是F1或F1,F2或F1,F2,F3。否则不会用到该索引。

13 多表关联查询时,写法必须遵循以下原则,这样做有利于建立索引,提高查询效率。格式如下select sum(table1je) from table1 table1, table2 table2, table3 table3 where (table1的等值条件(=)) and (table1的非等值条件) and (table2与table1的关联条件) and (table2的等值条件) and (table2的非等值条件) and (table3与table2的关联条件) and (table3的等值条件) and (table3的非等值条件)。

注:关于多表查询时from 后面表的出现顺序对效率的影响还有待研究。

14 子查询问题。对于能用连接方式或者视图方式实现的功能,不要用子查询。例如:select name from customer where customer_id in ( select customer_id from order where money>1000)。应该用如下语句代替:select name from customer inner join order on customercustomer_id=ordercustomer_id where ordermoney>100。

15 在WHERE 子句中,避免对列的四则运算,特别是where 条件的左边,严禁使用运算与函数对列进行处理。比如有些地方 substring 可以用like代替。

16 如果在语句中有not in(in) *** 作,应考虑用not exists(exists)来重写,最好的办法是使用外连接实现。

17 对一个业务过程的处理,应该使事物的开始与结束之间的时间间隔越短越好,原则上做到数据库的读 *** 作在前面完成,数据库写 *** 作在后面完成,避免交叉。

18 请小心不要对过多的列使用列函数和order by,group by等,谨慎使用disti软件开发t。

19 用union all 代替 union,数据库执行union *** 作,首先先分别执行union两端的查询,将其放在临时表中,然后在对其进行排序,过滤重复的记录。

当已知的业务逻辑决定query A和query B中不会有重复记录时,应该用union all代替union,以提高查询效率。

关于SQL在数据检查中的应用

结构化查询语言SQL是工业标准数据库 *** 作语言,在实践中得到了广泛运用,下面是我为大家搜索整理了关于SQL在数据检查中的应用,欢迎参考阅读,希望对大家有所帮助。想了解更多相关信息请持续关注我们应届毕业生培训网!

矢量地形图是地图要素的数字化表示,主要由属性数据、拓扑数据和元数据三部分组成。属性数据用于描述地理实体的类别、等级等质量特征和数量特征,拓扑数据用于描述地图上点、线、面状要素之间关联、邻接、包含等空间关系,元数据则包含了数据和信息资源的描述性信息。境外判绘生成的矢量数据是按照地形图作业规范规定的标准格式;其数据的正确性、完备性、规范性的检查是十分重要的环节。若能对数据属性进行分类显示,即按照某一属性项(编码、名称、编号等)分类和排序,将有共同属性的地图目标排列在一起,将会给属性检查带来很大的便利。现有的检查软件都会进行属性项检查,但是这种检查方式比较单一,不能自己定义查找方式,且 *** 作比较繁琐,所以需要寻找一种能对属性数据进行快速查询、分析的方法。

一、属性数据文件记录格式

属性数据文件由点记录、线记录、面记录三部分组成。点、线、面记录各部分都有一个类首记录和若干中间记录,以文本方式存储。

作业中使用的式矢量地形图数据是严格按照生产记录格式组织、存储的,具有严谨规范的数据结构,很自然我们可以利用数据库来实现属性数据的查询分析。

二、 *** 作流程

要实现这一设想,方法有很多,可以利用EXCEL、ACCESS导入分析,也可以编程直接读取属性数据文件。笔者采用的方法是将属性文件读入MDB数据库,利用SQL语言进行自定义查询,并输出结果的方式。流程图如下:

按图幅建立的mdb数据库中为每个图层建立一个数据表,用于存储每层的属性数据。数据表的结构(字段名称、数据类型、长度等)应按照军标格式设置,避免出现转换时数据丢失。利用自编程序将属性文件中的记录逐个读入数据库,在查询语句框中输入SQL语句即可进行数据筛选。通过分类筛选,将同类地物放在一起比较,就可以很轻松的检查出地物属性是否存在遗漏和错误。若需输出查询结果,程序可根据相应的坐标文件生成err文件,以供在freescan中检查修改。程序利用VB60+数据控件的方式实现,主界面如下:

三、利用SQL实现属性数据查询分析

结构化查询语言SQL是工业标准数据库 *** 作语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统,在实践中得到了广泛运用。它以记录集合作为 *** 作对象,所有SQL语句接受集合作为输入,返回集合作为输出,这种集合特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语句可以嵌套,这使他具有极大的灵活性和强大的功能。

SQL语言包含4个部分 数据定义语言(如CREATE、DROP、ALTER等语句)、数据 *** 作语言(如INSERT、UPDATE、DELETE语句)、数据查询语言(如SELECT语句)、数据控制语言(如GRANT、REVOKE、COMMIT、ROLLBACK等语句)。我们最常用到的SQL包括选择列表、FROM子句和WHERE子句,它们分别说明所查询列、查询的表、以及搜索条件等。

通过SQL语句的组合可以实现更多复杂的查询,实现对数据的分析与筛选。

如进行独立房与街区名称指针的挂接SQL语句:

SELECT FROM 居民地C WHERE (居民地C注记编号=Any (select 注记编号 from 居民地C where 居民地C编码=130204)) and 注记编号<>0 and 编码=130201;

这是查找街道名未挂指针的SQL语句:

SELECT FROM 注记R

WHERE 注记R编码=280338 and (注记R注记号 NOT in (select 陆地交通D注记编号 from 陆地交通D));

通过修改SQL语句就可以非常灵活的实现各种查询和筛选。为了方便 *** 作,还可以将各种条件的查询语句存放在一个文本文件中,随时调用。

本文主要介绍了利用SQL语句在数据库中对矢量地形图属性数据进行分析检查的一种方法,这种方法在往年的数据入库中是可行的,且在一定程度上提高了作业效率。在当前进行境外数字判绘过程中,需要我们通过实践不断总结和探索新的更有效的作业方法,高质量、高效率圆满完成任务。

;

数据库优化一方面是找出系统的瓶颈,提高MySQL数据库的整体性能,而另一方面需要合理的结构设计和参数调整,以提高用户的相应速度,同时还要尽可能的节约系统资源,以便让系统提供更大的负荷

1 优化一览图

2 优化

笔者将优化分为了两大类,软优化和硬优化,软优化一般是 *** 作数据库即可,而硬优化则是 *** 作服务器硬件及参数设置

21 软优化

211 查询语句优化

1首先我们可以用EXPLAIN或DESCRIBE(简写:DESC)命令分析一条查询语句的执行信息

2例:

显示:

其中会显示索引和查询数据读取数据条数等信息

212 优化子查询

在MySQL中,尽量使用JOIN来代替子查询因为子查询需要嵌套查询,嵌套查询时会建立一张临时表,临时表的建立和删除都会有较大的系统开销,而连接查询不会创建临时表,因此效率比嵌套子查询高

213 使用索引

索引是提高数据库查询速度最重要的方法之一,关于索引可以参高笔者<MySQL数据库索引>一文,介绍比较详细,此处记录使用索引的三大注意事项:

214 分解表

对于字段较多的表,如果某些字段使用频率较低,此时应当,将其分离出来从而形成新的表,

215 中间表

对于将大量连接查询的表可以创建中间表,从而减少在查询时造成的连接耗时

216 增加冗余字段

类似于创建中间表,增加冗余也是为了减少连接查询

217 分析表,,检查表,优化表

分析表主要是分析表中关键字的分布,检查表主要是检查表中是否存在错误,优化表主要是消除删除或更新造成的表空间浪费

1 分析表: 使用 ANALYZE 关键字,如ANALYZE TABLE user;

2 检查表: 使用 CHECK关键字,如CHECK TABLE user [option]

option 只对MyISAM有效,共五个参数值:

3 优化表:使用OPTIMIZE关键字,如OPTIMIZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE user;

LOCAL|NO_WRITE_TO_BINLOG都是表示不写入日志,优化表只对VARCHAR,BLOB和TEXT有效,通过OPTIMIZE TABLE语句可以消除文件碎片,在执行过程中会加上只读锁

22 硬优化

221 硬件三件套

1配置多核心和频率高的cpu,多核心可以执行多个线程

2配置大内存,提高内存,即可提高缓存区容量,因此能减少磁盘I/O时间,从而提高响应速度

3配置高速磁盘或合理分布磁盘:高速磁盘提高I/O,分布磁盘能提高并行 *** 作的能力

222 优化数据库参数

优化数据库参数可以提高资源利用率,从而提高MySQL服务器性能MySQL服务的配置参数都在mycnf或myini,下面列出性能影响较大的几个参数

223 分库分表

因为数据库压力过大,首先一个问题就是高峰期系统性能可能会降低,因为数据库负载过高对性能会有影响。另外一个,压力过大把你的数据库给搞挂了怎么办?所以此时你必须得对系统做分库分表 + 读写分离,也就是把一个库拆分为多个库,部署在多个数据库服务上,这时作为主库承载写入请求。然后每个主库都挂载至少一个从库,由从库来承载读请求。

224 缓存集群

如果用户量越来越大,此时你可以不停的加机器,比如说系统层面不停加机器,就可以承载更高的并发请求。然后数据库层面如果写入并发越来越高,就扩容加数据库服务器,通过分库分表是可以支持扩容机器的,如果数据库层面的读并发越来越高,就扩容加更多的从库。但是这里有一个很大的问题:数据库其实本身不是用来承载高并发请求的,所以通常来说,数据库单机每秒承载的并发就在几千的数量级,而且数据库使用的机器都是比较高配置,比较昂贵的机器,成本很高。如果你就是简单的不停的加机器,其实是不对的。所以在高并发架构里通常都有缓存这个环节,缓存系统的设计就是为了承载高并发而生。所以单机承载的并发量都在每秒几万,甚至每秒数十万,对高并发的承载能力比数据库系统要高出一到两个数量级。所以你完全可以根据系统的业务特性,对那种写少读多的请求,引入缓存集群。具体来说,就是在写数据库的时候同时写一份数据到缓存集群里,然后用缓存集群来承载大部分的读请求。这样的话,通过缓存集群,就可以用更少的机器资源承载更高的并发。

一个完整而复杂的高并发系统架构中,一定会包含:各种复杂的自研基础架构系统。各种精妙的架构设计因此一篇小文顶多具有抛砖引玉的效果,但是数据库优化的思想差不多就这些了

第一个

declare @m_d1 date,@m_d2 date

在选时间的时候将开始日期和结束时间赋值给@m_d1,@m_d2

m_sql="select from time where 时间 between @m_d1 and @m_d2"

试试看是不是要这个效果

--注释

--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 123456 from emp;

select 123456 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,sal12 年薪 from emp;

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

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

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

select ename,job,sal12+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;

分组查询(group by)

分组查询:

1查询每个部门的最高工资

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

2查询每个职位的平均工资

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

3查询每个部门的人数

select deptno,count() from emp group by deptno;

4查询工资大于1000的员工,每个部门的最大工资

select deptno,max(sal) from emp where sal>1000 group by deptno;

多字段分组查询:group by 字段1,字段2;

1查询每个部门下每个主管的手下人数

select deptno, mgr, count() from emp where mgr is not null group by deptno,mgr;

2查询emp表中每个部门的编号,人数,工资总和,最后根据人数进行升序排序,如果人数一致,根据工资总和降序排序

select deptno,count(),sum(sal) from emp group by deptno order by count() asc,sum(sal) desc;

3查询工资在1000-3000之间的员工信息,每个部门的编号,平均工资,最低工资,最高工资,根据平均工资进行升序排序排列

select deptno,avg(sal),min(sal),max(sal) from emp where sal between 1000 and 3000 group by deptno order by avg(sal)

4查询含有上级领导的员工,每个职业的人数,工资的总和,平均工资,最低工资,最后根据人数进行降序排列,如果人数一致,根据平均工资进行升序排列

select job, count(),avg(sal),min(sal) from emp where mgr is not null group by job order by count() desc,avg(sal) asc;

各种关键字的顺序

select from 表名  where grouphaving order by limit

    having(结合group by使用)

having一般要结合分组查询和聚合函数使用,用于给聚合函数的内容添加条件

聚合函数的条件不能写在where后面

普通字段的条件写在where后面,聚合函数的条件写在having后面

1查询每个部门的平均工资,要求平均工资大于2000(c是别名的用法)

select deptno,avg(sal) c from emp group by deptno having c >2000;

2查询每个分类的平均单价,要求平均单价低于100

select category_id ,avg(price) a from t_item group by category_id having a<100;

3查询category_id分类为238和917的两个分类的平均单价

select category_id,avg(price) from t_item where category_id in(238,917) group by category_id;

4查询emp表中每个部门的平均工资高于2000的部门编号,部门人数,平均工资,最后根据平均工资降序排列

select deptno,count(),avg(sal) a from emp group by deptno having a>2000 order by a desc;

5查询emp表中工资在1000-3000之间的员工,每个部门编号,工资总和,平均工资,过滤掉平均工资低于2000的部门,按照平均工资进行升序排序

select deptno,sum(sal), avg(sal) a from emp where sal between 1000 and 3000 group by deptno having a>=2000 order by a asc;

6查询emp表中每年入职的人数

select extract(year from hiredate) year,count() from emp group by year;

7查询每个部门的最高平均工资

select deptno,avg(sal) from emp group by deptno order by avg(sal) limit 0,1;

子查询(嵌套查询)

子查询可以写在where或having后面当做查询条件的值

写在from后面,当做一张新表(但是必须要有别名)

select ename from (select from emp where sal>1000) newtable;

写在创建表的时候

create table emp_20 as (select from emp where deptno=20);

1查询emp表中工资最高的员工信息

select from emp where sal=(select max(sal) from emp);

2查询emp表中工资大于平均工资的所有员工的信息

select from emp where sal>(select avg(sal) from emp);

3查询工资高于20号部门最大工资的员工信息

select from emp where sal>(select max(sal) from emp where deptno=20);

4查询工资高于20号部门最大工资的员工信息

select from emp where sal>(select avg(sal) from emp);

5查询和Jones相同工资的其他员工信息

select from emp where job=(select job from emp where ename='jones' and ename!='jones');

6查询工资最低的员工的同事们的信息(同事=相同job)

select from  emp where job=(select job from emp where sal=(select min(sal) from emp)) and sal !=(select min(sal) from emp);

7查询最晚入职的员工信息

select from emp where hiredate=(select max(hiredate) from emp);

8查询名字为King的部门编号和部门名称(需要用到dept表)

select deptno,dname from dept where deptno=(select deptno from emp where ename='king');

9查询有员工的部门信息(编号和名称)

select deptno ,dname from dept where deptno in (select distinct deptno from emp);

10查询平均工资最高的部门信息

select from dept where deptno in (select deptno from emp group by deptno having avg(sal)=(select avg(sal) from emp group by deptno order by avg(sal) desc limit 0,1));

关联查询

同时查询多张表的数据称为关联查询

1查询每一个员工的名称和其对应的部门名称

select eename,ddname from emp e,dept d where edeptno=ddeptno;

2查询在new york工作的所有员工的信息

select  e from emp  e,dept  d  where edeptno=ddeptno and  dloc='new york';

笛卡尔积

如果关联查询不写关联关系则查询到的数据是两张表的乘积,这个乘积称为笛卡尔积,笛卡尔是一种错误查询方式的结果,工作切记不要出现

    等值连接和内连接

等值连接:

select from A,B where Ax=Bx and Aage=18;

内连接:

select from A join B on Ax=Bx where Aage=18;(将关联关系写在on后面)

1查询每个员工的名称和其对应的部门名称

select eename,ddname from emp e join dept d on edeptno=ddeptno;

外连接

使用外连接查询得到的数据层除了两张表的交集数据以外和另外一张主表的全部数据,哪个表为主表通过left/rigth控制, left以join左边表为主表 rigth以join右边表为主表

1查询所有员工的名称和其对应的部门名称

select eename,ddname from emp e left join dept d on edeptno=ddeptno;

以上就是关于数据库表查询进阶(1)全部的内容,包括:数据库表查询进阶(1)、通用SQL数据库查询语句精华使用简介、海量数据库查询中,如何提高查询效率等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/sjk/9675428.html

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

发表评论

登录后才能评论

评论列表(0条)

保存