เลือก * จากชื่อตาราง WHERE 1


129

ฉันอยากรู้อยากเห็น อะไรคือความแตกต่างระหว่างคำค้นหาเหล่านี้:

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

  3. SELECT * FROM `tablename` WHERE 1=1


9
มีการตั้งค่าสถานะ "แคบเกินไป" สำหรับแท็กหรือไม่ เพราะนั่นใช้กับภาษาถิ่น SQL จำนวนมากหากไม่ใช่ทั้งหมด ฉันเห็นบ่อยใน MSSQL และ Oracle เช่นกัน btw อะพอสทรอฟีคืออะไร? ไม่ backtick `ใช้เพื่ออ้างชื่อวัตถุ mysql?
Cee McSharpface

3
@dlatikay คุณสามารถแก้ไขแท็ก ...
Braiam

2
ฮึ่ม ทำไมไม่เพียง... WHERE TRUE? ฉันทราบว่า (ใน SQL ส่วนใหญ่รวมถึง MySQL) TRUE เป็นเพียงมาโครแฟนซีสำหรับ1- แต่ก็ยังไม่ชัดเจนสำหรับผู้อ่านอีกหรือ

2
2 ไม่ถูกต้องในภาษา SQL ส่วนใหญ่
edc65

คำตอบ:


177

2 และ 3 เหมือนกันใน MySQL ฟังก์ชัน 1 ก็เหมือนกัน

where 1 ไม่ได้มาตรฐานดังที่คนอื่น ๆ ชี้ให้เห็นจะใช้ไม่ได้ในภาษาถิ่นอื่น

คนเพิ่มwhere 1หรือwhere 1 = 1เพื่อให้whereเงื่อนไขที่สามารถเพิ่มได้อย่างง่ายดายหรือถูกลบออกไป / กลับจากแบบสอบถามโดยการเพิ่มใน / แสดงความคิดเห็นออกบางคน " and..." ส่วนประกอบ

กล่าวคือ

SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'

11
และเมื่อคุณสร้างแบบสอบถามโดยใช้โปรแกรมเป็นสตริงเพื่อดำเนินการในภายหลังหากคุณเพิ่มWHERE 1=1คุณจะไม่ต้องดูแลว่าเงื่อนไขที่คุณพยายามเพิ่มลงในสตริงเป็นเงื่อนไขแรกหรือไม่ (ดังนั้นจึงต้องมีWHEREด้านหน้า ) หรือไม่.
Vincent Olivert Riera

45
รับเขียนโปรแกรมมา 6 ปีแล้วและไม่เคยคิดที่จะทำสิ่งนี้ - ขอบคุณ!
SimonGates

6
ORDER BY 1ต้องใช้ไวยากรณ์@dlatikay (แทนชื่อคอลัมน์) หากคุณกำลังรวมคำสั่ง SELECT ตั้งแต่สองคำสั่งขึ้นไป
Mark Stewart

5
@SimonGates ฉันเขียนโปรแกรมมา 6 ปีแล้วและไม่เคยคิดจะทำอย่างอื่นเลยฮ่า ๆ
WernerCD

4
@WernerCD ฉันคิดว่ามันสมเหตุสมผลกว่าที่จะสร้างรายการคำสั่งตัวกรองในรายการบางประเภทจากนั้นจึงโยงเข้าด้วยกัน" AND "เป็นตัวคั่น
Zev Spitz

76

อย่างที่ทราบกันดีว่าทั้งสามให้ผลลัพธ์เหมือนกัน (ในบริบทบูลีน MySQL ถือว่าจำนวนเต็ม "1" เป็นจริง - ในความเป็นจริงตัวเลขใด ๆ ที่ไม่ใช่ "0" จะถือว่าเป็นจริง)

เครื่องมือเพิ่มประสิทธิภาพ MySQL ได้รับการบันทึกไว้อย่างชัดเจนเพื่อลบเงื่อนไขคงที่ในWHEREประโยค:

  • การกำจัดสภาพคงที่ . .:

    (B> = ​​5 และ B = 5) หรือ (B = 6 และ 5 = 5) หรือ (B = 7 และ 5 = 6) -> B = 5 หรือ B = 6

ดังนั้นทั้งสามจะถูกรวบรวมเป็นรหัสเดียวกัน

พวกเขาทั้งหมดมีคุณสมบัติเทียบเท่ากันและควรมีลักษณะการทำงานเหมือนกัน

ที่กล่าวว่าที่หนึ่งและสามคือ SQL มาตรฐาน ประการที่สองจะทำให้เกิดข้อผิดพลาดนิพจน์บูลีนในหลายฐานข้อมูล ดังนั้นฉันขอแนะนำให้คุณหลีกเลี่ยงสิ่งนั้น (ฉันไม่แน่ใจว่ามันใช้งานได้หรือไม่ในโหมด SQL ที่เข้มงวดของ MySQL)

บ่อยครั้งที่สามถูกใช้เมื่อสร้างWHEREประโยคแบบไดนามิก มันทำให้ง่ายต่อการเพิ่มเงื่อนไขเพิ่มเติมเป็นAND <condition>โดยไม่ต้องกังวลเกี่ยวกับการเอ้อระเหยANDs


6
นี่เป็นคำตอบที่ดีกว่าสำหรับการพูดทุกสิ่งที่คำตอบอื่น ๆ ทำ แต่ชี้ให้เห็นความแตกต่างอย่างสำคัญว่า # 2 ไม่สอดคล้องกับ ANSI
underscore_d

16

หากคุณกำลังถามเกี่ยวกับความแตกต่างในการแสดงและผลลัพธ์ไม่มีข้อใด 2 และ 3 เหมือนกันWHERE TRUEและจะให้ผลลัพธ์เหมือนกับข้อแรก

1 - SELECT * FROM table_name

ผลลัพธ์ในข้อมูลทั้งหมดจากtable_name(ไม่มีตัวกรอง)

2 - SELECT * FROM table_name WHERE 1

1 จะได้รับการประเมินเป็นTRUEดังนั้น - ไม่มีตัวกรอง - ทุกระเบียนจะถูกส่งกลับ

3 - SELECT * FROM table_name where 1=1

เช่นเดียวกับอันสุดท้าย 1 = 1 คือTRUEนิพจน์ดังนั้น - ไม่มีตัวกรอง - ทุกระเบียนจะถูกเลือก


14

ทั้งหมดเหมือนกัน แต่ใช้ 2 และ 3 เพื่อจัดการกับAND/ORเงื่อนไขต่างๆเช่น:

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')

8

ใน 1 MySQL ไม่จำเป็นต้องประเมินเงื่อนไข WHERE ใด ๆ

ใน 2 และ 3 คือเงื่อนไขคงที่และไม่อิงตามค่าของแถว มันจะถูกประเมินด้วยตรรกะบูลีนและเป็นจริงเสมอ

ตามหน้าที่ไม่มีความแตกต่าง คุณควรเลือก 1 เพื่อความชัดเจนของรหัส


7

ทั้งหมดเหมือนกัน แต่ใช้ 2 และ 3 เพื่อสร้างการสืบค้นแบบไดนามิกสำหรับเงื่อนไข AND / OR

sqlquery ="  SELECT * FROM `tablename` where 1 =1 "

เราใช้รูปแบบ 2 และ 3 ในการสร้างแบบสอบถามแบบไดนามิกดังนั้นเราจึงทราบแล้วว่ามีการเพิ่มคำหลัก "ที่ใด" และเรายังคงเพิ่มตัวกรองต่อไป ชอบ

sqlquery  = sqlquery + "and columna =a"
"AND columna =a " then

หลังจากไม่กี่บรรทัดหากเรามีตัวกรองใหม่เราก็เพิ่ม "AND coulmnb = b" ไปเรื่อย ๆ

คุณไม่จำเป็นต้องตรวจสอบคำค้นหา sql ว่าคำหลักอยู่ที่ใดในการสืบค้นแรกหรือเริ่มต้น

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')

มิฉะนั้นเราสามารถเขียน sqlquery = "SELECT * FROM tablename"

แล้วก็

ถ้าไม่มีอนุประโยค 'where' ในsqlquery นั้น

sqlquery  = sqlquery + "where columna =a"

อื่น

sqlquery  = sqlquery + "and columna =a"

ช่องว่างนำหน้า 4 ช่องแสดงถึงบล็อกรหัส โปรดแก้ไขคำตอบของคุณเพื่อจัดรูปแบบให้ถูกต้องและดูวิธีแก้ไขสำหรับการจัดรูปแบบ Markdown Bible
Mathieu Guindon

4

พวกเขาทั้งหมดให้คำตอบเดียวกัน อย่างไรก็ตามวิธีการเขียน 2 และ 3 ส่วนใหญ่เป็นไปเพื่อให้สามารถควบคุมคำสั่ง "Where" ได้ดังนั้นจึงง่ายต่อการเพิ่มหรือลบในภายหลัง

ฉันคิดว่าวิธีที่หนึ่งและสามเป็นวิธีที่เหมาะสมในการเขียน หากคุณต้องการคำสั่ง where ที่คุณชอบในข้อ 3 มิฉะนั้นข้อ 1 จะดีพอ


3

ใน MS SQL 1 และ 3 จะเหมือนกันอย่างไรก็ตามตัวเลือก 2 จะไม่ทำงานตัวเลือก 2 เป็นคำสั่งที่ไม่ถูกต้องเช่นเดียวกับใน MS SQL WHERE ถูกใช้เพื่อเปรียบเทียบค่าบางค่า ตัวอย่างเช่น:

  1. เลือก * จาก 'myTable โดยที่ ID = 3 (ถูกต้อง)
  2. เลือก * จาก 'myTable โดยที่ 1 = 1 เหมือนกับ Select * from' myTable โดยที่ 2 = 2 เหมือนกับ Select * from 'myTable โดยที่ 3 = 3 คุณจะได้รับแนวคิด (ถูกต้อง) เหมือนกับ Select * จาก' myTable '

2
  1. SELECT * FROM table_name : จะให้ระเบียนทั้งหมดของตารางพร้อมกับเรียกใช้คำสั่ง where
  2. SELECT * FROM table_name WHERE 1 : เงื่อนไขนี้เป็นจริงเสมอแฮกเกอร์ใช้เพื่อเข้าสู่ระบบใด ๆ หากคุณเคยได้ยินเกี่ยวกับการฉีด sql ที่มากกว่า 2 และ 3 เป็นสถานการณ์ที่แฮ็กเกอร์บังคับให้สร้างเพื่อรับบันทึกตารางทั้งหมด
  3. SELECT * FROM table_name โดยที่ 1 = 1 : สิ่งนี้จะให้ระเบียนทั้งหมดของตารางแก่คุณ แต่จะเปรียบเทียบคำสั่ง where แล้วก้าวไปข้างหน้าโดยพื้นฐานแล้วจะถูกเพิ่มเพื่อเพิ่มหรือลบคำสั่งเพิ่มเติมหลังจากนั้น

1

ผลลัพธ์ - ให้ระเบียนทั้งหมดในตารางที่ระบุแทนชื่อตารางสำหรับทั้งสามแบบสอบถาม

SELECT * FROM tablename WHERE 1- ตรวจสอบคำตอบนี้

SELECT * FROM tablename WHERE 1=1- ตรวจสอบคำตอบนี้

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่มประสิทธิภาพส่วนคำสั่ง WHERE ให้ตรวจสอบสิ่งเหล่านี้: MYSQL , SQLite , SQL

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.