1.在查询结果中不显示重复记录

查询时不显示重复记录主要应用了 DISTINCT 关键字,该关键字用于删除重复记录。

在实现查询操作时,如果查询的选择列表中包含一个表的主键,那么每个查询中的记录都将是唯一的(因为主键在每一条记录中有一个不同的值);如果主键不包含在查询结果中,就可能出现重复记录。使用 DISTINCT 关键字以后即可删除重复记录。

DISTINCT 的语法如下:

SELECT DISTINCT select_list;

注意:DISTINCT 关键字并不是指某一行,而是指不重复 SELECT 输出的所有列。这一点十分重要,其作用是防止相同的行出现在一个查询结果的输出中。

例如:

select distinct name,price,date,address,quality from tb;

2.使用 NOT 查询不满足条件的记录

使用 NOT 与谓词进行组合所形成的条件进行查询。

NOT 与谓词进行组合所形成的表达式分别是 [NOT] BETWEEN、IS [NOT] NULL 和 [NOT] IN 。

(1)[NOT] BETWEEN

该条件指定值的包含范围,使用 AND 将开始值和结束值分开。

其语法如下:

test_expression [NOT] BETWEEN begin_expression AND end_expression

结果类型为 boolean ,返回值为:如果 test_expression 的值小于等于 begin_expression 的值或者大于等于 end_expression 的值,则 NOT BETWEEN 返回 true。

注意:若要指定排除范围,还可以使用大于(>)和小于(<)运算符代替 BETWEEN。

(2)IS [NOT] NULL

根据所使用的关键字指定对空值或非空值进行查询,如果有任何操作数是 null, 表达式取值为 null 。

(3)[NOT] IN

根据所使用的关键字是包含在列表内还是排除在列表外,指定对表达式进行查询。查询表达式可以使用常亮或列名,而列表可以是一组常亮或者子查询(更多的情况下)。如果列表为一组常量,则应该放置在一对圆括号内。

其语法如下:


test_expression [NOT] in( subquery   expression[,...n] )
参数说明: 
①test_expression:SQL 表达式

②subquery:包含某列结果集的子查询,该列必须与 test_expression  具有相同的数据类型。

③expression[,...n]:一个表达式列表,用来测试是否匹配。所有的表达式必须和 test_expression  j具有相同的数据类型。

例如:

select * from tb where selldate not between '2016-10-30' and '2016-12-12';

3.将子查询作为表达式

将子查询应用在 SELECT 子句中,其查询结构就可以以表达式的形式出现。在应用子查询有一些控制规则,了解这些规则有助于更好的掌握子查询的应用。

①由比较运算符引入的内层查询 SELECT 列表或 IN 只包括一个表达式或列名。在外层语句的 WHERE 子句中命名的列必须能与查询 SELECT 列表中命名的列连接兼容。

②由不可更改的比较运算符引入的子查询 (比较运算符后面不跟关键字ANY 和 ALL)不能包括 GROUP BY 子句或 HAVING 子句,除非预先确定了组或单个的值。

③由 EXISTS 引入的SELECT 列表一般都由星号(*)组成,而不必指定具体的列名,也可以嵌套子查询 WHERE 子句中限定行。

④子查询不能在内部处理它们的结果,也就是说,子查询不能包括 ORDER BY 子句。可选择的 DISTINCT 关键字可有效的对子查询结果进行排序,因为一些系统会通过首先将结果排序来消除重复记录。

例如:显示全部学生总成绩及学生总成绩与全校平均总成绩之差。

select stuId , stuName, (Math+Language+English)  Total , round((select avg(Math+Language+English) from tb),0)  Averages,

round(((Math+Language+English)-(select avg(Math+Language+English) from tb)),0) Average  from tb;

4.用子查询作为派生表

在实际 应用中,经常使用子查询作为派生表,就是将查询的结果集作为一个表使用。

子查询是一个用于处理多表操作的附加方法。语法结构如下:

(SELECT [ALL|DISTINCT]<select item list> From <table list>

[WHERE <search condition>]   [GROUP BY<group item list>  [HAVING <group by search condition>]]   )

例如:

将销售单按商品名称统计分组后查询销售数量大于14的商品(将分组统计数据作为派生表)

select *  from (select proname ,COUNT(*) as sl  from td GROUP BY proname) WHERE (sl > 14) ;

对商品销售表中销售数量前100名进行分组统计(将过滤数据作为派生表)

select sl,count(*)  from ( select * from tb ORDER BY zdbh LIMIT 0,100) GROUP BY sl;

统计客户关系表中未结账客户的欠款金额(将过滤数据作为派生表)

select name,sum(xsje) from  (select * from tb  where NOT pay) GROUP BY name;

查询所有战士训练信息和查询第三次射击成绩大于8环的战士信息(将一个查询结果作为另一个查询所操作的表)

select T.soldId, T.soldName, T.FrirstGun, T.SecondGun, T.ArtideGun from (select * from tb where ArtideGun>8) as T;

备注:必须为派生表起别名。

5.通过子查询关联数据

利用 EXISTS 谓词引入子查询。在某些情况下,只要子查询返回一个真值或假值,只考虑是否满足谓词条件,数据内容本身并不重要。此时可以使用 EXISTS 谓词来定义子查询。如果子查询返回一行或多行,EXISTS 谓词为真,否则为假。要使 EXISTS 谓词起作用,应该在子查询中建立查询条件以匹配子查询连接起来的两个表中的值。

语法如下:

EXISTS subquery

参数说明:

subquery:一个受限的 SQL 语句(不允许有 COMPUTE 子句和 INTO 关键字) 。

例如:获取英语成绩大于90分的学生信息

select name,college,address from tb_Stu where exists (select name from tb_grades M where M.name=I.name and English>90) ;

备注:EXISTS 谓词子查询中的 SELECT 子句中可使用任何列名,也可以使用任何多个列。这种谓词值只注重是否返回行,而不注重行的内容,用户可以指定列名或者只使用一个“*”。

6.实现笛卡尔乘积查询

笛卡尔乘积查询实现了两张表之间的交叉连接,在查询语句中没有 WHERE 查询条件,返回到结果集中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合条件的数据行数。

笛卡尔乘积的关键字是 CROSS JOIN 。例如,用户信息表中有2条数据,职工信息表中有4条数据,当这两张表应用笛卡尔乘积进行查询时,查询的结果就是2×4=8条。

例如:

select EmpId,EmpName,Depatment,JobTitle,Wages from  tb_employees   a cross join tb_position b;

备注:在进行多表查询时需要主注意,由于多表可能会出现相同的字段,因此在指定查询字段时,最好为重复的字段起别名,以方便区分。

7.使用 UNION 并运算

UINON 指的是并运算,即从两个或多个类似的结果集中选择行,并将其组合在一起形成一个单独的结果集。

UINON 运算符主要用于将两个或更多查询结果组合为单个结果集,该结果集包含联合查询中所有查询的全部行。在使用 UNION 运算符时应遵循以下准则:

①在使用 UNION 运算符组合的语句中,所有选择列表的表达式数目必须相同(列名、算术表达式、聚集函数等)。

②在使用 UNION 运算符组合的结果集中的相应列或个别查询中使用的任意列的子集必须具有相同的数据类型,并且两者数据类型之间必须存在可能的隐性转换或提供了显式转换。

③利用 UNION 运算符组合的各语句中对应的结果集列出现的顺序必须相同,因为 UNION 运算符是按照各个查询给定的顺序逐个比较各列。

④ UNION 运算符组合不同的数据类型时,这些数据类型将使用数据类型优先级的规则进行转换。

⑤通过 UNION 运算符生产的表中列名来自 UNION 语句中的第一个单独的查询。若要用新名称引用结果集中的某列,必须按第一个 SELECT 语句中的方式引用该列。

例如:

select filenumuber,name,juior,address  from tb union select filenumuber,name,senior,address from tk;

8.内外连接查询

1)内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符)。包括相等联接和自然联接。     
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。

内连接可以分为等值连接、自然连接和不等值连接。

等值连接使用等号运算符比较被连接列的值,在查询结果中将列出连接表中的所有列,包括重复列。等值连接返回所有连接表中具有匹配值的行。

等值连接查询的语法如下:

select fildList from  table1 inner join table2 on table1.column = table2.column;

参数说明:

fildList:要查询的字段列表。  
    
2)外联接。外联接可以是左向外联接、右向外联接或完整外部联接。     
在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:

1)LEFT  JOIN或LEFT OUTER JOIN     
左向外联接的结果集包括  LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

2)RIGHT  JOIN 或 RIGHT  OUTER  JOIN     
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。例如 ,表 A 右外连接表 B,结果为公共部分 C 加表 B 的结果集。如果表 A 中没有与表 B 匹配的项,就是用 NULL 进行连接。     
3)FULL  JOIN 或 FULL OUTER JOIN
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。   
    
3)交叉联接   
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。

FROM 子句中的表或视图可通过内联接或完整外部联接按任意顺序指定;但是,用左或右向外联接指定表或视图时,表或视图的顺序很重要。有关使用左或右向外联接排列表的更多信息,请参见使用外联接。     
    
例子:

-------------------------------------------------

  a表     id   name       b表     id   job   parent_id
1 张3    1 23 1
2 李四    2 34 2
3 王武    3 34 4
a.id同parent_id 存在关系

--------------------------------------------------    
 1) 内连接

 select   a.*,b.*   from   a   inner   join   b     on   a.id=b.parent_id
结果是 :
1 张3 1 23 1
2 李四 2 34 2

-------------------------------------------------
  2)左连接

  select   a.*,b.*   from   a   left   join   b     on   a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
3 王武 null

-------------------------------------------------

3) 右连接

  select   a.*,b.*   from   a   right   join   b     on   a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
null 3 34 4

-------------------------------------------------
 4) 完全连接

  select   a.*,b.*   from   a   full   join   b     on   a.id=b.parent_id   

  结果是
1 张3 1 23 1
2 李四 2 34 2
null 3 34 4
3 王武 nul

-------------------------------------------------

备注:内连接与外连接区别?

内连接只返回两张表相匹配的数据;而外连接是对内连接的扩展,可以使查询更具完整性,不会丢失数据。下面举例说明两者区别。

假设有两张表,分别为表A 与 表B,两张表公共部分为 C 。

内连接的连接结果是两个表都存在记录,可以说 A 内连 B 得到的是 C。

表 A 左外连接B,那么A不受影响,查询结果为公共部分C 加表A的记录集。

表A右外连接B,那么B不受影响,查询结果为公共部分C加表B的记录集。

全外连接表示两张表都不加限制。

////end

mysql数据库操作(3)的更多相关文章

  1. php : mysql数据库操作类演示

    设计目标: 1,该类一实例化,就可以自动连接上mysql数据库: 2,该类可以单独去设定要使用的连接编码(set names XXX) 3,该类可以单独去设定要使用的数据库(use XXX): 4,可 ...

  2. php MySQL数据库操作类源代码

    php MySQL数据库操作类源代码: <?php class MySQL{ private $host; //服务器地址 private $name; //登录账号 private $pwd; ...

  3. 设计模式 - 单例模式mysql数据库操作类

    待续... index.php 调用方法: <?php header('Content-Type:text/html; charset=utf8'); require 'instance.php ...

  4. MySQL数据库操作常用命令

    MySQL数据库操作常用命令DOS连接数据库1.安装MySQL配置好环境2.运行cmd命令net start mysql3.找到mysql文件根目录输入命令mysql -h localhost -u ...

  5. Python/MySQL(四、MySQL数据库操作)

    Python/MySQL(四.MySQL数据库操作) 一.数据库条件语句: case when id>9 then ture else false 二.三元运算: if(isnull(xx)0, ...

  6. Java通过JDBC 进行MySQL数据库操作

    转自: http://blog.csdn.net/tobetheender/article/details/52772157 Java通过JDBC 进行MySQL数据库操作 原创 2016年10月10 ...

  7. Mysql 数据库操作之DDL、DML、DQL语句操作

    Mysql 数据库操作之DDL.DML.DQL语句操作 设置数据库用户名密码 l  Show databases 查看数据库列表信息 l  查看数据库中的数据表信息 ,格式: use 数据库名: sh ...

  8. Python进行MySQL数据库操作

    最近开始玩Python,慢慢开始喜欢上它了,以前都是用shell来实现一些自动化或者监控的操作,现在用Python来实现,感觉更棒,Python是一门很强大的面向对象语言,所以作为一个运维DBA或者运 ...

  9. Python3:sqlalchemy对mysql数据库操作,非sql语句

    Python3:sqlalchemy对mysql数据库操作,非sql语句 # python3 # author lizm # datetime 2018-02-01 10:00:00 # -*- co ...

  10. (转载)常用的Mysql数据库操作语句大全

    打开CMD,进入数据库命令:mysql -hlocalhost -uroot -p 退出数据库:exit 用户管理: 1.新建用户: >CREATE USER name IDENTIFIED B ...

随机推荐

  1. Leetcode0523--Continuous Subarray Sum 连续和倍数

    [转载请注明]https://www.cnblogs.com/igoslly/p/9341666.html class Solution { public: bool checkSubarraySum ...

  2. Win32子窗口的创建

    本文主要是在一个主窗口下创建一个子窗口.主窗口有一个菜单,菜单下只有设置一个选项,点击设置选项,弹出设置界面,点击设置界面关闭则关闭.我在开发的时候遇到两个问题,第一就是一点设置关闭就整个应用都关了, ...

  3. node(koa)微信公众号接口认证

    使用微信测试号, 花生壳内网穿透 需要注意 token 两边都是自定义, 需要保持一致, const Koa = require('koa') const sha1 = require('sha1') ...

  4. Angular——事件指令

    基本介绍 angular的事件指令都是ng-click,ng-blur....的形式,类似于js的事件 基本使用 <!DOCTYPE html> <html lang="e ...

  5. html——相对路径、绝对路径(有待补充....)

    相对路径主要看你访问的文件相对自己的页面在哪个文件夹下.如果自己藏的很深,必须用“../”跳出.如果项目中的文件位置分布是这样: 那么index页面若要访问这两张图片就需要用相对路径: <img ...

  6. 学习笔记-java IO流总结 转载

    1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读 ...

  7. servlet-请求重定向

    package servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.ser ...

  8. MySQL主从备份配置

    MySQL主从热备配置 两台服务器的MySQL版本都是5.5.41master:192.168.3.119slave:192.168.3.120 MySQL主服务器配置:1.创建用于备份的用户 gra ...

  9. 3星|《IBM商业价值报告:区块链》:一些重要行业对区块链的态度和已经发生的区块链的应用

    区块链项目开发指南 (区块链技术丛书) 介绍IBM的专家们调研许多重要行业与组织后总结的各行业对区块链的态度和实际的应用.看起来有点意思,不过有两个缺点: 1:这些实际已经发生的应用基本没看到相关的新 ...

  10. (转)Arcgis for Js之Graphiclayer扩展详解

    http://blog.csdn.net/gisshixisheng/article/details/41208185 在前两节,讲到了两种不同方式的聚类,一种是基于距离的,一种是基于区域范围的,两种 ...