การเลือก 1 จากตารางหมายถึงอะไร


146

ฉันได้เห็นข้อความค้นหามากมายด้วยบางสิ่งดังต่อไปนี้

Select 1  
From table

สิ่งนี้1หมายความว่าอย่างไรมันจะถูกประหารชีวิตอย่างไรและมันจะกลับมาอย่างไร

นอกจากนี้ในสถานการณ์ประเภทใดสามารถใช้สิ่งนี้ได้ไหม


โปรดแสดงข้อความค้นหาทั้งหมดกับเรา
gbn

คำตอบ:


107

SELECT 1 FROM TABLE_NAMEหมายถึง "ส่งคืน 1 จากตาราง" มันค่อนข้างไม่มีมาตรฐานในตัวเองดังนั้นโดยปกติจะใช้กับWHEREและบ่อยครั้งEXISTS(เช่น @gbn notes นี่ไม่ใช่วิธีปฏิบัติที่ดีที่สุด แต่เป็นเรื่องธรรมดาพอที่จะสังเกตแม้ว่ามันจะไม่มีความหมายจริงๆก็ตาม ( ที่กล่าวว่าฉันจะใช้เพราะคนอื่นใช้มันและมัน "ชัดเจนมากขึ้น" ทันทีแน่นอนว่าอาจเป็นไก่ที่มีความหนืดกับปัญหาไข่ แต่โดยทั่วไปฉันไม่ได้อาศัย)

 SELECT * FROM TABLE1 T1 WHERE EXISTS (
     SELECT 1 FROM TABLE2 T2 WHERE T1.ID= T2.ID
 );

โดยทั่วไปดังกล่าวข้างต้นจะกลับมาทุกอย่างจากตารางที่ 1 ซึ่งมีหมายเลขตรงกันจากตารางที่ 2 (นี่เป็นตัวอย่างที่วางแผนไว้อย่างเห็นได้ชัด แต่ผมเชื่อว่ามันบ่งบอกถึงความคิด. ส่วนตัวผมอาจจะทำข้างต้นเป็นSELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);ขณะที่ผมมองว่าเป็นไกลออกไปชัดเจนกว่าผู้อ่านเว้นแต่จะมีเหตุผลที่น่าสนใจไม่ให้)

แก้ไข

จริงๆแล้วมีบางกรณีที่ฉันลืมไปจนถึงตอนนี้ ในกรณีที่คุณพยายามกำหนดค่าที่มีอยู่ในฐานข้อมูลจากภาษาภายนอกบางครั้งSELECT 1 FROM TABLE_NAMEจะถูกใช้ สิ่งนี้ไม่ได้ให้ประโยชน์อย่างมีนัยสำคัญมากกว่าการเลือกคอลัมน์เดี่ยว ๆ แต่ขึ้นอยู่กับการนำไปใช้งานมันอาจให้ผลกำไรที่สูงกว่าการทำSELECT *เพียงเพราะมันมักจะเป็นกรณีที่คอลัมน์เพิ่มเติมที่ DB ส่งกลับไปยังภาษา โครงสร้างซึ่งหมายความว่าจะมีเวลามากขึ้น


และทำไม "ปกติ" กับ EXISTS คุณมีข้อพิสูจน์ว่าทำไม ?
gbn

6
และ -1 สำหรับการเผยแพร่ตำนานของ...EXISTS (SELECT 1...
gbn

2
@Gbn ไม่รู้ว่าทำไมฉันเห็นมันบ่อยกว่าสิ่งอื่นใด ฉันเพิ่งเห็นมันบ่อยกว่านั้น
cwallenpoole

2
ไก่มีความหนืด ไม่อยากกินมัน! บางทีมันอาจจะเป็น 'ปัญหาหินและปัญหาไข่'
No'am Newman

2
@ Ben: IN และมีอยู่มักจะเพิ่มประสิทธิภาพให้กับแผนเดียวกัน
GBN

106

select 1 from tableจะส่งคืนค่าคงที่ 1 สำหรับทุกแถวของตาราง มันมีประโยชน์เมื่อคุณต้องการตรวจสอบอย่างถูกว่าบันทึกตรงกับwhereส่วนคำสั่งและ / หรือของjoinคุณ


1
คำตอบนี้สมเหตุสมผลที่สุดสำหรับฉัน
Joseph Astrahan

2
ประเด็นที่สำคัญมากในความเป็นจริง: "สำหรับทุกแถวในตาราง" ดังนั้นการตรวจสอบ "ความพร้อมใช้งานของตาราง" เป็นส่วนหนึ่งของตัวอย่างเช่นการตรวจสอบสุขภาพของตารางที่มีหลายร้อยล้านแถวจะสิ้นสุดในชุดผลลัพธ์เป็นร้อยล้าน "1" (หมายเหตุ: ไม่ว่าสิ่งนี้จะเกิดขึ้น ... ในการผลิต;);))
conny

แท้จริงนี่ควรเป็นคำตอบที่ยอมรับได้ที่นี่!
Fahad Javed

40

ถ้าคุณหมายถึงสิ่งที่ชอบ

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1 FROM table WHERE...) 

แล้วมันก็เป็นตำนานที่1ดีกว่า

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT * FROM table WHERE...) 

1หรือ*ในที่มีอยู่จะถูกละเว้นและคุณสามารถเขียนนี้ตามหน้า 191 ของ ANSI SQL 1992 มาตรฐาน :

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1/0 FROM table WHERE...) 

1
เพิ่งตรวจสอบว่า postgres เคารพสิ่งนี้exists (select 1/0ทำงานเหมือนเครื่องราง
alex

22

มันทำในสิ่งที่มันบอก - มันจะคืนค่าจำนวนเต็ม 1 เสมอมันใช้เพื่อตรวจสอบว่าระเบียนที่ตรงกับที่คุณมีอยู่หรือไม่


22
อืม - คำถามคือ "มันหมายความว่าอะไร" ไม่ใช่ "นี่เป็นวิธีปฏิบัติที่ดี" ฉันยอมรับว่ามันไม่ได้สร้างความแตกต่างจากมุมมองด้านประสิทธิภาพ - แต่เป็นข้อตกลงที่นักพัฒนาซอฟต์แวร์ใช้เนื่องจากสันนิษฐานว่า 1 ถูกตีความว่าเป็น "จริง"
เนวิลล์คุยต์

20

select 1 from table ใช้โดยฐานข้อมูลบางอย่างเป็นแบบสอบถามเพื่อทดสอบการเชื่อมต่อเพื่อดูว่ายังมีชีวิตอยู่หรือไม่มักใช้เมื่อดึงหรือคืนการเชื่อมต่อไปยัง / จากกลุ่มการเชื่อมต่อ


2
นั่นเป็นกรณีของฉันมันเป็นเรื่องธรรมดาในแอพพลิเคชั่น JBOSS และ TOMCAT
Valter Silva

13

ผลลัพธ์คือ1ทุกเร็กคอร์ดในตาราง __


ไม่จริงฉันพยายามสร้างตารางที่ว่างเปล่าและเรียกใช้คิวรีผลลัพธ์คือหก 1s
r0ng

9

แม้ว่ามันจะไม่เป็นที่รู้จักกันอย่างกว้างขวางแบบสอบถามสามารถมีHAVINGประโยคโดยไม่มีGROUP BYข้อ

ในกรณีดังกล่าวHAVINGจะมีการใช้อนุประโยคทั้งชุด เห็นได้ชัดว่าSELECTประโยคไม่สามารถอ้างถึงคอลัมน์ใด ๆ มิฉะนั้นคุณจะ (แก้ไข) ได้รับข้อผิดพลาด "คอลัมน์ไม่ถูกต้องในการเลือกเพราะมันไม่มีอยู่ใน GROUP BY" เป็นต้น

ดังนั้นจึงต้องใช้ค่าตามตัวอักษร(เนื่องจาก SQL ไม่อนุญาตให้มี resultset ที่มีคอลัมน์ศูนย์ - ทำไม?!) และใช้ค่าตามตัวอักษร 1 ( INTEGER) เป็นปกติ: ถ้าHAVINGคำสั่งย่อยประเมินTRUEแล้ว resultset จะเป็นหนึ่งแถวที่มีหนึ่ง คอลัมน์แสดงค่า 1 มิฉะนั้นคุณจะได้รับชุดที่ว่างเปล่า

ตัวอย่าง: เพื่อค้นหาว่าคอลัมน์มีค่าแตกต่างกันมากกว่าหนึ่งค่าหรือไม่:

SELECT 1
  FROM tableA
HAVING MIN(colA) < MAX(colA);

"เห็นได้ชัดว่าประโยค SELECT ไม่สามารถอ้างถึงคอลัมน์ใด ๆ " - การเลือกนิพจน์บูลเป็นไปได้SELECT MIN(colA) < MAX(colA) FROM tableAหรือไม่
Paul Spiegel

7

หากต้องการเจาะจงมากขึ้นเล็กน้อยคุณต้องใช้สิ่งนี้เพื่อทำ

SELECT 1 FROM MyUserTable WHERE user_id = 33487

แทนที่จะทำ

SELECT * FROM MyUserTable WHERE user_id = 33487

เพราะคุณไม่สนใจที่จะดูผลลัพธ์ การขอหมายเลข 1 นั้นง่ายมากสำหรับฐานข้อมูล (เนื่องจากไม่ต้องทำการค้นหาใด ๆ )


ตามความคิดเห็นด้านบนดูเหมือนว่า Select 1 นั้นไม่ได้มีประสิทธิภาพดีกว่า select * ใช่หรือไม่?
eRaisedToX

5

หากคุณไม่ทราบว่ามีข้อมูลใด ๆ ในตารางของคุณหรือไม่คุณสามารถใช้แบบสอบถามต่อไปนี้:

SELECT cons_value FROM table_name;

สำหรับตัวอย่าง:

SELECT 1 FROM employee;
  1. มันจะส่งคืนคอลัมน์ที่มีจำนวนแถวทั้งหมด & ทุกแถวมีค่าคงที่เหมือนกัน 1 (สำหรับเวลานี้จะส่งคืน 1 สำหรับแถวทั้งหมด)
  2. หากไม่มีแถวในตารางของคุณมันจะไม่ส่งคืนอะไรเลย

ดังนั้นเราจึงใช้แบบสอบถาม SQL นี้เพื่อทราบว่ามีข้อมูลใด ๆ ในตาราง & จำนวนแถวที่ระบุว่ามีกี่แถวในตารางนี้


3

ซึ่งหมายความว่าคุณต้องการค่า " 1 " เป็นเอาต์พุตหรือเวลาส่วนใหญ่ที่ใช้เป็นแบบสอบถามภายในเนื่องจากเหตุผลบางอย่างที่คุณต้องการคำนวณคิวรีด้านนอกตามผลลัพธ์ของคิวรีด้านใน .. ไม่ใช่ทุกครั้งที่คุณใช้1แต่คุณ มีค่าเฉพาะบางอย่าง ...

สิ่งนี้จะให้ผลลัพธ์เป็นค่า 1 ในแบบคงที่


3

หากคุณเพียงต้องการตรวจสอบความจริงหรือเท็จตามส่วนคำสั่ง WHERE ให้เลือก 1 จากตารางโดยที่เงื่อนไขเป็นวิธีที่ถูกที่สุด


2

ฉันเห็นมันมักจะใช้ในการฉีด SQL เช่น:

www.urlxxxxx.com/xxxx.asp?id=99 union select 1,2,3,4,5,6,7,8,9 from database;

ตัวเลขเหล่านี้สามารถใช้ในการเดาตำแหน่งฐานข้อมูลที่มีอยู่และเดาชื่อคอลัมน์ของฐานข้อมูลที่คุณระบุและค่าของตาราง


0

ง่าย ๆ หมายความว่าคุณกำลังดึงข้อมูลคอลัมน์แรกจากตาราง ,,,, หมายถึงเลือก Emply_num, Empl_no จากพนักงาน ที่นี่คุณใช้เลือก 1 จากพนักงาน นั่นหมายความว่าคุณกำลังดึงคอลัมน์ Emply_num ขอบคุณ


ฉันจำไวยากรณ์ดังกล่าวได้ แต่เฉพาะกับฐานข้อมูลที่ฉันจำไม่ได้ PostgreSQL?
diynevala

0

เหตุผลก็คืออีกหนึ่งอย่างน้อยสำหรับ MySQL นี่คือจากคู่มือ MySQL

InnoDB คำนวณค่าดัชนีความเป็นหัวใจสำหรับตารางในครั้งแรกที่เข้าถึงตารางหลังจากเริ่มต้นแทนที่จะเก็บค่าดังกล่าวไว้ในตาราง ขั้นตอนนี้อาจใช้เวลามากในระบบที่แบ่งข้อมูลออกเป็นหลาย ๆ ตาราง เนื่องจากโอเวอร์เฮดนี้ใช้กับการดำเนินการเปิดตารางเริ่มต้นเท่านั้นเพื่อ "อุ่นเครื่อง" ตารางสำหรับใช้ในภายหลังเข้าถึงได้ทันทีหลังจากเริ่มต้นด้วยการออกคำสั่งเช่น SELECT 1 จาก tbl_name LIMIT 1


0

ใช้เพื่อความสะดวกกับ IF EXISTS () มิฉะนั้นคุณสามารถไปกับ

select * from [table_name]

รูปภาพในกรณีของ 'IF EXISTS' เราแค่ต้องรู้ว่าแถวที่มีเงื่อนไขที่ระบุนั้นมีอยู่หรือไม่ไม่สำคัญว่าเนื้อหาของแถวนั้นคืออะไร

select 1 from Users

โค้ดตัวอย่างด้านบนส่งคืนหมายเลข ของแถวเท่ากับไม่มี จากผู้ใช้ที่มี 1 ในคอลัมน์เดียว

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