In select sql: SQL SELECT INTO Statement

Табличные подсказки SQL Server — рекомендации WITH (NOLOCK)

Табличные подсказки SQL Server — это особый тип явной команды, которая используется для переопределения поведения по умолчанию оптимизатора запросов SQL Server во время выполнения запроса T-SQL. Это достигается путем применения определенного метода блокировки, определенного индекса или операции обработки запроса, такой поиск по индексу или сканирование таблицы, которые будут использоваться оптимизатором запросов SQL Server для построения плана выполнения запроса. Табличные подсказки можно добавить в предложение FROM запроса T-SQL, влияя только на таблицу или представление, на которое ссылается предложение FROM.

Одной из наиболее часто используемых табличных подсказок в операторах SELECT T-SQL является подсказка WITH (NOLOCK) . Уровень изоляции транзакций по умолчанию в SQL Server — это уровень изоляции READ COMMITTED, при котором получение изменяющихся данных будет заблокировано до тех пор, пока эти изменения не будут зафиксированы. Подсказка таблицы WITH (NOLOCK) используется для переопределения уровня изоляции транзакций по умолчанию для таблицы или таблиц в представлении в конкретном запросе, позволяя пользователю извлекать данные без воздействия блокировок на запрошенные данные, из-за другого процесса, который его изменяет. Таким образом, запрос будет потреблять меньше памяти для блокировки этих данных. В дополнение к этому не будет возникать взаимоблокировок для запросов, которые запрашивают одни и те же данные из этой таблицы, что обеспечивает более высокий уровень параллелизма из-за меньшего размера. Другими словами, табличная подсказка WITH (NOLOCK) извлекает строки, не дожидаясь завершения обработки другими запросами, которые считывают или изменяют те же данные. Это похоже на уровень изоляции транзакций READ UNCOMMITTED, который позволяет запросу видеть изменения данных перед фиксацией изменяющей их транзакции. Уровень изоляции транзакций можно задать глобально на уровне соединения с помощью команды T-SQL SET TRANSACTION ISOLATION LEVEL, как будет показано далее в этой статье.

Хотя подсказку таблицы NOLOCK, как и все другие подсказки таблицы, можно использовать без использования ключевого слова WITH, Microsoft объявила, что пропуск ключевого слова WITH является устаревшей функцией и будет удален из будущих версий Microsoft SQL Server. При этом лучше включить ключевое слово WITH при указании подсказок таблицы. Одним из преимуществ использования ключевого слова WITH является то, что вы можете указать несколько подсказок таблицы, используя ключевое слово WITH для одной и той же таблицы.

В целом, частое использование явных табличных подсказок считается плохой практикой, которой следует избегать. В частности, для подсказки таблицы NOLOCK чтение незафиксированных данных, которые могут быть отброшены после того, как вы их прочитали, может привести к грязному чтению , которое может произойти при чтении данных, которые изменяются или удаляются во время чтения незафиксированных данных, так что данные, которые вы читаете, могут быть другими или даже никогда не существовать.

Подсказка таблицы WITH (NOLOCK) также приводит к Неповторяемые чтения ; это чтение происходит, когда требуется прочитать одни и те же данные несколько раз, и данные изменяются во время этих чтений. В этом случае вы будете читать несколько версий одной и той же строки.

Фантомные чтения также могут быть результатом использования табличной подсказки WITH(NOLOCK), в которой вы получите больше записей, когда транзакция, которая вставляет новые записи, откатывается, или меньше записей, когда транзакция, которая удаляет существующие данные откатываются. Другая проблема, которая может возникнуть, когда другие транзакции перемещают данные, которые вы еще не прочитали, в место, которое вы уже отсканировали, или добавили новые страницы в место, которое вы уже отсканировали. В этом случае вы будете пропустить эти записи и не увидит в возвращаемом результате. Если другая транзакция перемещает данные, которые вы уже отсканировали, в новое место, которое вы еще не читали, вы прочитаете данные дважды . Кроме того, поскольку запрошенные данные могут быть перемещены или удалены в процессе чтения, может возникнуть следующая ошибка:

Сообщение 601, уровень 12, состояние 1

Не удалось продолжить сканирование с помощью NOLOCK из-за перемещения данных.

Табличная подсказка WITH (NOLOCK) является хорошей идеей, когда система активно использует явные транзакции, которые очень часто блокируют чтение данных. Подсказка таблицы WITH (NOLOCK) используется при работе с системами, которые принимают несинхронизированные данные, например с системами отчетов.

Чтобы на практике понять использование табличной подсказки WITH (NOLOCK), давайте создадим новую таблицу с помощью приведенного ниже оператора CREATE TABLE T-SQL:

1

2

3

4

5

6

7

8

USE SQLShackDemo

GO

CREATE TABLE LockTestDemo

( ID INT IDENTITY (1,1) PRIMARY KEY,

  EmpName NVARCHAR(50),

  EmpAddress NVARCHAR(4000),

  Номер телефона VARCHAR(50)

)

После создания таблицы мы заполним ее 100 тыс. строками для целей тестирования, используя ApexSQL Generate, генератор тестовых данных SQL, как показано на снимке ниже:

Как только таблица будет готова, мы смоделируем сценарий блокировки, в котором транзакция обновления будет выполняться внутри транзакции, которая начнется, а не будет зафиксирована или откатана. Приведенная ниже инструкция BEGIN TRAN T-SQL запустит транзакцию, которая запустит следующую инструкцию UPDATE в таблице LockTestDemo под номером сеанса SQL 53, не закрывая транзакцию путем фиксации или отката:

НАЧАТЬ TRAN

ОБНОВЛЕНИЕ LockTestDemo SET EmpAddress = ‘AMM’ WHERE ID <100

С данными таблицы, заблокированными транзакцией, мы выполним еще один оператор SELECT в сеансе SQL номер 54, который извлекает данные из таблицы LockTestDemo, используя приведенный ниже оператор SELECT:

ВЫБЕРИТЕ * ИЗ LockTestDemo

Вы увидите, что предыдущая инструкция SELECT займет много времени без извлечения каких-либо записей. Проверка того, что блокирует этот запрос SELECT, с помощью команды sp_who2 с номером сеанса как для операторов SELECT, так и для операторов UPDATE:

sp_who2 53

GO

sp_who2 54

Результат покажет вам, что ранее открытая транзакция не выполняет никаких действий, так как оператор UPDATE выполнен успешно. Но из-за того, что транзакция еще не зафиксирована или не отменена, она по-прежнему блокирует другие запросы, пытающиеся получить данные из этой таблицы. И инструкция SELECT, которая выполняется в сеансе 54, блокируется той транзакцией, которая выполняется в сеансе 53, как показано в результате ниже:

Предыдущий оператор SELECT будет продолжать ждать завершения, фиксации или отката транзакции, чтобы получить запрошенные строки из этой таблицы. Вы можете остановить транзакцию, работающую в сеансе 53, от блокировки других запросов, уничтожив этот сеанс с помощью команды KILL ниже:

УБИТЬ 53

Или просто зафиксируйте или откатите эту транзакцию, выполнив команду COMMIT или ROLLBACK в том же сеансе транзакции, если применимо, как показано ниже:

Как только блокировка будет снята, вы увидите, что запрошенные строки будут получены непосредственно из инструкции SELECT, как показано в результатах ниже:

Предыдущее решение не всегда предпочтительнее или применимо, например, когда транзакция, блокирующая наши запросы, является критической, и ее нелегко убить или откатить, или когда вы не можете контролировать другие транзакции в базе данных. В этом случае подсказка таблицы WITH (NOLOCK) полезна здесь, если вы можете допустить риск грязного чтения или несогласованности данных. Как упоминалось ранее, табличная подсказка WITH (NOLOCK) позволяет читать данные, которые были изменены, но еще не зафиксированы в базе данных. Если вы запустите ту же инструкцию SELECT без уничтожения, фиксации или отката транзакции UPDATE, но на этот раз добавите табличную подсказку WITH (NOLOCK) к имени таблицы в инструкции SELECT, как показано ниже:

ВЫБЕРИТЕ * ИЗ LockTestDemo С (БЕЗ БЛОКИРОВКИ)

Затем проверьте статус оператора SELECT с помощью команды sp_who2. Вы увидите, что запрос выполняется без ожидания успешного завершения транзакции UPDATE и снятия блокировки таблицы, как показано на снимке ниже:

Табличная подсказка WITH (NOLOCK) работает так же, как READUNCOMMITTED Подсказка таблицы, позволяющая получить данные, которые были изменены, но еще не зафиксированы. Тот же оператор SELECT можно изменить, чтобы использовать табличную подсказку READUNCOMMITTED, как показано ниже:

ВЫБЕРИТЕ * ИЗ LockTestDemo С (READUNCOMMITTED)

Получение запрошенных данных напрямую, не дожидаясь, пока инструкция UPDATE снимет блокировку, которую она выполнила для таблицы, возвращая тот же результат, как показано в наборе результатов ниже:

Учтите, что табличные подсказки WITH (NOLOCK) и READUNCOMMITTED можно использовать только с операторами SELECT. Если вы попытаетесь использовать подсказку таблицы WITH (NOLOCK) в операторе DELETE, вы получите сообщение об ошибке, показывающее, что обе подсказки таблицы WITH (NOLOCK) и READUNCOMMITTED не разрешены с UPDATE, INSERT, DELETE или MERGE T- Операторы SQL, как показано ниже:

Вместо того, чтобы разрешать грязное чтение на уровне запроса с помощью табличных подсказок WITH (NOLOCK) и READUNCOMMITTED, вы можете изменить уровень изоляции транзакций на уровне соединения на 9. 0005 READ UNCOMMITTED с помощью приведенного ниже оператора T-SQL SET TRANSACTION ISOLATION LEVEL :

УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ ТРАНЗАКЦИИ ЧТЕНИЕ НЕЗАВЕРШЕНО;

ВЫБЕРИТЕ * ИЗ LockTestDemo

Этот запрос также будет извлекать те же данные напрямую, без использования какой-либо табличной подсказки и без ожидания, пока инструкция UPDATE снимет блокировку, которую она выполнила для таблицы, как показано в наборе результатов ниже:

Из предыдущих результатов вы можете подумать, что это идеальное решение для таких сценариев, когда вы быстрее получите запрошенные данные, не дожидаясь совершения других операций, рискуя иметь неточные данные. Но не повлияет ли запрос SELECT, использующий табличную подсказку WITH (NOLOCK), отрицательно на другие процессы в SQL Server? Чтобы получить ответ, давайте сначала проверим, какой тип блокировки будет предоставлен табличной подсказке WITH (NOLOCK) во время ее выполнения. Этого можно добиться, просто запустив sp_lock с номером сеанса выполняемого запроса, пока запрос выполняется, как показано ниже:

sp_lock 54

Из результата вы увидите, что запросу, использующему подсказку таблицы WITH (NOLOCK), будут предоставлены типы блокировки S и Sch-S , как показано в результате ниже:

Из предыдущего результата видно, что подсказке таблицы WITH (NOLOCK) будет предоставлена ​​блокировка общего доступа (S) на уровне базы данных. Блокировка общего доступа (S) используется для операции чтения, позволяя параллельным транзакциям считывать данные при пессимистическом управлении параллелизмом, не позволяя другим транзакциям изменять заблокированный ресурс, пока на этом ресурсе существуют общие (S) блокировки, до тех пор, пока эта блокировка не будет снята как можно скорее. по завершении операции чтения.

Второй тип блокировки, предоставляемой запросу с использованием табличной подсказки WITH (NOLOCK), — это блокировка стабильности схемы (Sch-S). Эта блокировка не будет препятствовать доступу к ресурсам какой-либо другой транзакции, за исключением параллельных операций DDL и параллельных операций DML, которые получают блокировки модификации схемы (Sch-M) для той же таблицы, которые будут заблокированы во время выполнения запроса. Это действительно имеет смысл, поскольку вам не нужно начинать чтение данных из таблицы, а затем другая транзакция изменяет структуру этой таблицы в процессе извлечения данных. Компонент SQL Server Database Engine использует блокировки модификации схемы (Sch-M) при обработке команд языка определения данных (DDL), таких как добавление нового столбца, удаление существующего столбца, удаление или перестроение индексов, чтобы предотвратить одновременный доступ к таблице. пока замок не будет снят.

Мой запрос NOLOCK блокируется!

Это означает, что наименование NOLOCK не всегда является точным на 100%. Использование табличной подсказки WITH (NOLOCK), которая удерживает блокировку стабильности схемы (Sch_S), может блокировать другие запросы, пытающиеся получить блокировку модификации схемы (Sch-M) для этой таблицы. Это критическая проблема, которую вы должны принять во внимание, если есть много пользователей, выполняющих свои запросы SELECT с использованием табличной подсказки WITH (NOLOCK), что не позволяет вам вносить какие-либо изменения в схему таблицы или обслуживание индексов таблицы, блокируется блокировка стабильности схемы (Sch_S).

Предположим, что нам нужно выполнить приведенный ниже оператор SELECT, использующий табличную подсказку WITH (NOLOCK), под номером сеанса 53 :

ВЫБЕРИТЕ * ИЗ LockTestDemo WITH (NOLOCK), ГДЕ EmpAddress LIKE ‘%Da%’ и EmpName как ‘%And%’

В то же время мы запустим приведенный ниже запрос, который удаляет индекс в той же таблице и создает его снова в сеансе номер 9. 0005 58 :

1

2

3

4

5

6

7

8

9 9 0003

10

11

USE [SQLShackDemo]

GO

 

DROP INDEX [IX_LockTestDemo_EmpName] ON [dbo].[LockTestDemo]

GO

 

СОЗДАТЬ НЕКЛАСТЕРНЫЙ ИНДЕКС [IX_LockTestDemo_EmpName] ON [dbo].[LockTestDemo]

(

[EmpName] ASC

)

GO

Затем, проверив состояние обоих запросов с помощью команды sp_who2, вы увидите в результате, что оператор SELECT, использующий табличную подсказку WITH (NOLOCK) и работающий номер сеанса 53, блокирует процесс DROP/CREATE INDEX, запущенный в рамках сеанса. номер 58, как ясно показано ниже:

Если мы проверим блокировки, которые выполняются каждым запросом, используя системный объект sys.dm_tran_locks, как в запросе ниже:

ВЫБЕРИТЕ *

ИЗ sys. dm_tran_locks

ГДЕ resource_type = ‘ОБЪЕКТ’

Вы увидите, что процесс DROP/CREATE INDEX, работающий под номером сеанса 58, — это , ожидающий для получения типа блокировки модификации схемы (Sch-M). Это происходит из-за того, что блокировка модификации схемы (Sch-M) не может быть получена, пока блокировка стабильности схемы (Sch_S) уже установлена.0005 предоставил оператору SELECT, работающему под номером сеанса 53, уже существует, как показано на снимке ниже:

Мой запрос NOLOCK заблокирован!

И наоборот, поскольку подсказка таблицы WITH (NOLOCK) приобретает тип блокировки стабильности схемы (Sch-S), инструкция SELECT, использующая подсказку таблицы WITH (NOLOCK), будет заблокирована, если в этой таблице выполняется изменение схемы. Предположим, что мы запускаем приведенный ниже оператор ALTER TABLE T-SQL, чтобы изменить размер столбца EmpAddress в таблице LockTestDemo в сеансе номер 53:

ALTER TABLE LockTestDemo ALTER COLUMN [EmpAddress] VARCHAR (5000)

В то же время приведенный ниже оператор SELECT, использующий табличную подсказку WITH (NOLOCK), будет выполняться под номером сеанса 54:

ВЫБЕРИТЕ * ИЗ LockTestDemo С (БЕЗ БЛОКИРОВКИ)

Проверка состояния обоих запросов с помощью приведенных ниже команд sp_who2:

sp_who2 53

GO

sp_who2 54

Вы увидите, что оператор SELECT, работающий в сеансе 54, заблокирован оператором ALTER TABLE, работающим в сеансе 54, как показано ниже:

Затем проверьте блокировки, выполняемые каждым запросом, используя системный объект sys. dm_tran_locks, как в приведенном ниже запросе:

ВЫБЕРИТЕ *

ИЗ sys.dm_tran_locks

ГДЕ resource_type = ‘OBJECT’

AND request_session_id в (53, 54)

Из возвращенного результата будет ясно, что инструкция SELECT, использующая подсказку таблицы WITH (NOLOCK) и работающая под номером сеанса 54, будет ожидать получения блокировки стабильности схемы (Sch_S) из-за того, что стабильность схемы Блокировка (Sch-S) не может быть получена во время блокировки модификации схемы (Sch_M), то есть уже предоставил оператору ALTER, работающему под номером сеанса 53, уже существует, как показано на снимке ниже:

Вы можете представить себе ситуацию, когда вы планируете огромное количество отчетов на ночь, используя табличную подсказку WITH (NOLOCK) на всякий случай. В то же время есть задания обслуживания, которые также запланированы для перестроения сильно фрагментированных индексов в той же таблице!

Существует ряд рекомендаций и предложений, которым вы можете следовать, чтобы избежать проблем, с которыми вы можете столкнуться при использовании табличной подсказки WITH (NOLOCK). К таким предложениям относятся:

  • Включите в запрос SELECT только те столбцы, которые действительно необходимы.
  • Убедитесь, что ваша транзакция короткая, отделив разные операции друг от друга. Например, не включайте громоздкий оператор SELECT между двумя операциями UPDATE.
  • Попробуйте найти альтернативу курсорам
  • Позаботьтесь о том, чтобы использовать и извлечь выгоду из недавно определенной опции WAIT_AT_LOW_PRIORITY для онлайн-перестроения индексов.
  • Тщательно изучите отчетность по сравнению с графиками технического обслуживания
  • Позаботьтесь о том, чтобы использовать и получать выгоду от различных решений высокой доступности SQL Server для создания отчетов, таких как:

    • Настройте вторичные реплики Always On Availability Groups так, чтобы они были доступны для чтения, и используйте их для создания отчетов.
    • Создавать моментальные снимки базы данных при использовании зеркального отображения базы данных SQL Server и использовать их для создания отчетов.
    • Используйте базу данных подписчиков репликации SQL Server для создания отчетов.
    • Используйте базу данных-получатель службы доставки журналов SQL Server для создания отчетов.
  • Автор
  • Последние сообщения

Ахмад Ясин

Ахмад Ясин — инженер Microsoft по работе с большими данными, обладающий глубокими знаниями и опытом в области SQL BI, администрирования и разработки баз данных SQL Server.

Он является сертифицированным экспертом Microsoft по решениям в области управления данными и аналитики, сертифицированным специалистом Microsoft по решениям в области администрирования и разработки баз данных SQL, партнером разработчиков Azure и сертифицированным тренером Microsoft.

Кроме того, он публикует свои советы по SQL во многих блогах.

Просмотреть все сообщения Ахмада Ясина

Последние сообщения Ахмада Ясина (посмотреть все)

Оператор SELECT и предложение FROM

Учебники > Базы данных

Запуск базы данных SQL и просмотр данных

Это урок о том, как просто открыть базу данных и показать данные из базы данных. Если вы думаете, «Какого черта? В Excel я просто открываю файл, а там данные»

Ага!_ Верно. Оператор SQL SELECT и предложение FROM будут первыми примерами того, как явное SQL сравнивается с вашей стандартной электронной таблицей. Электронная таблица будет удобно отображать все свое содержимое при открытии. База данных SQL покажет вам только , что вы скажете, чтобы показать вам .

Примечание. В этом уроке SQL я буду использовать графический интерфейс Sequel Pro для ядра базы данных MySQL и буду запрашивать отчеты об инцидентах SFPD, классифицированные как ASSAULT

Если вы хотите увидеть те же результаты, что и я, вам нужно загрузить и импортировать __ базу данных MySQL с отчетами о нападениях с 2003 по 2013 год из SFPD__.

Я также создал версию этой базы данных SQLite , которая функционально должна быть такой же, как и версия MySQL.

Для MySQL и SQLite я также создал базу данных всех отчетов SFPD с 2003 по 2013 год. Все запросы должны работать одинаково, за исключением того, что вы можете исследовать все различные категории преступлений. Компромисс заключается в том, что база данных намного больше, и поэтому ее загрузка, импорт и запросы будут происходить медленнее. Если вы совершенно новичок во всем этом, я бы просто пошел с атакует базу данных , поэтому любые ошибки, которые вы совершаете, не занимают больше времени, чтобы их понять.

  • MySQL отчеты о нападениях: 130 097 строк
  • MySQL все отчеты об инцидентах: 1 491 764 строки
  • Отчеты о нападениях SQLite : 130 097 строк
  • SQLite все отчеты об инцидентах: 1 491 764 строки

Настойчивость интерпретатора SQL в том, чтобы ему прямо говорили, что делать, может раздражать, когда вы просто хотите видеть все по умолчанию, поэтому большинство графических интерфейсов баз данных позволяют вам просмотр таблицы данных с помощью функции Browse/Content :

Но что, если вы хотите видеть только несколько столбцов, просто чтобы уменьшить количество визуального беспорядка? В спреде вам придется вручную переставлять или скрывать столбцы — или, как делают некоторые глупые новички, о которых потом сожалеют: удалить ненужные столбцы.

С помощью SQL вы можете выбрать полей данных с помощью такого запроса:

 ВЫБЕРИТЕ категорию, описание, дату, время ИЗ sfpd_incidents
 905:30
 

Видео

Посмотрите, как я выполняю запрос SELECT с Sequel Pro:

Ввод текста может показаться утомительным, но компромисс заключается в том, что, будучи явным , вы избавляетесь от неуклюжих движений «щелчок-и-перетаскивание-и-нажатие-кнопки», которые неизбежно приведут к неприятным ошибкам в данных, даже для лучших из лучших. Excel-мастера; спросите об этом экономистов из Гарварда.

Это выражение извлекает столбцы. При использовании отдельно он будет извлекать буквальные или вычисляемые значения. Это не особенно интересно, пока мы не обратимся к таблиц , но давайте посмотрим, как выглядит синтаксис сам по себе:

ВЫБЕРИТЕ значение

Выполнение этого базового запроса:

 ВЫБЕРИТЕ "привет, мир";
 

Возвращает один столбец с названием "hello world" и одну строку со значением "hello world" . Здесь ничего особенного:

Запрос вычислительного оператора , например сложения двух чисел:

 ВЫБЕРИТЕ 10 + 32;
 905:30
 

– получится:

10+32
42
SELECT ряд значений/столбцов

Используйте запятые для выбора нескольких полей/значений:

 ВЫБЕРИТЕ «А», «В», 9 + 7, «Привет, мир»
 
А Б 9 + 7 Привет, мир
А Б 16 Привет, мир

ИЗ пункт

Если мы думаем о SELECT как о предложении , то наши предложения до сих пор были очень простыми. Как и в английском языке, мы усложняем наши операторы SQL с помощью предложений .

До сих пор программа SQL фактически не затрагивала наши таблицы базы данных. С помощью предложения FROM мы можем указать столбцы 9.0455 мы хотим ВЫБРАТЬ . "Грамматика" звучит так:

SELECT [имя столбца] FROM [имя таблицы]

Записано как инструкция SQL:

 ВЫБЕРИТЕ местоположение ИЗ sfpd_incidents
 

Результат:

Запрос вернет значение столбца Location для каждой строки . Если вы используете базу данных только нападений SFPD с 2003 по 2013 год, результат будет содержать 130,097 рядов.

В качестве упражнения попробуйте запросить:

 ВЫБЕРИТЕ «привет, мир» ИЗ sfpd_incidents;
 

Результат должен выглядеть так:

(снова одна строка)

привет мир
привет мир
привет мир
привет мир
…(130 097 раз)

Примечание. Скорее всего, вы никогда не будете делать что-то подобное, но стоит еще раз подчеркнуть основы ВЫБЕРИТЕ здесь.

Выбор нескольких столбцов из таблицы

Никаких сюрпризов:

 ВЫБЕРИТЕ местоположение, X, Y
ОТ sfpd_incidents
 
Местоположение х Д
300 Блок WOODSIDE AV -122.452194214 37.745666504
400 Блок НАТОМА ST -122.406684875 37.781009674
300 Блок COLUMBUS AV -122.407066345 37.798183441
300 Блок ELLIS ST -122.412330627 37.784889221
300 Блок ELLIS ST -122.412330627 37.784889221
1900 Блок JENNINGS ST -122.387695312 37. 728080750
1000 Блок SUTTER ST -122,416862488 37.788208008
400 Блок TURK ST -122,416641235 37.782432556
400 Блок TURK ST -122,416641235 37.782432556
1300 Блок НАТОМА ST -122,418441772 37.767608643
Выбор всех столбцов

Иногда вам просто нужны все столбцы таблицы. Вы могли бы сделать это вручную, например.

 ВЫБЕРИТЕ
  IncidntNum, Категория, Описание, DayOfWeek, Дата, Время, PdDistrict, Разрешение, Местоположение, X, Y
ОТ
  sfpd_incidents
 

Однако вы можете использовать звездочку в качестве сокращения для « всех столбцов »:

скв
ВЫБЕРИТЕ * ИЗ sfpd_incidents

Частые ошибки 908:20

Даже сегодня самая распространенная ошибка SQL, которую я допускаю, это:

 ВЫБЕРИТЕ IncidentNum, Категория, Описание
 

Приведенный выше оператор вернет ошибку, потому что я пропустил, какую таблицу я хочу выбрать для этих столбцов из . В графическом интерфейсе только потому, что вы выбрали таблицу, щелкнув по ней, и запрашивали ту же таблицу в течение последнего часа, не означает, что интерпретатор SQL автоматически предположит, что вы используете ту же таблицу.

Кроме того, приведенный выше запрос вызовет ошибку, потому что я написал 'IncidntNum' как 'Incid__e__ntNum'; программное обеспечение базы данных не будет делать за вас догадки, когда дело доходит до опечаток.

Имейте в виду необходимость быть явным (и повторяющимся). Это типичное поведение для языков программирования.

Заключение

Чему мы здесь научились? Не так много, просто определенный синтаксис SQL, необходимый для вывода содержимого наших таблиц данных. Но заставьте этот синтаксис заземлять , потому что наши «предложения» очень скоро станут намного более запутанными с различными типами предложений.

Упражнения
  1. Напишите запрос, который создает таблицу результатов, в которой все столбцы из sfpd_incidents , но перечислите их в алфавитном порядке .