Loading...

Сунуштар

Сунуштар башка SQL сурамдарына камтылган SELECT билдирүүлөрүн билдирет. Келгиле, ички сурамдарды колдонуунун жөнөкөй мисалын карап көрөлү.

Мисалы, өнүмдөр жана заказдар үчүн таблицаларды түзөлү:

@A@

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">ТАБЛИЦА өнүмдөрүн түзүү</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
(</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    Id INT AUTO_INCREMENT БИРИНЧИ АЧКЫЧЫ,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    ПродуктАты VARCHAR(30) NULL ЭМЕС,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    Өндүрүүчү VARCHAR(20) NO NULL,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    ProductCount INT DEFAULT 0,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    Баасы DECIMAL NO NULL</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
ТАБЛИЦА ЗАКАЗДАРЫН ТҮЗҮҮ</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
(</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    Id INT AUTO_INCREMENT БИРИНЧИ АЧКЫЧЫ,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    ProductId INT NULL ЭМЕС,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    ПродуктСаны INT DEFAULT 1,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    Түзүлгөн DATE NULL ЭМЕС,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    Баасы DECIMAL NULL ЭМЕС,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    ТЫШКЫ АЧКЫЧ (ПродуктИд) РЕФЕРЕНЦИЯЛАР КАСКАДЫ ЖОК КЫЛУУДА Товарлар(Id)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
);</font></font><font></font>

@A@

Буйрутмалар таблицасында Продукт таблицасында сатылып алынган өнүмдөр жөнүндө маалыматтар камтылган.

Келгиле, таблицаларга кээ бир маалыматтарды кошолу:

@A@

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">INSERT INTO Продукттарга (Өнүмдүн аталышы, Өндүрүүчү, ПродуктСаны, Баасы)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
VALUES('iPhone X', 'Apple', 2, 76000),</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
('iPhone 8', 'Apple', 2, 51000),</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
('iPhone 7', 'Apple', 5, 42000),</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
('Galaxy S9', 'Samsung', 2, 56000),</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
('Galaxy S8', 'Samsung', 1, 46000),</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
('Honor 10', 'Huawei', 2, 26000),</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
('Nokia 8', 'HMD Global', 6, 38000);</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
Заказдарга INSERT INTO (ProductId, CreatedAt, ProductCount, Price)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
БААЛУУЛАР</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
(</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    (ProductName='Galaxy S8' WHERE Продукттарынан ID ТАҢДАҢЫЗ),</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    '21-05-2018',</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    2,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    (Продукциянын баасын ТАҢДАҢЫЗ, WHERE ProductName='Galaxy S8')</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
),</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
(</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    (ProductName='iPhone X' ЖЕРДЕГИ Өнүмдөрдөн ID ТАҢДАҢЫЗ),</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    '23-05-2018',  </font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    1,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    (ProductName='iPhone X' ЖЕРДЕГИ Товарлардан бааны ТАНДАЙТ)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
),</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
(</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    (ProductName='iPhone 8' ЖЕРДЕГИ Өнүмдөрдүн идентификаторун тандаңыз),</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    '21-05-2018',  </font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    1,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    (ProductName='iPhone 8' КАЙДАГЫ Продукциялардан бааны ТАНДАЙТ)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
);</font></font><font></font>

@A@

Заказдар таблицасына маалыматтарды кошууда подсуроолор колдонулат. Мисалы, биринчи заказ Galaxy S8 продуктусуна жасалган. Демек, буйрутма тууралуу маалыматты Заказдар таблицасында сакташыбыз керек, мында ProductId талаасы Galaxy S8 продуктунун идентификаторун, ал эми Баа талаасы анын баасын көрсөтөт. Бирок суроо-талапты жазып жаткан учурда биз Сатып алуучунун идентификаторун, Продукттун ID'син же буюмдун баасын билбей калышыбыз мүмкүн. Бул учурда, сиз формадагы подсуроону аткара аласыз

@A@

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">(ProductName='iPhone 8' КАЙДАГЫ Продукциялардан бааны ТАНДАЙТ)
</font></font>

@A@

Чакан сурам SELECT операторун аткарат жана кашаага алынат. Бул учурда, бир продуктту кошууда, эки кошумча суроо аткарылат. Ар бир подсуроо сандык идентификатор сыяктуу бир скалярдык маанини кайтарат.

Жогорудагы мисалда, подсуроолор башка таблицада аткарылган, бирок алар негизги сурам чакырылган ошол эле таблицада да аткарылышы мүмкүн. Мисалы, Товарлар таблицасынан минималдуу баасы бар өнүмдөрдү табалы:

@A@

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">ТАНДОО * Товарлардан</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
WHERE Баасы = (Продукциялардан MIN(Баа) ТАНДОО);</font></font><font></font>

@A@

Же баасы орточо жогору болгон товарларды табабыз:

@A@

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">ТАНДОО * Товарлардан</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
WHERE Баасы > (Продукциялардан AVG(Бааны) ТАНДОО);</font></font><font></font>@A@

MySQLдеги подсуроолор

Корреляцияланган жана корреляцияланбаган подсуроолор

Сунуштар корреляцияланган же корреляциясыз болушу мүмкүн. Жогорудагы мисалдарда, SELECT буйруктары иш жүзүндө команда тарабынан алынган бардык саптар үчүн бир подсуроону аткарды. Мисалы, подсуроо минималдуу же орточо бааны кайтарат, ал биз негизги суроодо канча катар тандасак да өзгөрбөйт. Башкача айтканда, ички суроонун натыйжасы негизги суроодо тандалган саптардан көз каранды болгон эмес. Жана мындай подсуроо бүт тышкы суроо үчүн бир жолу аткарылат.

Бирок сиз ошондой эле корреляцияланган подсураларды колдоно аласыз , алардын натыйжалары негизги суроодо тандалган саптарга көз каранды.

Мисалы, келгиле, Буйрутмалар таблицасынан бардык буйрутмаларды тандап алалы, аларга буюм жөнүндө маалымат кошулат:

@A@

SELECT  CreatedAt, Price, <font></font>
        (SELECT ProductName FROM Products <font></font>
        WHERE Products.Id = Orders.ProductId) AS Product<font></font>
FROM Orders;<font></font>

@A@

Бул учурда, Буйрутмалар жадыбалындагы ар бир сап үчүн, натыйжасы ProductId тилкесинен көз каранды болгон подсуроо аткарылат. Жана ар бир подсуроо ар кандай маалыматтарды кайтара алат.

MySQLдеги корреляцияланган подсуроо

Корреляциялык подсуроо негизги суроо аткарылган ошол эле таблицада да аткарылышы мүмкүн. Мисалы, Товарлар таблицасынан наркы белгилүү бир өндүрүүчү үчүн товарлардын орточо баасынан жогору болгон товарларды тандап алалы:

@A@

SELECT ProductName,<font></font>
       Manufacturer,<font></font>
       Price, <font></font>
        (SELECT AVG(Price) FROM Products AS SubProds <font></font>
         WHERE SubProds.Manufacturer=Prods.Manufacturer)  AS AvgPrice<font></font>
FROM Products AS Prods<font></font>
WHERE Price > <font></font>
    (SELECT AVG(Price) FROM Products AS SubProds <font></font>
     WHERE SubProds.Manufacturer=Prods.Manufacturer);<font></font>@A@

MySQLдеги корреляциялык подсуроо

Бул жерде аныкталган эки корреляциялык подсуроолор бар. Биринчи кошумча суроо AvgPrice тилкесинин спецификациясын аныктайт. Ал Продукт таблицасынан алынган ар бир сап үчүн аткарылат. Продукт өндүрүүчүсү подсуроого өтөт жана анын негизинде ушул конкреттүү өндүрүүчүнүн продукциясынын орточо баасы тандалат. Жана товардын өндүрүүчүсү ар кандай болушу мүмкүн болгондуктан, ар бир учурда подсуроонун натыйжасы да ар кандай болушу мүмкүн.

Экинчи подсуроо окшош, болгону ал таблицадан алынган Продукттарды чыпкалоо үчүн колдонулат. Ошондой эле ар бир сап үчүн аткарылат.

Өндүрүүчүлөрдү ( ) салыштырганда подсуруда чыпкалоодо эки тараптуулукту болтурбоо үчүн SubProds.Manufacturer=Prods.ManufacturerProds лакап аты сырткы тандоо үчүн, ал эми SubProds лакап аты подсуроолордон тандоо үчүн аныкталган.

Корреляциялоочу подсуроолор тандоонун ар бир жеке саптары үчүн аткарылаарын эске алуу керек, мындай подсуроолордун аткарылышы бүтүндөй суроонун аткарылышын жайлатышы мүмкүн.