Loading...

UNION

UNION оператору бир типтеги эки үлгүнү бириктирүүгө мүмкүндүк берет. Бул тандоолор ар кандай таблицалардан же бир эле таблицадан болушу мүмкүн. формалдуу союз синтаксиси болуп саналат:

@A@
SELECT_выражение1
UNION [ALL] SELECT_выражение2
[UNION [ALL] SELECT_выражениеN]
@A@

Мисалы, маалымат базасында банк кардарлары үчүн (Кардар таблицасы) жана банк кызматкерлери үчүн (Кызматкерлер таблицасы) эки өзүнчө таблица бар дейли:

@A@
CREATE TABLE Customers
(
    Id INT AUTO_INCREMENT PRIMARY KEY,
    FirstName VARCHAR(20) NOT NULL,
    LastName VARCHAR(20) NOT NULL,
    AccountSum DECIMAL
);
CREATE TABLE Employees
(
    Id INT AUTO_INCREMENT PRIMARY KEY,
    FirstName VARCHAR(20) NOT NULL,
    LastName VARCHAR(20) NOT NULL
);
  
INSERT INTO Customers(FirstName, LastName, AccountSum)
VALUES
('Tom', 'Smith', 2000),
('Sam', 'Brown', 3000),
('Mark', 'Adams', 2500),
('Paul', 'Ins', 4200),
('John', 'Smith', 2800),
('Tim', 'Cook', 2800);
  
INSERT INTO Employees(FirstName, LastName)
VALUES
('Homer', 'Simpson'),
('Tom', 'Smith'),
('Mark', 'Adams'),
('Nick', 'Svensson');
@A@

Бул жерде биз эки таблица тең ар кандай маалыматтарга ээ болгонуна карабастан, эки жалпы атрибуттар менен мүнөздөлүшү мүмкүн экенин байкай алабыз - аты (Аты) жана фамилиясы (FastName). Келгиле, банктын бардык кардарларын жана анын кызматкерлерин бир эле учурда эки таблицадан тандап алалы:

@A@
SELECT FirstName, LastName
FROM Customers
UNION SELECT FirstName, LastName FROM Employees;
@A@

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

MySQLдеги UNION

Мында бириккен үлгүдөгү мамычалардын аталыштары биринчи үлгүдөгү мамычалардын аталыштары менен дал келет. Эгерде биз да сорттогубуз келсе, анда ТАРТИП БЕРҮҮ сөз айкашында биринчи тандоонун мамычаларынын атына өзгөчө көңүл бурушубуз керек:

@A@
SELECT FirstName AS FName, LastName
FROM Customers
UNION SELECT FirstName, LastName
FROM Employees
ORDER BY FName DESC;
@A@

Бул учурда, ар бир үлгүдө биринчи үлгүдөгү FName тилкеси бар. Бирок, сорттоо экинчи тандоодогу FirstName тилкесинин маанисин да эске алат:

MySQLде UNION ичинде сорттоо

Эгер бир тандоо экинчисине караганда көбүрөөк тилкеге ​​ээ болсо, анда аларды бириктирүүгө болбойт. Мисалы, төмөнкү учурда бириктирүү ишке ашпай калат:

 

Эгерде бириктирилип жаткан эки топтом тең бирдей сап маанилерин камтыса, анда кайталанган саптар бириктирүү учурунда алынып салынат. Мисалы, Кардарлар жана Кызматкерлер таблицаларында банк кызматкерлери эки тең кардар болушу мүмкүн жана эки таблицада тең көрүнүшү мүмкүн. Жогорудагы мисалдарды бириктиргенде, кайталанган саптар алынып салынды. Эгер сиз биригүүдө бардыгын, анын ичинде кайталанган саптарды сактоо керек болсо, анда ALL операторун колдонушуңуз керек :

@A@
SELECT FirstName, LastName
FROM Customers
UNION ALL SELECT FirstName, LastName
FROM Employees
ORDER BY FirstName;
@A@

MySQLде кайталанма саптарды бириктирүү

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

@A@
SELECT FirstName, LastName, AccountSum + AccountSum * 0.1 AS TotalSum
FROM Customers WHERE AccountSum < 3000
UNION SELECT FirstName, LastName, AccountSum + AccountSum * 0.3 AS TotalSum
FROM Customers WHERE AccountSum >= 3000;
@A@

Бул учурда, эгерде сумма 3000ден аз болсо, анда эсептеги сумманын 10% өлчөмүндө пайыздар эсептелет. Эгер эсеп 3000ден ашык болсо, анда пайыздар 30% га чейин көбөйөт.

MySQLде бир эле таблицадан тандоолорду бириктирүү