>  기사  >  데이터 베이스  >  mysql 하위 쿼리 문이란 무엇입니까?

mysql 하위 쿼리 문이란 무엇입니까?

藏色散人
藏色散人원래의
2021-12-02 11:11:293135검색

MySQL 하위 쿼리 문은 다른 쿼리 문의 SELECT 절을 참조합니다(예: "SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);").

mysql 하위 쿼리 문이란 무엇입니까?

이 기사의 운영 환경: Windows 7 시스템, mysql 버전 5.7, Dell G3 컴퓨터.

mysql 하위 쿼리 문이란 무엇입니까?

mysql 하위 쿼리 문:

1. 하위 쿼리는 다른 쿼리 문의 SELECT 절을 참조합니다.

예:

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

그 중 SELECT * FROM t1 ...을 Outer Query(또는 Outer 문)이라고 하고,

SELECT column1 FROM t2를 Sub Query라고 합니다.

그래서 하위 쿼리가 외부 쿼리 안에 중첩되어 있다고 말합니다. 실제로 하위 쿼리 내에 하위 쿼리를 중첩하는 것이 가능합니다.

하위 쿼리는 괄호 안에 표시되어야 합니다.

행 수준 하위 쿼리

  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);

행 수준 하위 쿼리의 반환 결과는 최대 1개 행입니다.

하위 쿼리 최적화

-- 데이터 테이블 만들기

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
  );

-- 레코드 쓰기

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);

-- 모든 컴퓨터 제품의 평균 가격을 구하고 소수점 이하 두 자리를 유지합니다. AVG, MAX, MIN, COUNT 및 SUM은 집계입니다. 함수

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

-- 가격이 평균 가격보다 큰 모든 제품을 쿼리하고 가격 기준 내림차순으로 정렬합니다.

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

-- 하위 쿼리를 사용하여 구현

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;

-- " 유형의 제품 가격 쿼리 슈퍼노트북"

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

-- 가격이 "울트라북" 가격보다 크거나 같은 제품을 쿼리하고 가격별로 내림차순으로 정렬합니다

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 또는 = SOME Equivalent 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;

-- "제품 분류" "Table

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

생성--tdb_goods 테이블의 모든 레코드를 쿼리하고 "category"별로 그룹화

  SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;

--그룹화 결과를 tdb_goods_cates 데이터 테이블

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

에 기록 --tdb_goods_cates 데이터 테이블을 통해 tdb_goods 테이블 업데이트

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

-- CREATE...SELECT를 통해 데이터 테이블 생성과 동시에 레코드 쓰기

-- 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;

-- tdb_goods_brands 데이터 테이블을 통해 tdb_goods 데이터 테이블 업데이트 (오류)

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

-- 수정

  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;

-- tdb_goods 데이터 테이블 구조 보기

DESC tdb_goods;

-- ALTER TABLE 문을 통해 데이터 테이블 구조 수정

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('海尔'),('清华同方'),('神舟');

-- tdb_goods 데이터 테이블에 레코드 쓰기

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

-- 전체 상품 상세 정보 조회(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;

- - 전체 상품 상세 정보 조회(왼쪽 외부 조인으로 구현)

   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;

-- 전체 상품 상세 정보 조회(오른쪽 조인으로 구현) 외부 조인)

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;

-- 무제한 카테고리 데이터 테이블 디자인

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);

-- 모든 카테고리 및 해당 상위 카테고리 찾기

  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;

-- 모든 카테고리 및 해당 하위 카테고리 찾기

  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;

-- 모든 카테고리 수 찾기 카테고리 및 해당 하위 카테고리

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;

-- tdb_goods_types

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

에 child_count 필드 추가

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;

-- INSERT ... 복제 구현을 선택

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

-- 중복 레코드 찾기

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);

- - 중복 레코드 삭제

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

[관련 권장 사항:

mysql 비디오 튜토리얼

]

위 내용은 mysql 하위 쿼리 문이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.