Heim  >  Artikel  >  Datenbank  >  Detaillierte Erläuterung der MySQL-Optimierung von Abfrageanweisungen

Detaillierte Erläuterung der MySQL-Optimierung von Abfrageanweisungen

黄舟
黄舟Original
2017-03-10 10:16:571432Durchsuche

Die grundlegende Syntaxform von select in MySQL

select 属性列表
from 表名和视图列表
[where 条件表达式]
[group by 属性名[having 条件表达式]]
[order by 属性名[asc|desc]]
[limit <offset>,row count]

Beschreibung:

where-Klausel: Abfrage gemäß den durch „bedingten Ausdruck“ angegebenen Bedingungen.

Gruppe nach-Klausel: Gruppiert nach dem durch „Attributname“ angegebenen Feld.

Having-Klausel: Die Haveing-Klausel kann nur mit „group by“ verwendet werden. Es können nur diejenigen ausgegeben werden, die die im „Bedingungsausdruck“ angegebenen Bedingungen erfüllen.

Die Group-by-Klausel wird normalerweise zusammen mit Aggregatfunktionen wie count() und sum() verwendet.

Order by-Klausel: Sortiert nach dem durch „Attributname“ angegebenen Feld. Die Sortiermethode wird durch die beiden Parameter „asc“ und „desc“ angegeben. Standardmäßig wird nach „asc“ sortiert, also in aufsteigender Reihenfolge.


Testtabelle erstellen

Testtabelle erstellen

CREATE TABLE fruits
(
  f_id CHAR(10)  NOT NULL,
  s_id INT NOT NULL,
  f_name  CHAR(255)  NOT NULL,
  f_price DECIMAL(8,2) NOT NULL,
  PRIMARY KEY(f_id)
)

Testdaten einfügen

INSERT INTO fruits(f_id,s_id,f_name,f_price)
VALUES(&#39;a1&#39;,101,&#39;apple&#39;,5.2),
(&#39;b1&#39;,102,&#39;blackberry&#39;,5.2),
(&#39;bs1&#39;,105,&#39;orange&#39;,5.2),
(&#39;bs2&#39;,103,&#39;melon&#39;,5.2),
(&#39;t1&#39;,106,&#39;banana&#39;,5.2);

Verwenden Sie die Select-Anweisung, um die Daten des f_id-Felds abzufragen

SELECT f_id,f_name FROM fruits

Hinweis: SQL-Anweisungen in MYSQL berücksichtigen nicht die Groß-/Kleinschreibung. empfindlich, also Die Funktionen von select und SELECT sind gleich

Allgemeine Abfragen

SELECT * FROM fruits

SELECT f_id,f_name FROM fruits WHERE f_price >5.1

SELECT f_id,f_name FROM fruits WHERE s_id IN(101,102)

SELECT f_id,f_name FROM fruits WHERE s_id NOT IN(101,102)

SELECT f_id,f_name FROM fruits WHERE f_price BETWEEN 2 AND 10

SELECT f_id,f_name FROM fruits WHERE f_price NOT  BETWEEN 2 AND 10

Zeichenübereinstimmungsabfrage mit like

1. Der Prozentzeichen-Platzhalter „%“ passt auf Zeichen beliebiger Länge, sogar auf null Zeichen

SELECT f_id,f_name FROM fruits WHERE f_name LIKE &#39;b%y&#39;


2. Der Unterstrich-Platzhalter „_“ kann jeweils nur mit jedem Zeichen übereinstimmen

Die folgende Anweisung enthält vier Unterstriche

SELECT f_id,f_name FROM fruits WHERE f_name LIKE &#39;____n&#39;


Abfrage nach Nullwerten

CREATE TABLE customers
(
  c_id INT  NOT NULL AUTO_INCREMENT,
  c_name CHAR(25) NOT NULL,
  c_city  CHAR(50)   NULL,
  PRIMARY KEY(c_id)
)

INSERT INTO customers(c_name,c_city)
VALUES(&#39;liming&#39;,&#39;china&#39;),
(&#39;hongfang&#39;,NULL)

SELECT * FROM customers WHERE c_city IS NULL

SELECT * FROM customers WHERE c_city IS NOT NULL

AND, ODER, DISTINCT-Schlüsselwort

SELECT f_id,f_name FROM fruits WHERE f_name LIKE &#39;____n&#39; AND f_id='bs2'

SELECT f_id,f_name FROM fruits WHERE f_name LIKE &#39;____n&#39; OR f_id='bs2'

SELECT DISTINCT s_id FROM fruits

GROUP BY

SELECT s_id ,COUNT(1) AS total FROM fruits GROUP BY s_id

Fügen Sie zwei weitere Datensätze ein

INSERT INTO fruits(f_id,s_id,f_name,f_price)
VALUES(&#39;a6&#39;,101,&#39;cherry&#39;,6),
(&#39;a8&#39;,102,&#39;coconut&#39;,7)

, wenn Sie möchten um jedes Angebot anzuzeigen. Der Name der vom Lieferanten bereitgestellten Obstsorte. In MYSQL können Sie die Funktion GROUP_CONCAT() in GROUP BY verwenden,

, um die Werte jedes Felds in jeder Gruppe anzuzeigen

SELECT s_id,GROUP_CONCAT(f_name) AS NAMES FROM fruits GROUP BY s_id

SQLSERVER verfügt nicht über die Funktion GROUP_CONCAT(), um den gleichen Effekt zu erzielen, muss SQLSERVER in dieser Hinsicht eine sehr gute Arbeit leisten

mit: Filtergruppierung

nach s_id gruppiert die Daten in der Fruchttabelle und zeigt die Gruppierungsinformationen für Fruchtarten größer als 1 an

SELECT s_id ,GROUP_CONCAT(f_name) AS NAMES FROM fruits GROUP BY s_id HAVING COUNT(f_name)>1

Verwendung mit Rollup in Gruppe nach

SELECT s_id ,COUNT(1) AS total FROM fruits GROUP BY s_id WITH ROLLUP

Letzte Zeile hinzugefügt, 7 stellt die Summe aller Werte in der Gesamtspalte dar

Hinweis: Bei Verwendung von ROLLUP können Sie nicht gleichzeitig ORDER BY verwenden. Klausel zum Sortieren der Ergebnisse, dh ROLLUP und ORDER BY schließen sich gegenseitig aus!


Limit begrenzt die Anzahl der Abfrageergebnisse

wird in SQLSERVER verwendet Schlüsselwort TOP, während in MYSQL das Schlüsselwort LIMIT verwendet wird

LIMIT[位置偏移量],行数

Der erste Parameter „Positionsoffset“ gibt an, ab welcher Zeile MYSQL beginnt. Die Anzeige ist ein optionaler Parameter . Wenn Sie den „Positionsoffset“

nicht angeben, beginnt er beim ersten Datensatz in der Tabelle (der Positionsoffset des ersten Datensatzes ist 0 und der Positionsoffset des nächsten Tages ist 1). .und so weiter)

Der zweite Parameter „Anzahl der Zeilen“ gibt die Anzahl der zurückgegebenen Datensätze an

SELECT * FROM fruits

SELECT * FROM fruits LIMIT 4,3

Das obige Ergebnis gibt 3 Datensätze ab der 5. Datensatzzeile zurück (da die Zählung bei 0 beginnt)

Hinweis: In MYSQL5 können Sie LIMIT 4 OFFSET verwenden 3 in 6, was bedeutet, 3 Datensätze ab der 5. Zeile zu erhalten, und LIMIT4 ,3 geben die zurück gleiches Ergebnis


Unterabfrage

Unterabfrage Diese Funktion wurde ab MYSQL4 eingeführt. 1.

Testdaten einfügen

CREATE TABLE tbl1(num1 INT NOT NULL);
CREATE TABLE tbl2(num2 INT NOT NULL)

INSERT INTO tbl1 VALUES(1),(4),(13),(27);
INSERT INTO tbl2 VALUES(6),(14),(11),(20)

Auf das Schlüsselwort ANY folgt ein Vergleichsoperator, der angibt, dass es TRUE ist, wenn es beim Vergleich mit einem beliebigen von der Unterabfrage zurückgegebenen Wert TRUE ist

返回tbl2表的所有num2列,然后将tbl1中的num1的值与之进行比较,只要大于num2的任何一个值,即为符合查询条件的结果

SELECT num1 FROM tbl1 WHERE num1>ANY(SELECT num2 FROM tbl2)


ALL关键字接在一个比较操作符的后面,表示与子查询返回的所有值比较为TRUE,则返回TRUE

SELECT num1 FROM tbl1 WHERE num1>ALL(SELECT num2 FROM tbl2)


合并查询

使用UNION关键字,合并结果时,两个查询对应的列数和数据类型必须相同。

各个SELECT语句之间使用UNION或UNION ALL关键字分隔

UNION:执行的时候删除重复的记录,所有返回的行都是唯一的

UNION ALL:不删除重复行也不对结果进行自动排序

SELECT s_id,f_name,f_price    
FROM fruits
WHERE f_price<9.0
UNION 
SELECT s_id,f_name,f_price
FROM fruits
WHERE s_id IN (101,103)


第一个查询把f_price小于9.0的记录查询出来,第二个查询把s_id为101和103的记录查询处理

因为f_price小于9.0的记录里有些记录的s_id是102、105、106,这些结果不会被去掉会跟第二个查询进行合并

所以最终的结果会有s_id为102、105、106的记录


正则表达式查询

正则表达式在SQLSERVER里面是没有的,但是在MYSQL里不单只有,而且功能也比较丰富

MYSQL中使用REGEXP关键字指定正则表达式的字符匹配模式

1、查询以特定字符或字符串开头的记录

字符“^”匹配以特定字符或者字符串开头的文本

SELECT * FROM fruits WHERE f_name REGEXP &#39;^b&#39;

返回f_name字段以b开头的记录

2、查询以特定字符或字符串结尾的记录

字符“$”匹配以特定字符或者字符串结尾的文本

SELECT * FROM fruits WHERE f_name REGEXP &#39;y$&#39;

返回f_name字段以y结尾的记录

3、用符号“.”来代替字符串中的任意一个字符

字符“.”匹配任意一个字符

SELECT * FROM fruits WHERE f_name REGEXP &#39;a.g&#39;

a和g两个字母之间包含单个字符,orange符合要求

4、使用“*”和“+”来匹配多个字符

星号“*”匹配前面的字符任意多次,包括0次。加号“+”匹配前面的字符至少一次

SELECT * FROM fruits WHERE f_name REGEXP &#39;^ba*&#39;

blackberry和banana符合要求,b开头,a匹配任意多次,不管出现的顺序在哪里

SELECT * FROM fruits WHERE f_name REGEXP &#39;^ba+&#39;

 “a+”匹配字母“a”至少一次,只有banana满足匹配条件

5、匹配指定字符串

正则表达式可以匹配指定字符串,只要这个字符串在查询文本中即可,如要匹配多个字符串,多个字符串之间使用分隔符“|”隔开

SELECT * FROM fruits WHERE f_name REGEXP &#39;on|ap&#39;

可以看到apple 、melon 、coconut 3个值中都包含有字符串“on”和“ap”,满足匹配条件

6、匹配指定字符中的任意一个

方括号“[]”指定一个字符集合,只匹配其中任何一个字符,即为所查找的文本

SELECT * FROM fruits WHERE f_name REGEXP &#39;[ot]&#39;

方括号[]还可以指定数值集合

SELECT * FROM fruits WHERE s_id REGEXP &#39;[456]&#39;

s_id字段值中有3个数字中的1个即为匹配记录字段

[456]也可以写成[4-6]即指定集合区间

7、匹配指定字符以外的字符

“[^字符集合]”匹配不在指定集合中的任何字符


SELECT * FROM fruits WHERE f_id REGEXP &#39;[^a-e1-2]&#39;


 

返回开头不在a-e  1-2字母的记录,例如a1,b1这些记录就不符合要求

8、使用{n,} 或者{n,m}来指定字符串连续出现的次数

“字符串{n,}”,表示至少匹配n次前面的字符;“字符串{n,m}”表示匹配前面的字符串不少于n次,

不多于m次。

 SELECT * FROM fruits WHERE f_name REGEXP &#39;b{1,}&#39;


至少匹配1次字母b,blackberry和banana都符合要求

 SELECT * FROM fruits WHERE f_name REGEXP &#39;ba{1,3}&#39;

“ba”字符串最少出现一次,最多三次,banana这个字符串符合要求

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der MySQL-Optimierung von Abfrageanweisungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn