Чи є вагомі причини використовувати верхній регістр для ключових слів SQL? [зачинено]


128

За замовчуванням, мабуть, це великі регістри, але чи дійсно є підстави використовувати верхній регістр для ключових слів? Я почав використовувати верхній регістр, тому що я просто намагався відповідати тому, що дає мені SQL Server, коли я намагався створити щось, наприклад нову збережену процедуру. Але потім мені стало страшно для дитини (5-го) пальця, якому завжди потрібно утримувати Shiftкнопку, тому я перестав використовувати верхній регістр. Будь-яка причина, чому я повинен повернутися до верхнього регістру?

Редагувати : Спасибі за відповіді, хлопці. Я ще не програмував ще в часи, коли COBOL був королем, тому я не знав цього. Я відтепер дотримуватимусь нижнього регістру.


9
Спробуйте клавішу CAPS LOCK. :)
MusiGenesis

7
Мені все ж слід увімкнути CAPS LOCK, коли я хочу записати ключові слова, а потім вимкнути, коли я не пишу ключових слів і знову ввімкнути CAPS LOCK тощо, і так далі. Це просто клопоти.
Хертанто Лежать

17
КАПИ, що ... О, ти маєш на увазі мій третій ключ Ctrl?
Дейв Шерохман

2
IIRC, найсмішніше те, що якщо ви перевіряєте процедури sp_ в MSSQL, вони все в нижньому регістрі.
Benjol

1
@Benjol, не всі вони, але, безумовно, багато з них, як sp_who. Хороша ідея хоча б намагатися бути послідовними в тому ж відростку, що Microsoft не у багатьох "випадках". Каламбур, призначений. LOL
Гордон Белл

Відповіді:


107

Це лише питання стилю, ймовірно, походить із тих часів, коли редактори не розфарбовували код.

Раніше я віддав перевагу всім верхнім регістром, але зараз я схиляюся до всіх нижніх.


6
+1 Я здогадуюсь, я не був єдиним, хто використовував усі низькі ключові слова.
dance2die

2
Я б пішов з припущенням, що це повертається до тих часів, коли редактори не розфарбовували код.
Benjol

10
Я впевнений, що це стосується тих часів, коли багато машин не підтримували малі символи.
Nate CK

1
Я б здогадувався, що це йде до днів перед кольоровими моніторами;)
walrii

150

ОСОБИСТО, Я НЕ МУЖЕ МУЖИТИ СВОЙ SQL, ЩО ВЕЛИКИ МЕНЕ. ВИНАГАЄ МНЕ ОСНОВНОГО АБО КОБОЛУ.

Тому я віддаю перевагу моєму рядку T-SQL з іменами об'єктів бази даних MixedCase.

Читати набагато простіше, а літеральні та коментарі виділяються.


8
Це стільки питання смаку. На мій досвід, кількість криків не надто велика - я віддаю перевагу великим ключовим словам, тому що їх читати набагато простіше, а літеральні та коментарі виділяються.
Джонатан Леффлер

93
+1 за "Я не люблю свій SQL, що кричить на мене"
dance2die

8
Мені не подобається, що на мене кричить будь-яка мова, але це не приходить до питання про те, чи є великою літерою хороша ідея в SQL.
bignose

85

SQL СТАРИЙ. ВИПУСКОВИЙ ДЕЙСТВИЙ ЗАПАС. ВИГОТОВЛЯЄТЬСЯ СИЛЬНІСТЬ ТА РОЗПОВІДАЄ НЕГО.

Незважаючи на те, що правда, жодна з них не звертається до причин, особливих для мови SQL, чому ключові слова верхнього регістру є хорошою умовою.

На відміну від багатьох нових мов, SQL має велику кількість ключових слів і покладається на здатність читача розрізняти ключові слова та ідентифікатори , щоб подумки проаналізувати синтаксис.

Тоді пряма відповідь на ваше запитання - це більше відповідь на те, "чому читач SQL-коду так сильно виграє від великих ключових слів, коли це не так справедливо для більшості сучасних мов?":

  • Покладатися на збереження ключових слів у голові розумно для багатьох сучасних мов, але для SQL нерозумно ; у ньому занадто багато ключових слів і занадто багато варіантів.

  • Покладатися на знаки пунктуації для більшості сучасних мов доцільно, але для SQL нерозумно ; його занадто мало, натомість залежно від точного порядку ключових слів для позначення синтаксису.

  • Покладатися на автоматичні маркери для розрізнення ключових слів доцільно для сучасних мов у звичайних випадках, але ігнорує реальність того, що маркери можуть досягти для SQL . Більшість не охоплює всіх ключових слів усіх варіантів SQL, і незалежно, SQL часто та звичайно читається в контекстах, де виділення не допоможе.

Ось деякі причини, характерні для SQL, у тому, що зчитувач SQL-коду найкраще обслуговується шляхом стандартизації у верхньому регістрі для ключових слів , і лише використовуючи не верхній (тобто нижній або змішаний) регістр для ідентифікаторів.

Виділення іноді може допомогти. Але лише якщо маркер знає, що у вас є SQL; і ми дуже часто маємо SQL в контексті, коли редактор / форматор не може з розумом знати, що він має справу з SQL. Приклади включають вбудовані запити, документацію програміста та текстові рядки в коді іншої мови. Це ж не вірно ніде поруч так часто для мов, як Python або C ++; так, їх код іноді з’являється в цих місцях, але це не буває звичайно так, як це відбувається з SQL-кодом.

Крім того, читач зазвичай використовує підсвітку, яка знає лише підмножину ключових слів, якими використовується ваша конкретна реалізація SQL. Багато менш поширених ключових слів не буде виділено, за винятком тих, хто добре знає ваш варіант SQL. Тож читачеві, навіть якщо він використовує виділення, все ще потрібен якийсь більш прямий спосіб розрізнити ключові слова в будь-якому середньо складному операторі SQL.

Таким чином, читачеві часто - і автор не може знати достроково, коли це буде - потрібна допомога зі змісту самого оператора SQL, щоб знати, що призначено автором як ключове слово, а що призначене як ідентифікатор. Отже, сам вміст SQL повинен відрізняти ключові слова для читача , а використання великих ключових слів - це звичайний і корисний спосіб зробити це.


Я вважаю, що близька причина цього питання є досить хорошою. Ваша відповідь добре пояснена, але все ще виглядає на основі думки. Я не відчуваю SQL, як мати стільки ключових слів. У будь-якому разі після 50-ти частіших ключових слів, як часто ви бачите інших? Чи все-таки має значення показати їх великі регістри? Оскільки їх рідко, вони все одно привертають увагу, чи не так? Звичайно, такі прокляті "хитрі" незарезервовані ключові слова ", як sql-сервер, throwзаслуговують на особливу обробку, але великі регістри - це лише варіант між багатьма.
Фредерік

1
@ Frédéric, ви, здається, стверджуєте, що читачеві не потрібні маловідомі ключові слова, щоб їх позначати як ключові слова. Ні, такі слова не привертають уваги саме тому, що читача не можна очікувати, що вони знають, що це ключові слова; тому їх потрібно розрізняти як ключові слова, як і будь-яке інше.
bignose

Можливо, я просто надто необізнаний щодо SQL, хоч і багато років свого програмування з SQL, але дотепер я вважаю, що завжди помічав майже одразу ключові слова, яких я не знав, тому що вони призводили до незвичної конструкції SQL, принаймні для того, хто цього не робить знайте їх.
Фредерік

33

Приклади Гордона Белла не зовсім правильні; загалом виділяються лише ключові слова, а не весь запит. Його другий приклад виглядатиме так:

SELECT name, id, xtype, uid, info, status, 
base_schema_ver, replinfo, parent_obj, crdate, 
ftcatid, schema_ver, stats_schema_ver, type, 
userstat, sysstat, indexdel, refdate, version, 
deltrig, instrig, updtrig, seltrig, category, cache
FROM sysobjects
WHERE category = 0
AND xtype IN ('U', 'P', 'FN', 'IF', 'TF')
ORDER BY 1

Мені це набагато легше читати, оскільки ключові слова виділяються більше. Навіть підкреслюючи синтаксис, мені здається, що неможливий для читання приклад важче прочитати.

У моїй компанії ми йдемо трохи далі за допомогою нашого форматування SQL.

SELECT      name, id, xtype, uid, info, status, 
            base_schema_ver, replinfo, parent_obj, crdate, 
            ftcatid, schema_ver, stats_schema_ver, type, 
            userstat, sysstat, indexdel, refdate, version, 
            deltrig, instrig, updtrig, seltrig, category, cache
FROM sysobjects
LEFT JOIN systhingies ON
    sysobjects.col1=systhingies.col2
WHERE category = 0
    AND xtype IN ('U', 'P', 'FN', 'IF', 'TF')
ORDER BY 1

1
Так, мені це теж подобається.
Девід Чоловік

6
Проблема полягає в тому, що якщо ви скористаєтеся великим рахунком під час швидкого запуску спеціальних команд, ви завжди будете на 1/2 швидкістю, як той, хто не використовує їх великих літер, якщо вам коли-небудь доведеться запускати спеціальні команди у виробництві, коли це має значення. Тож я записую все в малі регістри, а потім "прикрашаю його" перед реєстрацією, коли хтось скаржиться, що не може його прочитати, оскільки не знає, як запустити підсвітку синтаксису. І я не знаю про вас, але 3 рази на рік мені доводиться запускати спеціальні команди зі швидкістю виробництва, але це дійсно має значення, тому 50% робочих днів, які я практикував, писати тестові запити в усіх нижчих випадках, справді окупаються.

7
І в базі даних моєї компанії (створеній десь у 90-х роках) всі назви таблиць, стовпців, індексів, збережених процедур і т.д. всі з великої літери, тому ми переходимо до малих ключових слів SQL. ;)
Андреас

1
Вау 1/2, як швидко. Я не думаю, що так!
Іхароб Аль Асімі

33

ЦЕ ЧАС ЧАСУ, коли НАЙБІЛЬШІ ЛЮДИ НЕ МОЖЛИВАТИ МОЖЛИВОСТІ ВЗНАЧИТИ ЯКЩО-небудь ВІД КОРИСНІХ СПИСОК СЛУЧАЙ, ЩО ВІДПОВІДАЄТЬСЯ ВІДПОВІДНОГО РОЗКЛАДУВАННЯ (ASCII), НЕ ВІДПОВІДАЛИ. ТІЛЬКИ ШІСТЬ БІТІВ ДОСТУПНІ . В той час, коли SQL БІЛЬШЕ ПОДІЄТЬСЯ, МІЖНІ ЛІСИ ДЛЯ СЛУЧАЙ НЕ БУДЬ СПІЛЬНІ ПРАКТИКИ В ПРОГРАММУВАННІ.

Зверніть увагу, що деякі люди претендують на те, що ДАТАБАС отримає відчуття невідкладності та швидше запустить ваші запитання.


Отже, не вагома причина сьогодні.
bignose

1
@ BIGNOSE: НІ, АБСОЛЮТНО НЕ!
Лукас Едер

1
Я думаю, що це найкраща відповідь. На жаль, я просто ненавиджу малі регістри в ключових словах SQL, і я не можу знайти спосіб подобатись малих літер, я божеволію?
Іхароб Аль Асімі

@IharobAlAsimi ТАК ТЕ СТРАЖ. ЧОМУ ВИ НАПИСАТИ АНГЛІЙСЬКУ У МАЛЬШИМ СЛУЧАХ, АЛЕ МОГО СТРУКТУРОВАНО АНГЛІЙСЬКОЮ?
Лукас Едер

24

Менше 10% букв у тексті, який ми читаємо, є великими літерами. Отже наш мозок більше прагне розпізнати малі літери, ніж великі. Дослідження показали, що читання тексту верхнього регістру потребує більше часу. Ось лише один приклад:

http://www.guardian.co.uk/media/mind-your-language/2010/oct/04/new-york-street-signs-capitals

Наведений вище приклад, я думаю, підкреслює, що навіть коли ви говорите лише про одне-два слова, це має значення.


5
Ми не говоримо про те, щоб читати роман у великій кількості; ми говоримо про кілька ключових слів, які є лише частиною тексту.
Кейсі

6
Ви пропускаєте суть. Справа не в тому, скільки слів ми читаємо, це в тому, що наш мозок навчений швидко робити. Наприклад, вуличний знак, звичайно, не роман, але вони прийшли до того ж висновку. Коли ми вчимося читати, ми починаємо читати кожну букву, але з часом наш мозок починає розпізнавати слово як групу зразків. Краще, якщо ці зразки будуть узгоджені. Пам’ятайте, що великі літери часто відрізняються від нижнього регістру, а не лише великої версії.
AaronLS

1
Але ключових слів дуже мало, і вони з’являються знову і знову; тому розпізнавання повинно бути однаково швидким для тих, хто використовує SQL протягом будь-якого часу.
Кейсі

3
Правда, це точно не щось важке і швидке. Але є лише кілька ключових слів, які є дуже поширеними. Існує великий набір, якого немає, і часто люди розширюють цю практику верхнього корпусу на речі, які є вбудованими функціями, але не обов'язково синтаксичними ключовими словами. На практиці я все ще перекладаю невелику кількість ключових слів, таких як SELECT / WHERE / GROUP BY, які вказують на початок основного розділу запиту. Але всі інші ключові слова, такі як вбудовані функції , такі як cast, rankя прописні.
AaronLS

19

Це тому, що SQL - така стара мова ( 1974 ), що коли вона була задумана, більшість клавіатур не мали малих літер! Мовна документація просто відображала технологію того часу.

Дослідження показали, що ВСІ КАПС важче читати, настільки, що Федеральна адміністрація автомобільних доріг США доручила використовувати знаки змішаного корпусу у своєму Посібнику з рівномірних пристроїв контролю руху, де зазначено:

Надписи назв місць, вулиць та автомобільних доріг на звичайних дорожніх знаках повинні бути комбінацією малих літер із початковими великими літерами.

The New York Post також опублікував:

Дослідження показали, що важче читати знаки з усіма ковпаками, і ті додаткові мілісекунди, витрачені на погляд від дороги, показали, що збільшують ймовірність аварій, особливо серед літніх водіїв.

Немає вагомих причин використовувати великі літери, а вагомих причин цього не робити.

Я особисто не люблю використовувати великі регістри для ключових слів SQL. Мені важче читати і абсурдно в цей день і вік.

Мова SQL визначається як нечутлива до регістру. Зніміть палець із цієї клавіші зміни!


3
Я думаю, що поширеність поважних причин, представлених в інших відповідях, говорить проти вашого твердження: "Немає вагомих причин використовувати великі літери".
bignose

7
@bignose О, є причини ... Я просто не думаю, що вони хороші. На мій досвід, чим молодший програміст SQL, тим більше шансів використовувати великі регістри. І навпаки, я ніколи не зустрічав грамотного кодера SQL, який використовує великі регістри.
богем

3
Абсолютно згідний. Поширеність інших "відповідей" не робить їх правильними, це просто робить їх превалантом. ВСІ ВНУТРІШНІ СПРАВИ - це ГАНГОВЕР ВІД КОМП'ЮТЕРІВ, ЯКІ НЕ МАЄТЕ СПРАВИ НА ЇХ КЛЮЧАХ АБО В ЇХ ХАРАКТЕРНИХ ПРЕДСТАВЛЕННЯХ. СЬОГОДНІ СИЛЬНО.
Чарльз Бретана

Так, і зношуючи клавішу CAPS LOCK або стискаючи пальці, без необхідності утримуючи клавіші Shift.
Гордон Белл

9
Я тут пахну круговими міркуваннями. Якщо причина висловлюється на користь дискримінації ключових слів із регістром, ви відхиляєте це як не вагому причину. Якщо причину представляє кодер SQL, але він не згоден з вашою позицією, ви відхиляєте їх як не компетентний кодер SQL. Я думаю, що на цій основі ми можемо відкинути це як недійсний аргумент.
bignose

8

Верхній регістр може забезпечити посилення видимості ключових слів, але ви можете компенсувати виділення коду та відступ.
Ми використовуємо малі регістри, оскільки редактор запитів та інші інструменти творять чудеса в редагуванні коду t-sql, і ми не бачимо необхідності катувати мізинець.


2
Є редактор запитів і t-sql єдиними місцями, де хтось буде читати ваш SQL-код? Звідки ти знаєш?
bignose

8

Мавпа бач, мавпа роби для мене. Узгодження шаблону - якщо я це роблю так, як я це бачив, структура пропозицій складається ментальніше легше.


7

Верхній регістр менш читабельний. Контур усіх слів має форму коробок; немає спусків і спусків. Малі FTW!


3
Причина, яку ви наводите, підтримує положення про те, що великі регістри допомагають відрізняти ключові слова від решти.
bignose

5
@bignose Якщо SQL читає як людська мова, навіщо нам потрібні великі регістри? Нам не потрібні великі регістри наших дієслів АБО прийменників на людській мові. Уявіть, ЯКЩО КОЖЕ речення виглядало ПОДОБО це. Я вважаю це менш читаним, ніж звичайне написання. Прописні слова в цих двох реченнях змушують мій мозок зупинятися і вимовляти їх повільніше, ніж решта речення, уповільнюючи моє читання і роблячи потік менш природним.
Кріс Міддлтон

1
Людська мова дуже прощає неоднозначність у синтаксисі. Комп'ютерні мови ні, тому ці неоднозначності потрібно звести до мінімуму. Синтаксис SQL не допомагає в цьому, тому нам потрібно користуватися наявними інструментами; Синтаксису SQL не так багато, тому ми виробили конвенцію про використання великих літер.
bignose

5

Я вважаю це більш читабельним. Те саме, що є новий рядок для початку кожного пункту та відступ між пунктами.


2

Спробуйте продукт форматування (я використовую SQL Prompt / SQL Refactor від Red Gate). Ви можете встановити, як ви хочете працювати з великої літери, і ваш код буде завжди послідовно відформатований. Відпочиньте на своєму рожевому і дозвольте комп'ютеру виконати роботу за вас.


1
Ця порада ігнорує безліч контекстів, де читається SQL. Це зовсім недоцільно для читання коду, який вже написав хтось інший; якщо такий інструмент потрібен лише для того, щоб зробити читатими неправильно відформатовані SQL, це є аргументом на користь конвенції, подібної до цієї, що стосується цього питання.
bignose

але такий підхід хороший, якщо ви хочете стандартів у своїй організації. Якщо ви хочете стандартів, думка не має значення
Trubs

2

Однією з причин продовження використання великих букв є те, що ви (чи хтось інший) переглядаєте код у щось на зразок блокнота, це полегшує читання. тобто ви можете легко розмежовувати "ключові слова" та назви таблиць, SP, udf тощо


1

Крім відповідності заради відповідності, немає. Хоча це дуже суб'єктивна тема, я вважаю за краще використовувати змішаний регістр для всіх SQL. SQL набагато простіше читати, і нічого не втрачається в сучасних ІДЕ, де ключові слова все одно кольорові.


Як і багато інших відповіді тут представили причини, я не думаю , що ваш відповідь правильна: Там є причини «крім відповідності на ім'я ВІДПОВІДНОСТІ в».
bignose

... то що вони? Хоча завжди відкрита до нової інформації, чесно кажучи, я ніколи про неї не знала.
Чарльз Бретана

Я вже навів багато причин , тому тепер ви знаєте.
bignose

2
жодна з них не є поважними причинами, це особисті переваги. Не соромтеся робити так, як диктує ваш особистий уподобання, але не характеризуйте перевагу як правило чи найкращу практику.
Чарльз Бретана

1

Інтеліссанс / автодоповнення в студії управління Microsoft SQL Server дозволяє у верхньому або нижньому регістрі для зарезервованих слів, але верхні регістри функціонують як виклики MAX (), SUM ().

Незважаючи на це, парсер все ще дозволяє обробляти малі версії max () та sum ().

Це передбачає неоднозначність щодо характеру страти, а тому є просто питанням особистих уподобань.


4
Так, і в SSMS "Опції -> Текстовий редактор -> Transact-SQL -> Intellisense" ви можете встановити за замовчуванням "Малі регістри", якщо вам зручніше.
Гордон Белл

0

Мені не подобається нічого, що написано усіма великими літерами (і ненавиджу ще більше вводити всі шапки), але не зміг переконати себе йти проти громади. Як звичайно Vim та пов'язані з ним пакети є вирішенням багатьох проблем:

http://www.vim.org/scripts/script.php?script_id=305

Просто введіть як звичайний, і під час введення ключових слів він буде автоматично використовувати великі літери. Я не використовував усіх незрозумілих закликів SQL, але він ще не підвів мене.


-2

Я називаю більшу частину свого mySQL коду всередині PHP, і все своє редагування PHP я виконую в межах vim (або я вважаю, що в цьому випадку VIM ;-). Тепер я впевнений, що там є плагіни, щоб виділити код mySQL в PHP, але я його не знайшов, і мені не потрібно час шукати його. Тому я вважаю за краще, щоб все було в allcaps. Я знаходжу це:

if ( !$bla ) 
{
   echo "select something from something where something";
}

if ( !$beepboop ) 
{
   echo "create table if not exists loremIpsum;
}

$query = "
CREATE TABLE IF NOT EXISTS HISTORY
(
   ID INT NOT NULL AUTO_INCREMENT,
   INSERTDATE TIMESTAMP DEFAULT NOW(),
   ALTERDATE TIMESTAMP(8) DEFAULT NOW(),
   DELETEDATE TIMESTAMP(8),
   ALTERCOUNT INT DEFAULT 0,
   SELECTCOUNT INT DEFAULT 0,

   PRIMARY KEY(ID),
)ENGINE=InnoDB
";

mysqlQuery( $query, $con );

Допомагає мені відрізняти PHP від ​​SQL набагато краще, ніж це:

if ( !$bla ) 
{
   echo "select something from something where something";
}

if ( !$beepboop ) 
{
   echo "create table if not exists loremIpsum;
}

$query = "
create table if not exists history
(
   id int not null auto_increment,
   insertdate timestamp default now(),
   alterdate timestamp(8) default now(),
   deletedate timestamp(8),
   altercount int default 0,
   selectcount int default 0,

   primary key(id),
)engine=InnoDB
";

mysqlQuery( $query, $con );

Також я чомусь ненавиджу змішувати чашки з верблюдами, як-от так:

CREATE TABLE IF NOT EXISTS history
(
   ID INT NOT NULL AUTO_INCREMENT,
   insertDate TIMESTAMP DEFAULT NOW(),
   alterDate TIMESTAMP(8) DEFAULT NOW(),
   deleteDate TIMESTAMP(8),
   alterCount INT DEFAULT 0,
   selectCount INT DEFAULT 0,

   PRIMARY KEY(ID),
)ENGINE=InnoDB

Це IDмене дратує. Чи замість цього має бути id? або iD?


3
Ні, ні, ні, camelCase призначений для імен змінних, а не назв стовпців. Використовуйте належний регістр для назв стовпців ... InsertDate, AlterDate, ...
Gordon Bell

1
Стандарт SQL вимагає реалізації, щоб ігнорувати регістр в ідентифікаторах (він пересуває їх у верхній регістр). Таким чином, ваш код не повинен залежати від відмінностей у регістрі ідентифікаторів, а звичайний спосіб зробити це - зробити ідентифікатори all_lower_case.
bignose

3
@bignose Я не є великим прихильником підкреслення, оскільки він зменшує число в хвилину
puk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.