การใช้ไวยากรณ์ SELECT หกใน ADO
ผู้เขียน:Eve Cole
เวลาอัปเดต:2009-05-30 19:54:23
แบบสอบถามย่อย
ในนิพจน์ SELECT, SELECT...INTO, INSERT...INTO, DELETE หรือ UPDATE คุณสามารถรวมนิพจน์ SELECT ไว้ได้
คุณสามารถสร้างแบบสอบถามย่อยได้โดยใช้สามไวยากรณ์:
นิพจน์ [ใดๆ |. ทั้งหมด |. บางส่วน] (แบบสอบถามย่อย)
นิพจน์ [NOT] IN (แบบสอบถามย่อย)
[NOT] มีอยู่ (แบบสอบถามย่อย)
นิพจน์ SELECT ของแบบสอบถามย่อยมีไวยากรณ์เหมือนกับนิพจน์ SELECT ทั่วไป และต้องอยู่ในวงเล็บ
คุณสามารถใช้แบบสอบถามย่อยเพื่อแทนที่ตัวดำเนินการในนิพจน์ SELECT หรือในส่วนคำสั่ง WHERE หรือ HAVING
คำสำคัญ ANY และ SOME มีความหมายเหมือนกัน และใช้เพื่อเลือกเงื่อนไขการเปรียบเทียบของบันทึกใดๆ ที่ตรงกับแบบสอบถามย่อย ตัวอย่างเช่น ตัวอย่างต่อไปนี้จะส่งกลับบันทึกที่ราคาต่อหน่วยของผลิตภัณฑ์มากกว่าปริมาณใดๆ ที่มากกว่า 100 ในคำสั่งซื้อ:
เลือก * จากผลิตภัณฑ์
WHERE ราคาต่อหน่วย > ใดๆ
(เลือกราคาต่อหน่วยจากคำสั่งซื้อ
โดยที่ปริมาณ > 100)
คำสำคัญ ALL ใช้เพื่อเลือกเงื่อนไขการเปรียบเทียบของบันทึกทั้งหมดที่ตรงกับแบบสอบถามย่อย
ตัวอย่างเช่น ในตัวอย่างข้างต้น การเปลี่ยน ANY เป็น ALL จะส่งกลับระเบียนที่ราคาต่อหน่วยของผลิตภัณฑ์มากกว่าคำสั่งซื้อทั้งหมดที่มีปริมาณมากกว่า 100
เพรดิเคตคำหลัก IN เพื่อดึงข้อมูลบางระเบียนที่มีค่าเดียวกันในแบบสอบถามหลักและเฉพาะในแบบสอบถามย่อยเท่านั้น ตัวอย่างต่อไปนี้ส่งคืนผลิตภัณฑ์ทั้งหมดที่ขายด้วยส่วนลด 25 เปอร์เซ็นต์ขึ้นไป:
คำหลัก IN ใช้เพื่อเลือกบันทึกในแบบสอบถามย่อย ตัวอย่างเช่น ตัวอย่างต่อไปนี้จะส่งคืนระเบียนที่มีปริมาณ > 100 ตามลำดับ:
เลือก * จากผลิตภัณฑ์
WHERE รหัสสินค้า IN
(เลือกรหัสสินค้าจากการสั่งซื้อ
โดยที่ปริมาณ > 100)
ในทางตรงกันข้าม คำสำคัญ NOT IN ใช้เพื่อเลือกบันทึกที่ไม่รวมอยู่ในแบบสอบถามย่อย
ในการเปรียบเทียบจริง/เท็จ คุณสามารถใช้คีย์เวิร์ด EXISTS เพื่อพิจารณาว่าแบบสอบถามย่อยจะส่งกลับระเบียนใดๆ หรือไม่
ตัวอย่าง ASP ของคีย์เวิร์ด ALL เช่น โปรแกรม ASP rs24.asp เป็นดังนี้ [เลือกชื่อ วิชา คะแนนจากการสอบ โดยที่ subject = 'เลขคณิต' และคะแนน >= ทั้งหมด (เลือกคะแนนจากการสอบ โดยที่ subject = 'เลขคณิต ' และชื่อ =' จางซาน')] ค้นหาบันทึกทางคณิตศาสตร์ของการทดสอบทางคณิตศาสตร์ที่มีคะแนนมากกว่าหรือเท่ากับจางซาน:
-
ตั้งค่า conn1 = Server.CreateObject("ADODB.Connection")
conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb") & ";Driver={ไดรเวอร์ Microsoft Access (*.mdb)};DriverId=25;FIL=MS Access;"
ตั้ง rs2 = Server.CreateObject("ADODB.Recordset")
SqlStr = "เลือกชื่อ วิชา คะแนนจากการสอบ โดยที่ subject = 'เลขคณิต' และคะแนน >= ทั้งหมด (เลือกคะแนนจากการสอบ โดยที่ subject = 'เลขคณิต' และชื่อ = 'จางซาน')"
rs2.เปิด SqlStr,conn1,1,1
Response.Write "<p>คะแนนทั้งหมดสูงกว่าเลขคณิตของ Zhang San"
ทำในขณะที่ไม่ใช่ rs2.EOF
การตอบสนองเขียน "<BR>" & rs2("ชื่อ") & " " & rs2("Subject") & " คะแนน: " & rs2("คะแนน")
rs2.MoveNext
วนซ้ำ
rs2.ปิด
-
โปรแกรม ASP ข้างต้น rs24.asp ใช้เบราว์เซอร์บนฝั่งไคลเอ็นต์เพื่อเรียกดูผลการดำเนินการและแสดงบันทึกทางคณิตศาสตร์ของการทดสอบทางคณิตศาสตร์ซึ่งมีคะแนนมากกว่าหรือเท่ากับ Zhang San
ใดๆ
คำสำคัญ ANY ใช้เพื่อเลือกเงื่อนไขการเปรียบเทียบของบันทึกใดๆ ที่ตรงกับแบบสอบถามย่อย ตัวอย่างเช่น โปรแกรม ASP rs24.asp เป็นดังนี้ [เลือกชื่อ วิชา คะแนนจากการสอบ โดยที่ subject = 'เลขคณิต' และคะแนน >= ใดๆ (เลือกคะแนนจากการสอบ โดยที่หัวเรื่อง='เลขคณิต' และชื่อ='จางซาน')] ค้นหาบันทึกที่มีเศษส่วนมากกว่าหรือเท่ากับเศษส่วนเลขคณิตใดๆ ของจางซาน:
-
ตั้งค่า conn1 = Server.CreateObject("ADODB.Connection")
conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb") & ";Driver={ไดรเวอร์ Microsoft Access (*.mdb)};DriverId=25;FIL=MS Access;"
ตั้ง rs2 = Server.CreateObject("ADODB.Recordset")
SqlStr = "เลือกชื่อ วิชา คะแนนจากการสอบ โดยที่ subject = 'เลขคณิต' และคะแนน >= ใดๆ (เลือกคะแนนจากการสอบ โดยที่ subject = 'เลขคณิต' และชื่อ = 'จางซาน')"
rs2.เปิด SqlStr,conn1,1,1
Response.Write "<p>เศษส่วนใดๆ ที่สูงกว่าเลขคณิตของ Zhang San"
ทำในขณะที่ไม่ใช่ rs2.EOF
การตอบสนองเขียน "<BR>" & rs2("ชื่อ") & " " & rs2("Subject") & " คะแนน: " & rs2("คะแนน")
rs2.MoveNext
วนซ้ำ
rs2.ปิด%>
โปรแกรม ASP ข้างต้น rs24.asp ใช้เบราว์เซอร์บนฝั่งไคลเอ็นต์เพื่อเรียกดูผลการดำเนินการและแสดงบันทึกที่มีคะแนนมากกว่าหรือเท่ากับเศษส่วนทางคณิตศาสตร์ใดๆ ของ Zhang San
บาง
คำสำคัญ SOME และ ANY มีความหมายเหมือนกัน และใช้เพื่อเลือกเงื่อนไขการเปรียบเทียบของบันทึกใดๆ ที่ตรงกับแบบสอบถามย่อย ตัวอย่างเช่น โปรแกรม ASP rs24.asp เป็นดังนี้ [SELECT Name, Subject, Score From Exam Where Subject = 'เลขคณิต' และคะแนน >= บางส่วน (เลือกคะแนนจากการสอบโดยที่หัวเรื่อง='เลขคณิต' และชื่อ='จางซาน')] ค้นหาบันทึกที่มีคะแนนมากกว่าหรือเท่ากับเศษส่วนทางคณิตศาสตร์ใดๆ ของจางซาน:
-
ตั้งค่า conn1 = Server.CreateObject("ADODB.Connection")
conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb") & ";Driver={ไดรเวอร์ Microsoft Access (*.mdb)};DriverId=25;FIL=MS Access;"
ตั้ง rs2 = Server.CreateObject("ADODB.Recordset")
SqlStr = "เลือกชื่อ วิชา คะแนนจากการสอบ โดยที่ subject = 'เลขคณิต' และคะแนน >= บางส่วน (เลือกคะแนนจากการสอบ โดยที่ subject = 'เลขคณิต' และชื่อ = 'จางซาน')"
rs2.เปิด SqlStr,conn1,1,1
Response.Write "<p>เศษส่วนที่สูงกว่าเลขคณิตของ Zhang San"
ทำในขณะที่ไม่ใช่ rs2.EOF
การตอบสนองเขียน "<BR>" & rs2("ชื่อ") & " " & rs2("Subject") & " คะแนน: " & rs2("คะแนน")
rs2.MoveNext
วนซ้ำ
rs2.ปิด
-
โปรแกรม ASP ข้างต้น rs24.asp ใช้เบราว์เซอร์บนฝั่งไคลเอ็นต์เพื่อเรียกดูผลการดำเนินการและแสดงบันทึกที่มีคะแนนมากกว่าหรือเท่ากับเศษส่วนทางคณิตศาสตร์ใดๆ ของ Zhang San
เลือก...เข้า
เลือก...Into จะสร้างตารางที่สร้างขึ้นตามผลลัพธ์ของแบบสอบถาม
ไวยากรณ์มีดังนี้:
เลือกฟิลด์ 1[,ฟิลด์ 2[, ...]] ลงในตารางใหม่[ในตารางภายนอก]
จากตาราง
ชื่อของตารางใหม่ต้องไม่เหมือนกับชื่อของตารางที่มีอยู่ มิฉะนั้นจะเกิดข้อผิดพลาด
ตารางใหม่ที่สร้างโดย Select...Into มีประเภทข้อมูลและขนาดช่องเดียวกันกับตารางที่สอบถาม
ลองดูตัวอย่างการใช้คำสั่ง SQL นี้ในโปรแกรม ASP
ตัวอย่างเช่น โปรแกรม ASP rs9.asp เป็นดังนี้ [Select * Into Computer From Product Where Type = 'Computer'] จะสร้างตาราง [Computer] ใหม่สำหรับบันทึก [Type] ทั้งหมดในตาราง [Product] เป็น [Computer] ]:
-
ตั้งค่า conn1 = Server.CreateObject("ADODB.Connection")
conn1.Open "DBQ="& Server.MapPath("ntopsamp.mdb") &";Driver={ไดรเวอร์ Microsoft Access (*.mdb)};DriverId=25;FIL=MS Access;"
sql = "เลือก * ลงในคอมพิวเตอร์จากผลิตภัณฑ์โดยที่ Category = 'คอมพิวเตอร์'"
ตั้งค่า = conn1.Execute (sql)
ตั้งค่า rs3 = Server.CreateObject("ADODB.Recordset")
sql = "เลือก * จากคอมพิวเตอร์"
rs3.เปิด sql,conn1,1,1,1
-
<ตาราง COLSPAN=8 เซลล์แพ็ด=5 เส้นขอบ=0>
<TR>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">รหัส</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">ชื่อ</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">ราคา</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">ปริมาณ</FONT></TD>
</TR>
<% ทำในขณะที่ไม่ใช่ rs3.EOF %>
<TR>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("ชื่อรหัส")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("ชื่อ")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("ราคา")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("ปริมาณ")%></TD>
</TR>
-
rs3.MoveNext
วนซ้ำ
rs3.ปิด
-
</ตาราง>
โปรแกรม ASP ข้างต้น rs9.asp ใช้เบราว์เซอร์บนไคลเอนต์เพื่อเรียกดูผลการดำเนินการและแสดงบันทึกของตาราง [คอมพิวเตอร์] ใหม่