Heim >Datenbank >MySQL-Tutorial >MySQL-Datenbankbetrieb
.Zeigen Sie keine doppelten Datensätze in Abfrageergebnissen an
Zeigen Sie keine doppelten Datensätze an, wenn bei der Abfrage hauptsächlich das Schlüsselwort DISTINCT verwendet wird, das zum Löschen doppelter Datensätze verwendet wird.
Wenn bei der Implementierung von Abfragevorgängen die Auswahlliste der Abfrage den Primärschlüssel einer Tabelle enthält, sind die Datensätze in jeder Abfrage eindeutig (da der Primärschlüssel in jedem Datensatz einen anderen Wert hat). Wenn der Schlüssel nicht in den Abfrageergebnissen enthalten ist, werden möglicherweise doppelte Datensätze angezeigt. Verwenden Sie das Schlüsselwort DISTINCT, um doppelte Datensätze zu löschen.
Die Syntax von DISTINCT lautet wie folgt:
SELECT DISTINCT select_list;
Hinweis: Das Schlüsselwort DISTINCT bezieht sich nicht auf eine bestimmte Zeile, sondern auf alle Spalten der SELECT-Ausgabe ohne Duplizierung. Dies ist wichtig, da dadurch verhindert wird, dass dieselben Zeilen in der Ausgabe einer Abfrage erscheinen.
Zum Beispiel:
select distinct name,price,date,address,quality from tb;
2. Verwenden Sie NOT, um Datensätze abzufragen, die die Bedingungen nicht erfüllen.
Verwenden Sie die durch Kombination von NOT gebildete Bedingung mit dem Prädikat. Die durch die Kombination von
NOT mit Prädikaten gebildeten Ausdrücke sind [NOT] BETWEEN, IS [NOT] NULL bzw. [NOT] IN.
(1)[NOT] BETWEEN
Diese Bedingung gibt den inklusiven Wertebereich an, wobei AND verwendet wird, um den Startwert und den Endwert zu trennen.
Die Syntax lautet wie folgt:
test_expression [NOT] BETWEEN begin_expression AND end_expression
Der Ergebnistyp ist boolesch und der Rückgabewert ist: Wenn der Wert von test_expression kleiner oder gleich dem Wert von begin_expression oder größer als ist oder gleich dem Wert von end_expression, dann gibt NOT BETWEEN true zurück.
Hinweis: Um einen Ausschlussbereich anzugeben, können Sie anstelle von BETWEEN auch die Operatoren „Größer als“ (>) und „Kleiner als“ (
(2) IS [NOT] NULL
Abfragen nach Null- oder Nicht-Null-Werten entsprechend dem angegebenen Schlüsselwort. Wenn einer der Operanden null ist, ist der Ausdruckswert null.
(3) [NOT] IN
Gibt den Ausdruck an, der abgefragt werden soll, basierend darauf, ob das verwendete Schlüsselwort in der Liste enthalten oder aus der Liste ausgeschlossen ist. Abfrageausdrücke können Permutationen oder Spaltennamen verwenden, und Listen können (häufiger) eine Reihe von Permutationen oder Unterabfragen sein. Wenn es sich bei der Liste um eine Menge von Konstanten handelt, sollte sie in Klammern gesetzt werden.
Die Syntax lautet wie folgt:
test_expression [NOT] in( subquery expression[,...n] )
Parameterbeschreibung:
①test_expression: SQL-Ausdruck
②subquery: Enthält ein bestimmtes Spaltenergebnis Wenn Sie die Unterabfrage festlegen, muss die Spalte denselben Datentyp wie test_expression haben.
③Ausdruck[,...n]: Eine Liste von Ausdrücken, mit denen getestet wird, ob sie übereinstimmen. Alle Ausdrücke müssen vom gleichen Datentyp sein wie test_expression j.
Zum Beispiel:
select * from tb where selldate not between '2016-10-30' and '2016-12-12';
3. Verwenden Sie die Unterabfrage als Ausdruck
Wenden Sie die Unterabfrage in der SELECT-Klausel an, ihre Abfragestruktur Es kann in Form eines Ausdrucks erscheinen. Beim Anwenden von Unterabfragen gibt es einige Kontrollregeln. Wenn Sie diese Regeln verstehen, können Sie die Anwendung von Unterabfragen besser beherrschen.
①Die vom Vergleichsoperator eingeführte innere Abfrage-SELECT-Liste oder IN enthält nur einen Ausdruck oder Spaltennamen. In der WHERE-Klausel der äußeren Anweisung benannte Spalten müssen mit den in der SELECT-Liste der Abfrage genannten Spalten kompatibel sein.
②Eine Unterabfrage, die durch einen unveränderlichen Vergleichsoperator (einen Vergleichsoperator, dem nicht die Schlüsselwörter ANY und ALL folgen) eingeleitet wird, kann keine GROUP BY-Klausel oder HAVING-Klausel enthalten, es sei denn, der Gruppen- oder Einzelwert.
③Die durch EXISTS eingeführte SELECT-Liste besteht im Allgemeinen aus Sternchen (*). Es ist nicht erforderlich, bestimmte Spaltennamen anzugeben, und Zeilen können auch in verschachtelten Unterabfragen in der WHERE-Klausel qualifiziert werden.
④Unterabfragen können ihre Ergebnisse nicht intern verarbeiten, das heißt, Unterabfragen dürfen keine ORDER BY-Klausel enthalten. Das optionale Schlüsselwort DISTINCT ist zum Sortieren von Unterabfrageergebnissen nützlich, da einige Systeme doppelte Datensätze entfernen, indem sie zuerst die Ergebnisse sortieren.
Zum Beispiel: Zeigen Sie die Gesamtpunktzahl aller Schüler und die Differenz zwischen der Gesamtpunktzahl der Schüler und der Durchschnittspunktzahl der Schule an.
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. Unterabfragen als abgeleitete Tabellen verwenden
In praktischen Anwendungen werden Unterabfragen häufig als abgeleitete Tabellen verwendet, d. h. als Ergebnismenge der Abfrage Wird als Tabellenverwendung verwendet.
Unterabfrage ist eine zusätzliche Methode zur Handhabung von Mehrtabellenoperationen. Die Syntaxstruktur ist wie folgt:
(SELECT [ALL|DISTINCT]<select item list> From <table list> [WHERE <search condition>] [GROUP BY<group item list> [HAVING <group by search condition>]] )
Zum Beispiel:
Gruppieren Sie die Verkaufsaufträge statistisch nach Produktnamen und fragen Sie die Produkte mit einer Verkaufsmenge größer als 14 ab (verwenden Sie die Gruppenstatistik als). eine abgeleitete Tabelle)
select * from (select proname ,COUNT(*) as sl from td GROUP BY proname) WHERE (sl > 14) ;
Führen Sie Gruppenstatistiken für die 100 größten Verkaufsmengen in der Produktverkaufstabelle durch (verwenden Sie die gefilterten Daten als abgeleitete Tabelle)
select sl,count(*) from ( select * from tb ORDER BY zdbh LIMIT 0,100) GROUP BY sl;
Zählen Sie den geschuldeten Betrag durch ungeklärte Kunden in der Kundenbeziehungstabelle (verwenden Sie die gefilterten Daten als abgeleitete Tabelle) Daten als abgeleitete Tabelle)
select name,sum(xsje) from (select * from tb where NOT pay) GROUP BY name;
Fragen Sie die Trainingsinformationen aller Kämpfer ab und fragen Sie die Informationen von Kämpfern ab, deren dritter Schuss punktet ist größer als 8 Ringe (verwenden Sie die Ergebnisse einer Abfrage als Tabelle, die von einer anderen Abfrage bedient wird)
select T.soldId, T.soldName, T.FrirstGun, T.SecondGun, T.ArtideGun from (select * from tb where ArtideGun>8) as T;
Hinweis: Die abgeleitete Tabelle muss einen Alias haben.
5. Verknüpfen Sie Daten über Unterabfragen.
Verwenden Sie das EXISTS-Prädikat, um Unterabfragen einzuführen. In einigen Fällen wird nur berücksichtigt, ob die Prädikatbedingung erfüllt ist, solange die Unterabfrage einen wahren oder falschen Wert zurückgibt, und der Dateninhalt selbst ist nicht wichtig. An dieser Stelle können Sie das EXISTS-Prädikat verwenden, um eine Unterabfrage zu definieren. Das EXISTS-Prädikat ist wahr, wenn die Unterabfrage eine oder mehrere Zeilen zurückgibt, andernfalls falsch. Damit das EXISTS-Prädikat funktioniert, müssen die Abfragebedingungen in der Unterabfrage so festgelegt werden, dass sie mit den Werten in den beiden durch die Unterabfrage verbundenen Tabellen übereinstimmen.
Die Syntax lautet wie folgt:
EXISTS subquery
Parameterbeschreibung:
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的记录集。
全外连接表示两张表都不加限制。