SQLite
 sql >> база данни >  >> RDS >> SQLite

SQLite подзаявка

Резюме :в този урок ще научите за подзаявката SQLite, за да конструирате по-четливи и сложни заявки.

Въведение в подзаявката на SQLite

Подзаявката е SELECT изявление, вложено в друго изявление. Вижте следното изявление.

SELECT column_1
FROM table_1
WHERE column_1 = (
   SELECT column_1 
   FROM table_2
);Code language: SQL (Structured Query Language) (sql)

Следната заявка е външната заявка :

SELECT column_1
  FROM table_1
 WHERE colum_1 =Code language: SQL (Structured Query Language) (sql)

И следната заявка е подзаявката .

(SELECT column_1
  FROM table_2)Code language: SQL (Structured Query Language) (sql)

Трябва да използвате двойка скоби, за да затворите подзаявка. Имайте предвид, че можете да вмъкнете подзаявка в друга подзаявка с определена дълбочина.

Обикновено подзаявката връща един ред като атомна стойност, въпреки че може да върне няколко реда за сравняване на стойности с IN оператор.

Можете да използвате подзаявка в SELECT , FROM , WHERE и JOIN клаузи.

Примери за подзаявки за SQLite

Ще използваме tracks и albums таблици от примерната база данни за демонстрацията.

1) SQLite подзаявка в WHERE пример за клауза

Можете да използвате проста подзаявка като условие за търсене. Например следното изявление връща всички песни в албума със заглавие Let There Be Rock

SELECT trackid,
       name,
       albumid
FROM tracks
WHERE albumid = (
   SELECT albumid
   FROM albums
   WHERE title = 'Let There Be Rock'
);Code language: SQL (Structured Query Language) (sql)

Подзаявката връща идентификатора на албума със заглавие 'Let There Be Rock' . Заявката използва оператора за равенство (=), за да сравни albumid върнати от подзаявката с albumid в tracks таблица.

Ако подзаявката върне множество стойности, можете да използвате IN оператор за проверка за съществуването на една стойност спрямо набор от стойности.

Вижте следните employees и customers таблица в примерната база данни:

Например следната заявка връща клиентите, чиито търговски представители са в Канада.

SELECT customerid,
       firstname,
       lastname
  FROM customers
 WHERE supportrepid IN (
           SELECT employeeid
             FROM employees
            WHERE country = 'Canada'
       );
Code language: SQL (Structured Query Language) (sql)

Подзаявката връща списък с идентификатори на служителите, които се намират в Канада. Външната заявка използва IN оператор, за да намерите клиентите, които имат идентификатор на търговския представител в списъка.

2) SQLite подзаявка в FROM пример за клауза

Понякога искате да приложите агрегатни функции към колона няколко пъти. Например, първо искате да сумирате размера на албум и след това да изчислите средния размер на всички албуми. Може да излезете със следната заявка.

SELECT AVG(SUM(bytes) 
FROM tracks
GROUP BY albumid;Code language: SQL (Structured Query Language) (sql)

Тази заявка не е валидна.

За да го коригирате, можете да използвате подзаявка в FROM клауза, както следва:

SELECT
	AVG(album.size)
FROM
	(
		SELECT
			SUM(bytes) SIZE
		FROM
			tracks
		GROUP BY
			albumid
	) AS album;Code language: SQL (Structured Query Language) (sql)
AVG(album.size)
---------------
  338288920.317

В този случай SQLite първо изпълнява подзаявката в FROM клауза и връща набор от резултати. След това SQLite използва този набор от резултати като производна таблица във външната заявка.

SQLite корелирана подзаявка

Всички подзаявки, които сте виждали досега, могат да бъдат изпълнени независимо. С други думи, не зависи от външната заявка.

Корелираната подзаявка е подзаявка, която използва стойностите от външната заявка. За разлика от редовна подзаявка, корелирана подзаявка не може да бъде изпълнена независимо.

Корелираната подзаявка не е ефективна, защото се оценява за всеки ред, обработен от външната заявка.

Следната заявка използва корелирана подзаявка, за да върне албумите, чийто размер е по-малък от 10 MB.

SELECT albumid,
       title
  FROM albums
 WHERE 10000000 > (
                      SELECT sum(bytes) 
                        FROM tracks
                       WHERE tracks.AlbumId = albums.AlbumId
                  )
 ORDER BY title;Code language: SQL (Structured Query Language) (sql)

Как работи заявката.

  • За всеки ред, обработен във външната заявка, корелираната подзаявка изчислява размера на албумите от песните, които принадлежат на текущия албум, като използва SUM функция.
  • Предикатът в WHERE Клаузата филтрира албумите с размер, по-голям или равен на 10MB (10000000 байта).

SQLite корелирана подзаявка в SELECT пример за клауза

Следната заявка използва корелирана подзаявка в SELECT клауза за връщане на броя на песните в албум.

SELECT albumid,
       title,
       (
           SELECT count(trackid) 
             FROM tracks
            WHERE tracks.AlbumId = albums.AlbumId
       )
       tracks_count
  FROM albums
 ORDER BY tracks_count DESC;Code language: SQL (Structured Query Language) (sql)

В този урок ви запознахме с подзаявката и показахме различни начини за използване на подзаявка в заявка за избор на данни от таблици.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Защо получавам java.lang.IllegalArgumentException:стойността на свързване при индекс 1 е нула в този случай?

  2. SQLite Intersect

  3. sqlLiteDatabase.query() за INNER JOIN

  4. Заявка за Android SQLite, където колоната не е нула и не е празна

  5. как да променя цвета на лентата в MPandroidCharts въз основа на някаква индивидуална стойност, съхранявана в sqlite?