Heim  >  Artikel  >  Datenbank  >  Was ist eine MySQL-Unterabfrageanweisung?

Was ist eine MySQL-Unterabfrageanweisung?

藏色散人
藏色散人Original
2021-12-02 11:11:293132Durchsuche

MySQL-Unterabfrageanweisung bezieht sich auf die SELECT-Klausel in einer anderen Abfrageanweisung, zum Beispiel „SELECT * FROM t1 WHERE Column1 = (SELECT Column1 FROM t2);“.

Was ist eine MySQL-Unterabfrageanweisung?

Die Betriebsumgebung dieses Artikels: Windows 7-System, MySQL-Version 5.7, Dell G3-Computer.

Was ist eine MySQL-Unterabfrageanweisung?

MySQL-Unterabfrageanweisung:

1. Unterabfrage bezieht sich auf die SELECT-Klausel in einer anderen Abfrageanweisung.

Beispiel:

  SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

Darunter wird SELECT * FROM t1 ... als äußere Abfrage (oder äußere Anweisung) bezeichnet,

SELECT Column1 FROM t2 wird als Unterabfrage bezeichnet.

Wir sagen also, dass die Unterabfrage in der äußeren Abfrage verschachtelt ist. Tatsächlich ist es möglich, Unterabfragen innerhalb von Unterabfragen zu verschachteln.

Unterabfragen müssen in Klammern stehen.

Unterabfrage auf Zeilenebene

  SELECT * FROM t1 WHERE (col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
  SELECT * FROM t1 WHERE ROW(col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);

Das Rückgabeergebnis einer Unterabfrage auf Zeilenebene ist höchstens eine Zeile.

Unterabfrage optimieren

– Datentabelle erstellen

CREATE TABLE IF NOT EXISTS tdb_goods(
    goods_id    SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    goods_name  VARCHAR(150) NOT NULL,
    goods_cate  VARCHAR(40)  NOT NULL,
    brand_name  VARCHAR(40)  NOT NULL,
    goods_price DECIMAL(15,3) UNSIGNED NOT NULL DEFAULT 0,
    is_show     BOOLEAN NOT NULL DEFAULT 1,
    is_saleoff  BOOLEAN NOT NULL DEFAULT 0
  );

– Datensätze schreiben

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('R510VC 15.6英寸笔记本','笔记本','华硕','3399',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Y400N 14.0英寸笔记本电脑','笔记本','联想','4899',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('G150TH 15.6英寸游戏本','游戏本','雷神','8499',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X550CC 15.6英寸笔记本','笔记本','华硕','2799',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X240(20ALA0EYCD) 12.5英寸超极本','超级本','联想','4999',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('U330P 13.3英寸超极本','超级本','联想','4299',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('SVP13226SCB 13.3英寸触控超极本','超级本','索尼','7999',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iPad mini MD531CH/A 7.9英寸平板电脑','平板电脑','苹果','1998',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iPad Air MD788CH/A 9.7英寸平板电脑 (16G WiFi版)','平板电脑','苹果','3388',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' iPad mini ME279CH/A 配备 Retina 显示屏 7.9英寸平板电脑 (16G WiFi版)','平板电脑','苹果','2788',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('IdeaCentre C340 20英寸一体电脑 ','台式机','联想','3499',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Vostro 3800-R1206 台式电脑','台式机','戴尔','2899',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iMac ME086CH/A 21.5英寸一体电脑','台式机','苹果','9188',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('AT7-7414LP 台式电脑 (i5-3450四核 4G 500G 2G独显 DVD 键鼠 Linux )','台式机','宏碁','3699',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Z220SFF F4F06PA工作站','服务器/工作站','惠普','4288',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('PowerEdge T110 II服务器','服务器/工作站','戴尔','5388',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Mac Pro MD878CH/A 专业级台式电脑','服务器/工作站','苹果','28888',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' HMZ-T3W 头戴显示设备','笔记本配件','索尼','6999',DEFAULT,DEFAULT);
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('商务双肩背包','笔记本配件','索尼','99',DEFAULT,DEFAULT);
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X3250 M4机架式服务器 2583i14','服务器/工作站','IBM','6888',DEFAULT,DEFAULT);
 
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('玄龙精英版 笔记本散热器','笔记本配件','九州风神','',DEFAULT,DEFAULT);
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' HMZ-T3W 头戴显示设备','笔记本配件','索尼','6999',DEFAULT,DEFAULT);
 INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('商务双肩背包','笔记本配件','索尼','99',DEFAULT,DEFAULT);

– Den Durchschnittspreis aller Computerprodukte ermitteln und zwei Dezimalstellen beibehalten, AVG, MAX, MIN, COUNT und SUM sind Aggregate Funktion

SELECT ROUND(AVG(goods_price),2) AS avg_price FROM tdb_goods;

-- Alle Produkte abfragen, deren Preis über dem Durchschnittspreis liegt, und nach Preis in absteigender Reihenfolge sortieren

SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price > 5845.10 ORDER BY goods_price DESC;

-- Unterabfrage zur Implementierung verwenden

SELECT goods_id,goods_name,goods_price FROM tdb_goods 
  WHERE goods_price > (SELECT ROUND(AVG(goods_price),2) AS avg_price FROM tdb_goods) 
  ORDER BY goods_price DESC;

-- Den Preis von Produkten vom Typ „Super“ abfragen Notebook"

SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本';

-- Fragen Sie Produkte ab, deren Preis größer oder gleich dem Preis von „Ultrabook" ist, und sortieren Sie sie in absteigender Reihenfolge nach Preis

SELECT goods_id,goods_name,goods_price FROM tdb_goods 
   WHERE goods_price = ANY(SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本')
   ORDER BY goods_price DESC;

-- = ANY oder = SOME Equivalent to IN

SELECT goods_id,goods_name,goods_price FROM tdb_goods 
   WHERE goods_price IN (SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本')
   ORDER BY goods_price DESC;

-- Erstellen Sie eine „Produktklassifizierungstabelle“

CREATE TABLE IF NOT EXISTS tdb_goods_cates(
    cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    
    cate_name VARCHAR(40)
  );

--Fragen Sie alle Datensätze der Tabelle tdb_goods ab und gruppieren Sie sie nach „Kategorie“

  SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;

--Schreiben Sie die Gruppierungsergebnisse in die Datentabelle tdb_goods_cates

 INSERT tdb_goods_cates (cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;

- -Aktualisieren Sie die tdb_goods-Tabelle über die tdb_goods_cates-Datentabelle

UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate = cate_name 
  SET goods_cate = cate_id ;

-- Erstellen Sie eine Datentabelle über CREATE...SELECT und schreiben Sie gleichzeitig Datensätze

-- SELECT brand_name FROM tdb_goods GROUP BY brand_name;
  CREATE TABLE tdb_goods_brands (
    brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    brand_name VARCHAR(40) NOT NULL
  ) SELECT brand_name FROM tdb_goods GROUP BY brand_name;

-- Aktualisieren Sie die tdb_goods-Datentabelle über die tdb_goods_brands-Datentabelle ( Fehler)

UPDATE tdb_goods  INNER JOIN tdb_goods_brands ON brand_name = brand_name
  SET brand_name = brand_id;
  -- Column 'brand_name' in field list is ambigous

-- Korrigieren

  UPDATE tdb_goods AS  g  INNER JOIN tdb_goods_brands AS b ON g.brand_name = b.brand_name
  SET g.brand_name = b.brand_id;

-- Sehen Sie sich die Struktur der tdb_goods-Datentabelle an

DESC tdb_goods;

-- Ändern Sie die Datentabellenstruktur mit der ALTER TABLE-Anweisung

ALTER TABLE tdb_goods  
  CHANGE goods_cate cate_id SMALLINT UNSIGNED NOT NULL,
  CHANGE brand_name brand_id SMALLINT UNSIGNED NOT NULL;
  
-- 分别在tdb_goods_cates和tdb_goods_brands表插入记录
   INSERT tdb_goods_cates(cate_name) VALUES('路由器'),('交换机'),('网卡');
   INSERT tdb_goods_brands(brand_name) VALUES('海尔'),('清华同方'),('神舟');

-- Schreiben Sie einen beliebigen Datensatz in die tdb_goods-Datentabelle

INSERT tdb_goods(goods_name,cate_id,brand_id,goods_price) VALUES(' LaserJet Pro P1606dn 黑白激光打印机','12','4','1849');

- - Fragen Sie die detaillierten Informationen aller Produkte ab (implementiert durch Inner Join)

 SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g
   INNER JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id
   INNER JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id\G;

- - Fragen Sie die detaillierten Informationen aller Produkte ab (implementiert durch Left Outer Join)

   SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g
   LEFT JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id
   LEFT JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id\G;

-- Fragen Sie die detaillierten Informationen aller Produkte ab (implementiert durch Right Outer). beitreten)

SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g
   RIGHT JOIN tdb_goods_cates AS c ON g.cate_id = c.cate_id
   RIGHT JOIN tdb_goods_brands AS b ON g.brand_id = b.brand_id\G;

-- Unbegrenztes Design von Kategoriedatentabellen

CREATE TABLE tdb_goods_types(
     type_id   SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
     type_name VARCHAR(20) NOT NULL,
     parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0
  ); 
  INSERT tdb_goods_types(type_name,parent_id) VALUES('家用电器',DEFAULT);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑、办公',DEFAULT);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('大家电',1);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('生活电器',1);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('平板电视',3);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('空调',3);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('电风扇',4);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('饮水机',4);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑整机',2);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑配件',2);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('笔记本',9);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('超级本',9);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('游戏本',9);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('CPU',10);
  INSERT tdb_goods_types(type_name,parent_id) VALUES('主机',10);

-- Alle Kategorien und ihre übergeordneten Kategorien finden

  SELECT s.type_id,s.type_name,p.type_name FROM tdb_goods_types AS s LEFT JOIN tdb_goods_types AS  p ON s.parent_id = p.type_id;

-- Alle Kategorien und ihre Unterkategorien finden

  SELECT p.type_id,p.type_name,s.type_name FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS  s ON s.parent_id = p.type_id;

-- Die Anzahl aller Kategorien finden und ihre Unterkategorien

SELECT p.type_id,p.type_name,count(s.type_name) AS children_count FROM tdb_goods_types AS p LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id GROUP BY p.type_name ORDER BY p.type_id;

-- Füge das Feld „child_count“ zu tdb_goods_types hinzu

ALTER TABLE tdb_goods_types ADD child_count MEDIUMINT UNSIGNED NOT NULL DEFAULT 0;

-- Ändere dich gerade. Die Anzahl der abgefragten Unterkategorien wird in der Datentabelle tdb_goods_types aktualisiert

UPDATE tdb_goods_types AS t1 INNER JOIN ( SELECT p.type_id,p.type_name,count(s.type_name) AS children_count FROM tdb_goods_types AS p 
                                            LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id 
                             
                                            GROUP BY p.type_name 
                                            ORDER BY p.type_id ) AS t2 
  ON  t1.type_id = t2.type_id 
  SET t1.child_count = t2.children_count;

-- Kopiere zwei Datensätze mit den Nummern 12 und 20

SELECT * FROM tdb_goods WHERE goods_id IN (19,20);

-- EINFÜGEN ... AUSWÄHLEN, um die Replikation zu implementieren

INSERT tdb_goods(goods_name,cate_id,brand_id) SELECT goods_name,cate_id,brand_id FROM tdb_goods WHERE goods_id IN (19,20);

-- Doppelte Datensätze finden

SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2;

- - Doppelte Datensätze löschen

  DELETE t1 FROM tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2 ) AS t2  ON t1.goods_name = t2.goods_name  WHERE t1.goods_id > t2.goods_id;

[Verwandte Empfehlungen: MySQL-Video-Tutorial]

Das obige ist der detaillierte Inhalt vonWas ist eine MySQL-Unterabfrageanweisung?. 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