select 1 in SQL

1. 背景

程序出了個bug,修改時要判斷mysql某一行數據是否存在。因爲這套程序是用原生sql寫的,所以接觸到了 select 1 這樣的語句。

2. select 1 是什麼?

首先,看下面3句話:

第一個:

select 1 from h_admin_menu;

返回結果是:


第二個

# 注意下面的limit,這裏只取一行,以提高效率
select 1 from h_admin_menu where id = 72 limit 1;

返回結果是:


第三個

select 1 from h_admin_menu where id = 1772 limit 1;

返回結果是:


注意無返回值。

從作用上來說,select 1, select *, select anycol長的差不多,功能也差不多,只是返回值不同。select 1的返回值永遠是1,當然,如果有返回值的話。

效率方面:1>anycol>* 有時間可以驗證,筆者在datagrip上觀察執行時間,不過上面的執行時間不穩定,也是醉了。

下面來張圖,自行體會,瞭解下:


3. Db::query() 與 Db::execute() 的區別

  • 第一種理解
    query是查詢,execute是執行,所以當select時用query,當增加、刪除、修改時用execute

  • 再進一步
    query表示查詢,返回的是表中搜索到的值;
    execute表示執行,對錶中的數據是有影響的,返回的是影響的行數;

  • 所以:

場景1:

編輯保存時,如果內容未改變,仍調用update方法,返回值爲0,但此時保存是成功的。
所以判斷是否保存成功時,一般用:

if ($res !== false)

場景2

當query:

select 1 from h_admin_menu where id = 72 limit 

返回值是數組那一套,如果恰巧無返回值,那麼各種判斷會讓人跳樓的。

這個時候,便可以用execute了,,因爲是受影響的行數,所以:結果只有1和0;很完美!

4. 好了,總結一下

判斷某一行數據是否存在:

$sql = "select 1 from h_admin_menu where id = 72 limit ";
$isExist = Db::execute($sql);

結束!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章