.在查询结果中不显示重复记录
查询时不显示重复记录主要应用了 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。
注意:若要指定排除范围,还可以使用大于(>)和小于(
(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 结果是 张3 1 23 1 李四 2 34 2 null 3 34 4 王武 nul
-------------------------------------------------
备注:内连接与外连接区别?
内连接只返回两张表相匹配的数据;而外连接是对内连接的扩展,可以使查询更具完整性,不会丢失数据。下面举例说明两者区别。
假设有两张表,分别为表A 与 表B,两张表公共部分为 C 。
内连接的连接结果是两个表都存在记录,可以说 A 内连 B 得到的是 C。
表 A 左外连接B,那么A不受影响,查询结果为公共部分C 加表A的记录集。
表A右外连接B,那么B不受影响,查询结果为公共部分C加表B的记录集。
全外连接表示两张表都不加限制。

MySQL索引基数对查询性能有显着影响:1.高基数索引能更有效地缩小数据范围,提高查询效率;2.低基数索引可能导致全表扫描,降低查询性能;3.在联合索引中,应将高基数列放在前面以优化查询。

MySQL学习路径包括基础知识、核心概念、使用示例和优化技巧。1)了解表、行、列、SQL查询等基础概念。2)学习MySQL的定义、工作原理和优势。3)掌握基本CRUD操作和高级用法,如索引和存储过程。4)熟悉常见错误调试和性能优化建议,如合理使用索引和优化查询。通过这些步骤,你将全面掌握MySQL的使用和优化。

MySQL在现实世界的应用包括基础数据库设计和复杂查询优化。1)基本用法:用于存储和管理用户数据,如插入、查询、更新和删除用户信息。2)高级用法:处理复杂业务逻辑,如电子商务平台的订单和库存管理。3)性能优化:通过合理使用索引、分区表和查询缓存来提升性能。

MySQL中的SQL命令可以分为DDL、DML、DQL、DCL等类别,用于创建、修改、删除数据库和表,插入、更新、删除数据,以及执行复杂的查询操作。1.基本用法包括CREATETABLE创建表、INSERTINTO插入数据和SELECT查询数据。2.高级用法涉及JOIN进行表联接、子查询和GROUPBY进行数据聚合。3.常见错误如语法错误、数据类型不匹配和权限问题可以通过语法检查、数据类型转换和权限管理来调试。4.性能优化建议包括使用索引、避免全表扫描、优化JOIN操作和使用事务来保证数据一致性

InnoDB通过undolog实现原子性,通过锁机制和MVCC实现一致性和隔离性,通过redolog实现持久性。1)原子性:使用undolog记录原始数据,确保事务可回滚。2)一致性:通过行级锁和MVCC确保数据一致。3)隔离性:支持多种隔离级别,默认使用REPEATABLEREAD。4)持久性:使用redolog记录修改,确保数据持久保存。

MySQL在数据库和编程中的地位非常重要,它是一个开源的关系型数据库管理系统,广泛应用于各种应用场景。1)MySQL提供高效的数据存储、组织和检索功能,支持Web、移动和企业级系统。2)它使用客户端-服务器架构,支持多种存储引擎和索引优化。3)基本用法包括创建表和插入数据,高级用法涉及多表JOIN和复杂查询。4)常见问题如SQL语法错误和性能问题可以通过EXPLAIN命令和慢查询日志调试。5)性能优化方法包括合理使用索引、优化查询和使用缓存,最佳实践包括使用事务和PreparedStatemen

MySQL适合小型和大型企业。1)小型企业可使用MySQL进行基本数据管理,如存储客户信息。2)大型企业可利用MySQL处理海量数据和复杂业务逻辑,优化查询性能和事务处理。

InnoDB通过Next-KeyLocking机制有效防止幻读。1)Next-KeyLocking结合行锁和间隙锁,锁定记录及其间隙,防止新记录插入。2)在实际应用中,通过优化查询和调整隔离级别,可以减少锁竞争,提高并发性能。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境