Chapter 4

SELECT

Import Data

ပထမဆုံး select အကြောင်း စတင်ဖို့ အတွက် အရင်ဆုံး data တွေ ထည့်သွင်းပါမယ်။ https://bit.ly/sampledbsaturngod (Sample Data) ကို ဦးစွာ download ချပါ။ Unzip ဖြည်ပါ။ mysqlsampledatabase.sql file ရပါလိမ့်မယ်။

Terminal ဖွင့်ပါ။

$ mysql -uroot -p < ~/Download/mysqlsampledatabase.sql

mysqlsampledatabase.sql ကို download folder အောက်မှာ ထည့်ထားသည့် အတွက် အထက်ပါ ပုံစံ အတိုင်း ရေးသားထားပါသည်။ .sql ပတ်လမ်းကြောင်း အပြည့်အစုံ ထည့်ပေးဖို့ လိုပါတယ်။

$ mysql -uroot -p

ဖြင့် mysql ကို ဝင်လိုက်ပါ။

show databases;

ဆိုရင် classicmodels ကို တွေ့ပါမယ်။

use calssicmodels;

ဆိုပြီး database ကို classicmodels select လုပ်လိုက်ပါမယ်။

show tables;

ဆိုရင် tables တွေ အကုန် ပြပါလိမ့်မယ်။

+-------------------------+
| Tables_in_classicmodels |
+-------------------------+
| customers               |
| employees               |
| offices                 |
| orderdetails            |
| orders                  |
| payments                |
| productlines            |
| products                |
+-------------------------+

Select From Table

SELECT ဆိုတာကတော့ Table ထဲက data တွေ ဆွဲထုတ်ဖို့ အတွက်ပါ။

Select syntax ကတော့

SELECT [column],[column] FROM [table] 

ဥပမာ

SELECT customerNumber,customerName FROM customers;

အကယ်၍ column အကုန်လုံးပါစေချင်ရင်တော့ * ကို အသုံးပြုနိုင်ပါတယ်။

SELECT * FROM customers;

Limit

အခု data တွေကို ထုတ်ကြည့်သည့် အခါမှာ Data တွေ အများကြီး ထွက်လာတာကို တွေ့ရပါမယ်။ ကျွန်တော်တို့ data ကို လိုသလောက် ပဲ ထုတ်ချင်ရတော့ limit ကို သုံးရပါမယ်။

SELECT * FROM customers LIMIT 10

ဒါဆိုရင် ပထမဆုံး ၁၀ ကြောင်းပဲ ထွက်လာပါမယ်။ LIMIT က

LIMIT [OFFSET],[COUNT]

ဆိုပြီး ရှိပါတယ်။

ဥပမာ

Page 1 အတွက်

SELECT * FROM customers LIMIT 0, 10

offset 0 က စမယ်လို့ ဆိုပါတယ်။

Page 2 ကို သွားမယ်ဆိုရင်တော့

SELECT * FROM customers LIMIT 10 , 10

Page 3 ကို သွားမယ်ဆိုရင်တော့

SELECT * FROM customers LIMIT 20 , 10

Page by Page သွားချင်ရင်

LIMIT [(page - 1) * number of row per page] , [number of row per page]

ဆိုသည့် formula နဲ့ သွားနိုင်ပါတယ်။ သတိထားသင့်တာကတော့ data တွေဟာ သန်းနဲ့ ချီလာသည့် အခါမှာ Page များလာလေလေ data ထုတ်ရတာ ကြာလေလေဖြစ်တတ်ပါတယ်။

OREDER BY

ကျွန်တော်တို့ data တွေကို ထုတ်သည့် အခါမှာတော့ ကြီးစဥ် ငယ်လိုက် စီမလား ငယ်စဥ် ကြီးလိုက် စီမလား ဆိုပြီး ထုတ်ကြည့်လို့ရပါတယ်။ အဲဒီ အတွက် ORDER BY ကို အသုံးပြုနိုင်ပါတယ်။

SELECT * FROM TABLE ORDER BY [Column] [ASC|DESC]

Order စီသည့် အခါမှာတော့ ascending နှင့် descending ဆိုပြီး ရှိပါတယ်။ အငယ်ကို စ စေချင်ရင်တော့ asc ကို သုံးပြီး အကြီးကို စမယ် ဆိုရင်တော့ desc ကို သုံးပါတယ်။

SELECT * FROM customers ORDER BY customerName DESC;

ဒါဆိုရင်တော့ customerName ကို ကြီးစဥ် ငယ်လိုက် စီပြီး ပြပေးပါမယ်။

SELECT * FROM customers ORDER BY customerName ASC;

ဒါဆိုရင်တော့ ငယ်စဥ်ကြီးလိုက် ပြပေးပါမယ်။

SELECT * FROM customers ORDER BY customerName ASC LIMIT 10;

LIMIT ကိုတော့ နောက်ဆုံးမှာပဲ ထည့်ပြီး သုံးရပါတယ်။ customerName ငယ်စဥ်ကြီးလိုက် ပြပေးပြီး ထိပ်ဆုံး ၁၀ ခု ပဲ ပြမယ် ဆိုသည့် သဘောပါ။

WHERE

ထပ်ပြီးတော့ လိုချင်သည့် Data ကို ပဲ ဆွဲထုတ်ဖို့ အတွက် WHERE ကို အသုံးပြုနိုင်ပါတယ်။

SELECT customerNumber,customerName,phone FROM customers WHERE customerNumber = 169;

ဒါဆိုရင် customerNumber 169 ဖြစ်သည့် data ထွက်လာပါမယ်။

SELECT customerNumber,customerName,phone FROM customers WHERE customerNumber > 169;

ဒါဆိုရင်တော့ customerNumber 169 ထက်ကြီးတာ တွေ ထွက်လာပါမယ်။

SELECT customerNumber,customerName,phone FROM customers WHERE customerNumber < 169;

ဒါဆိုရင်တော့ customerNumber 169 ထက် ငယ်သည့် စာရင်း ထွက်လာပါမယ်။

SELECT customerNumber,customerName,phone FROM customers WHERE customerNumber > 169 and customerNumber < 205;

ဒါဆိုရင်တော့ customerNumber 169 ထက် ကြီးပြီး 205 ထက် ငယ်သည့် စာရင်း ထွက်လာပါမယ်။

SELECT customerNumber,customerName,phone FROM customers WHERE (customerNumber >= 169 and customerNumber <= 205) or (customerNumber >= 211 and customerNumber <= 227);

ဒါဆိုရင်တော့ >= သုံးထားသည့် အတွက် ကြောင့် တူမယ် ကြီးလည်း ကြီးမယ် လို့ ပြောထားပါတယ်။ <= သုံးထားသည့် အတွက် ကြောင့် တူမယ် ငယ်မယ် လို့ ပြောထားပါတယ်။ အထက်ပါ sql အရ ဆိုရင်တော့ 169 နှင့် တူမယ် 169 ထက်ကြီးမယ် ။ နောက်ပြီး 205 နှင့် တူမယ် 205 ထက် ငယ် ရမယ်။ အဲဒါက တစ်ခု။ ဒါမဟုတ် or ဆိုပြီး ထည့်ထားတာ တွေ့နိုင်ပါတယ်။ 211 နှင့် တူမယ် 211 ထက်ကြီးရင်မယ် ။ နောက်ပြီး 227 နှင့် တူမယ် 227 ထက် ငယ် ရမယ်။

and , or , () တွေကတော့ programming အခြေခံ သိသည့် သူတွေ အတွက် သိပြီးသား ဖြစ်မှာပါ။

အထက်ပါ SQL အရဆိုရင်တော့ result က

+----------------+--------------------------------+------------------+
| customerNumber | customerName                   | phone            |
+----------------+--------------------------------+------------------+
|            169 | Porto Imports Co.              | (1) 356-5555     |
|            171 | Daedalus Designs Imports       | 20.16.1555       |
|            172 | La Corne D'abondance, Co.      | (1) 42.34.2555   |
|            173 | Cambridge Collectables Co.     | 6175555555       |
|            175 | Gift Depot Inc.                | 2035552570       |
|            177 | Osaka Souveniers Co.           | +81 06 6342 5555 |
|            181 | Vitachrome Inc.                | 2125551500       |
|            186 | Toys of Finland, Co.           | 90-224 8555      |
|            187 | AV Stores, Co.                 | (171) 555-1555   |
|            189 | Clover Collections, Co.        | +353 1862 1555   |
|            198 | Auto-Moto Classics Inc.        | 6175558428       |
|            201 | UK Collectables, Ltd.          | (171) 555-2282   |
|            202 | Canadian Gift Exchange Network | (604) 555-3392   |
|            204 | Online Mini Collectables       | 6175557555       |
|            205 | Toys4GrownUps.com              | 6265557265       |
|            211 | King Kong Collectables, Co.    | +852 2251 1555   |
|            216 | Enaco Distributors             | (93) 203 4555    |
|            219 | Boards & Toys Co.              | 3105552373       |
|            223 | Natürlich Autos                | 0372-555188      |
|            227 | Heintze Collectables           | 86 21 3555       |
+----------------+--------------------------------+------------------+
20 rows in set (0.001 sec)

ဆိုပြီး ထွက်လာပါမယ်။

အခု customer name ကို ရှာကြည့်ရ အောင်။ customerName က text ဖြစ်သည့် အတွက်ကြောင့် nubmer လို > , < တွေ သုံးလို့ အဆင်မပြေပါဘူး။

Text တွေကို ရှာချင်သည့် အခါမှာတော့ Like ကို အသုံးပြုနိုင်ပါတယ်။

SELECT * FROM customers WHERE customerName LIKE 'Gif%';

Gif% ဆိုတာကတော့ Gif နဲ့ စမယ် နောက်မှာ အကုန်ဖြစ်နိုင်တယ် လို့ ဆိုလိုပါတယ်။

%Gif ဆိုရင်တော့ ကြိုက်တာလာမယ် နောက်ဆုံးမှာ Gif နဲ့ ဆုံးမယ် ဆိုလိုတာပါ။

%Gif% ဆိုရင်တော့ Gif စာလုံး အလယ်မှာ ပါမယ် ရှေ့မှာလည်း ဖြစ်နိုင်သလို နောက်မှာလည်း ဖြစ်နိုင်ပါတယ် လို့ ဆိုလိုတာပါ။

ကျွန်တော်တို့တွေ ရှေ့မှာ ဖတ်ထားသည့် SQL Syntax နဲ့ ပြောင်းပြီး အောက်က SQL ကြည့်ရအောင်။

SELECT customerNumber,customerName,phone FROM customers WHERE (customerNumber >= 169 and customerNumber <= 173) or customerName LIKE '%gif%' ORDER BY phone LIMIT 5;

customers table ထဲက customerNumber,customerName,phone တွေကို ပြမယ်။ customerNumber က 169 ပါမယ်။ 169 ထက်ကြီးမယ်။ ဒါပေမယ့် 173 ပါမယ်။ 173 ထက် ငယ်မယ်။ သို့မဟုတ် customerName ထဲမှာ gif ဆိုသည့် စာလုံးပါရမယ် လို့ ဆိုလိုတာပါ။

DISTINCT

DISTINCT ကတော့ SELECT ထဲမှာ duplicate ဖြစ်နေတာတွေ ဖယ်ထုတ်ပြီး ပြပေးပါတယ်။

SELECT DISTINCT(status) FROM orders;

ဆိုရင် orders ထဲမှာ ရှိသည့် status အမျိုးအစားကို သာ ဖော်ပြပါလိမ့်မယ်။

+------------+
| status     |
+------------+
| Shipped    |
| Resolved   |
| Cancelled  |
| On Hold    |
| Disputed   |
| In Process |
+------------+

ထပ်နေတာတွေကို ဖယ်ထုတ်ပြီး ရလဒ်ကို ကြည့်ချင်ရင်တော့ DISTINCT ကို သုံးနိုင်ပါတယ်။