1

たとえば、「employees」という名前のテーブルがあるデータベースで SQL クエリを作成する場合、どのような記述がベスト プラクティスでしょうか?

SELECT 'name', 'surname', 'phone' WHERE 'city'='ny' FROM 'employees' ORDER BY 'name'

SELECT name, surname, phone, WHERE city=ny FROM employees ORDER BY name

また

SELECT employees.name, employees.surname WHERE employees.city=ny ORDER BY employee.name

なぜ?これには基準がありますか?

4

6 に答える 6

2
SELECT `name`, `surname`, `phone` WHERE `city`='ny' ORDER BY `name`.

`と'には違いがあることに注意してください(最初はフィールドの名前に使用され、もう1つは文字列に使用されます)。`記号は厳密に必要ですが、たとえば、名前に特殊文字が含まれている場合や、名前がSQLキーワードの場合などです。

于 2011-07-27T06:49:06.793 に答える
1

目的は、SQL をできるだけ読みやすくすることです。それは、自分自身と、後でそれに遭遇する可能性のある他の人にとっての両方です。

そのクリアの下

  • 都市の値が文字列であること
  • 何を選択し、フィルタリングしているか、どのテーブルを使用しているか、何をソートしているか

フィールド名にスペース (またはその他の特殊文字) が含まれている場合にのみ、フィールド名を引用符で囲みます。それ以外の場合は、コードが乱雑になるため、使用しないでください。

SELECT 
   name, 
   surname, 
   phone
FROM 
   employees 
WHERE
   city='ny'
ORDER BY 
   name
于 2011-07-27T06:52:00.507 に答える
1

ほとんどは個人のスタイルの問題ですが、いくつかの形式には利点があります。私の好み:

SELECT e.`name`, e.`surname`, e.`phone` 
FROM `employees` e
WHERE e.`city`= 'ny' 
 OR e.`city` = 'wa'
ORDER BY e.`name`
  1. 大文字のキーワード、小文字のテーブル名 (テーブルを小文字で作成するか、大文字と小文字を区別しないように設定している場合)
  2. 別の行の各キーワード
  3. 各テーブルはエイリアスを取得します (ただし、明示的なAS: employees AS e は使用しません)
  4. 列名の前に必ずテーブル名を指定してください。このようにして、同じ名前の列を持つ可能性のある他のテーブルを心配することなく安全に追加できます。

もう一つの例:

SELECT e.`name`, e.`surname`, e.`phone`, u.rank
FROM `employees` e
[INNER] JOIN `unionreps` u
ON e.ID = u.ID
  1. JOIN は ANSI-89 ではなく ANSI-92 スタイルで記述されます (e.id=u.id の e,u から)
于 2011-07-27T06:56:29.497 に答える
0

私見、最良の基準はこれです:

select
    o.name as office_name,
    e.name as employee_name,
    count(*) as count
from employee e
left join office o on o.id = e.office_id
where e.name like 'a%'
group by 1
order by 1

あなたの目標は、明快さとメンテナンスの改善です。ここで示される機能/利点は次のとおりです。

  • 大文字なし (つまり、select ではなく select)
  • 予約語にはバッククォート エスケープのみを使用する
  • 単数形のテーブル名 (つまりemployee、 not employees)
  • 名前を複数形で表示 (例: current_employees)
  • 名前の部分を区切るアンダースコア (つまり、キャメルケースやフラットケースなどはありません)
  • 主キーには常に名前が付けられますid
  • 常に table_id という名前の外部キー
  • クエリで列名が衝突する場合は、次のようにエイリアスを付けます<table>_<column>
  • クエリは上記のようにフォーマットされます
    • 独自の行にある列を除き、左寄せ
    • 主要なキーワードの改行
  • 通常、名前部分のすべての最初の文字を使用するテーブルのエイリアス。my_table_name mtn
  • Group by式よりも数値をorder by優先します (式を変更する場合、group by または order by 句は必要ありません。そうしないと、DRY 原則に違反します)

これは、長年 SQL をコーディングしてきた結果であり、これにより作業が簡単になることがわかりました。

常に一貫した形式を使用すると、構文エラーも見つけやすくなります。

于 2011-07-27T08:04:35.913 に答える
0

私のため:

  • 1 つのテーブルが含まれる場合 - テーブル エイリアスは使用しません。
  • いくつかのテーブルがクエリに含まれている場合 - テーブル エイリアスを使用します。

例えば:

SELECT deptno, dname FROM dept WHERE loc = 'NEW YORK'

また

SELECT d.deptno, d.dname, e.ename, e.job FROM dept d
JOIN emp e ON d.deptno = e.deptno
WHERE d.loc = 'NEW YORK'

大きなクエリは、テーブル エイリアスを使用すると、より明確で短く見えます。

于 2011-07-27T06:54:17.243 に答える
0

他の人が言ったように、それはコーディングスタイルの問題です。個人的には、エンティティ名に予約語を使用しないことを好みます。これにより、コードの移植性が向上し、次のような混乱を防ぐことができます。

SELECT 'name', 'surname', 'phone' WHERE 'city'='ny' FROM 'employees' ORDER BY 'name'

これはただのぐちゃぐちゃです。mysql は、単一引用符ではなく、エンティティ参照をカプセル化するためにバッククォートを使用します。OTOH Oracle は二重引用符を使用します。区切り文字を使用すると、参照で大文字と小文字が区別されます。

私が使用するプログラミング標準は、コードの意図を明確にするために、常に列名にテーブル名またはエイリアスをプレフィックスとして付けることです (多くの場合、後者は入力量を減らすためです)。また、テーブル名にデータベース名のプレフィックスを付けます。状態メカニズム (USE some_db;) を使用してデータベースを切り替えるのは面倒です。

SELECT e.name
, e.surname
, e.phone
FROM avopa.employees
WHERE e.city='ny'
ORDER BY e.name;

SQL キーワードは大文字、エンティティ参照は小文字、1 行に 1 つの式であることに注意してください。

于 2011-07-27T11:12:56.287 に答える