با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن ، و کاربرانی که دوره آموزش SQLite را دنبال می کنند. Subquery یا query داخلی و یا query تودرتو در واقع یک query است که در داخل سایر query های SQLite با استفاده از ساختار شرطی WHERE جاسازی شده است. یک Subquery در SQLite برای بازگشت داده هایی استفاده می شود که در پرس و جوی اصلی به عنوان یک شرط برای محدود کردن بیشتر داده های بازیابی شده، استفاده می شود. یک Subquery در SQLite می تواند با دستورات SELECT, INSERT, UPDATE و DELETE با عملگرهایی نظیر =, <, >, >=, <=, IN, BETWEEN و … استفاده شوند. برای آشنایی بیشتر با Subquery در SQLite در ادامه ی این بخش با ما همراه باشید.
در ادامه شما را با سینتکس و نمونه مثال هایی از Subquery در دستورات مختلف SQL آشنا خواهیم کرد.
قوانین Subquery در SQLite به صورت زیر خواهد بود :
Subqueries باید در داخل پرانتز قرار گیرد.
Subquery می تواند تنها یک ستون در عبارت SELECT داشته باشد.
ORDER BY نمی تواند درSubquery ، مورد استفاده قرار گیرد، اگر چه پرس و جو اصلی می تواند از ORDER BY استفاده کند.
Subquery هایی که بیش از یک رکورد را می دهند تنها می توانند با عملگرهای چند مقداری، مانند اپراتور IN استفاده شوند.
عملگر BETWEEN با یک Subquery کار نمی کند، با این حال، BETWEEN می تواند در Subquery استفاده شود.
Subquery ها اغلب با دستور SELECT استفاده می شوند، که سینتکس آن به صورت زیر است:
1 2 3 4 5 6 | SELECT column_name [, column_name ] FROM table1 [, table2 ] WHERE column_name OPERATOR (SELECT column_name [, column_name ] FROM table1 [, table2 ] [WHERE]) |
مثال
جدول COMPANY را با رکوردهای زیر در نظر بگیرید:
1 2 3 4 5 6 7 8 9 | ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0 |
سپس Subquery زیر را با دستور SELECT بررسی کنید :
1 2 3 4 5 | sqlite> SELECT * FROM COMPANY WHERE ID IN (SELECT ID FROM COMPANY WHERE SALARY > 45000) ; |
نتیجه ی کد فوق به صورت زیر است :
1 2 3 4 | ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 |
subquery ها را همچنین می توان با دستور INSERT استفاده نمود.
دستور INSERT داده های بازگشتی از یک subquery را در سایر جداول درج می کند.
داده ی انتخاب شده در subquery را می توان با هر یک از توابع کاراکتر ، تاریخ و عدد تغییر داد.
سینتکس اصلی آن به صورت زیر است :
1 2 3 4 | INSERT INTO table_name [ (column1 [, column2 ]) ] SELECT [ *|column1 [, column2 ] FROM table1 [, table2 ] [ WHERE VALUE OPERATOR ] |
مثال
جدول COMPANY_BKP را مشابه ساختار جدول COMPANY در نظر بگیرید که با استفاده از دستور CREATE TABLE با نام COMPANY_BKP ساخته شده است.
حالا برای کپی تمام داده های COMPANY به COMPANY_BKP از سینتکس زیر استفاده می کنیم :
1 2 3 4 | sqlite> INSERT INTO COMPANY_BKP SELECT * FROM COMPANY WHERE ID IN (SELECT ID FROM COMPANY) ; |
یک subquery را می توان با دستور UPDATE در یک پیوستگی استفاده کرد.
هر یک از تک ستون ها و یا ستون های چندگانه در یک جدول می توانند هنگام استفاده از subquery با دستور UPDATE به روز شوند.
سینتکس اصلی این اقدامات به صورت زیر است :
1 2 3 4 5 6 | UPDATE table SET column_name = new_value [ WHERE OPERATOR [ VALUE ] (SELECT COLUMN_NAME FROM TABLE_NAME) [ WHERE) ] |
مثال
فرض می کنیم که ما جدول COMPANY_BKP را به عنوان یک backup از جدول COMPANY در اختیار داریم.
در مثال زیر فیلد SALARY در جدول COMPANY با زمان ۰٫۵۰ در تمام رکوردهایی که AGE آن بزرگتر مساوی ۲۷ باشد، آپدیت می شود:
1 2 3 4 | sqlite> UPDATE COMPANY SET SALARY = SALARY * 0.50 WHERE AGE IN (SELECT AGE FROM COMPANY_BKP WHERE AGE >= 27 ); |
query فوق روی دو رکورد تاثیر گذاشته و در نهایت نتیجه ی زیر را خواهد داشت :
1 2 3 4 5 6 7 8 9 | ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 10000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 42500.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0 |
Subquery را می توان در یک پیوستگی با استفاده از دستور DELETE استفاده کرد، که سینتکس آن به صورت زیر است:
1 2 3 4 5 | DELETE FROM TABLE_NAME [ WHERE OPERATOR [ VALUE ] (SELECT COLUMN_NAME FROM TABLE_NAME) [ WHERE) ] |
مثال
فرض می کنیم که ما جدول COMPANY_BKP را به عنوان یک backup از جدول COMPANY در اختیار داریم.
در مثال زیر فیلد SALARY در جدول COMPANY با زمان ۰٫۵۰ در تمام رکوردهایی که AGE آن بزرگتر مساوی ۲۷ باشد، حذف می شود:
1 2 3 | sqlite> DELETE FROM COMPANY WHERE AGE IN (SELECT AGE FROM COMPANY_BKP WHERE AGE > 27 ); |
query فوق روی دو رکورد تاثیر گذاشته و در نهایت نتیجه ی زیر را خواهد داشت :
1 2 3 4 5 6 7 8 | ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 42500.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0 |
Subquery در SQLite در واقع یک query است که در داخل سایر query های SQLite با استفاده از ساختار شرطی WHERE و عملگرهایی نظیر IN جاسازی شده است. Subquery برای استخراج داده و تغییرات روی دو جدول مشابه بسیار مناسب است.