.질의 결과에 중복된 기록을 표시하지 않음
중복된 기록을 삭제할 때 사용하는 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
결과 유형은 부울이고 반환 값은 다음과 같습니다. test_expression 값이 start_expression 값보다 작거나 같거나 다음보다 큰 경우 또는 end_expression 값과 같으면 NOT BETWEEN은 true를 반환합니다.
참고: 제외 범위를 지정하려면 BETWEEN 대신 초과(>) 및 미만(<) 연산자를 사용할 수도 있습니다. <)运算符代替 BETWEEN。
(2)IS [NOT] NULL
지정된 키워드에 따라 null 또는 null이 아닌 값을 쿼리합니다. 피연산자가 null인 경우 표현식 값은 null입니다.
(3) [NOT] IN
사용된 키워드가 목록에 포함되는지, 목록에서 제외되는지에 따라 표현식에 대한 쿼리를 지정합니다. 쿼리 표현식은 순열 또는 열 이름을 사용할 수 있으며 목록은 순열 또는 하위 쿼리 집합일 수 있습니다(더 자주). 목록이 상수 집합인 경우 한 쌍의 괄호 안에 배치해야 합니다.
구문은 다음과 같습니다.
test_expression [NOT] in( subquery expression[,...n] )
매개변수 설명:
①test_expression: SQL 표현식
②하위 쿼리: 특정 열 결과를 포함합니다. 하위 쿼리를 설정하려면 열의 데이터 형식이 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 조건자를 사용하여 하위 쿼리를 도입합니다. 경우에 따라 하위 쿼리가 true 또는 false 값을 반환하는 한 조건자 충족 여부만 고려되며 데이터 내용 자체는 중요하지 않습니다. 이 시점에서 EXISTS 조건자를 사용하여 하위 쿼리를 정의할 수 있습니다. EXISTS 조건자는 하위 쿼리가 하나 이상의 행을 반환하면 true이고, 그렇지 않으면 false입니다. 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的记录集。
全外连接表示两张表都不加限制。