1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-lmpythw-zh

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
ex40.md 8.1 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 06.03.2025 03:52 f9ec0dd

Упражнение 40: Чтение с помощью SQL

Исходный текст: Exercise 40: Reading with SQL

Переводчик: Феликс Ли

Лицензия: CC BY-NC-SA 4.0

Гордо использует Google Translate

В матрице CRUD вы знаете только «создание». Вы можете создавать таблицы и строки в этих таблицах. Теперь я расскажу вам, как «читать», или SELECT в SQL:

SELECT * FROM person;

SELECT name, age FROM pet;

SELECT name, age FROM pet WHERE dead = 0;

SELECT * FROM person WHERE first_name != 'Zed';

Вот что делает каждая строка:

ex5.sql:1

Это значит «выбрать все столбцы из person и вернуть все строки». Формат SELECT — это SELECT что FROM таблицы(ы) WHERE (тесты). Подзапрос WHERE является необязательным. Звездочка (*) указывает на все столбцы.

ex5.sql:3

Здесь я запрашиваю только два столбца из таблицы pet: имя и возраст. Он вернет все строки.

ex5.sql:5

Теперь я ищу те же столбцы из pet, но запрашиваю только строки, где dead = 0. Это даст мне всех живых питомцев.

ex5.sql:7

Наконец, я выбираю все столбцы из person, как в первой строке, но теперь указываю, что они не равны 'Zed'. Подзапрос WHERE определяет, какие строки будут возвращены, а какие нет.

Выбор нескольких таблицНадеюсь, вы сосредоточились на выборе данных. Всегда помните это: SQL знает только таблицы. SQL любит таблицы. SQL возвращает только таблицы. Таблицы, таблицы, таблицы, таблицы! Я повторяю это таким сумасшедшим образом, чтобы вы начали понимать, что знания, приобретённые вами в программировании, могут оказаться бесполезными. Вы работаете с графами в программировании, а в SQL — с таблицами. Эти концепции связаны, но модели мышления различаются.Вот пример того, где они отличаются. Предположим, вы хотите узнать, какие питомцы принадлежат Zed. Вам нужно написать SELECT, который будет искать в person и каким-то образом находить моих питомцев. Для этого вам придётся запросить таблицу person_pet для получения нужного столбца id. Вот мой способ сделать это:

SELECT pet.id, pet.name, pet.age, pet.dead
    FROM pet, person_pet, person
    WHERE
    pet.id = person_pet.pet_id AND
    person_pet.person_id = person.id AND
    person.first_name = "Zed";

Сейчас это может показаться сложным, но я разберу его, чтобы вы могли видеть, что он просто строит новую таблицу на основе данных из трёх таблиц и подзапроса WHERE.

```sql
SELECT pet.id, pet.name, pet.age, pet.dead
    FROM pet, person_pet, person
    WHERE
    pet.id = person_pet.pet_id AND
    person_pet.person_id = person.id AND
    person.first_name = "Zed";
````ex6.sql:1`

Я хочу получить лишь некоторые столбцы из таблицы `pet`, поэтому я указываю их в запросе `SELECT`. В прошлом упражнении вы использовали символ `*`, чтобы указать "все столбцы", но это плохая идея здесь. Вместо этого следует явно указывать каждый нужный столбец каждой таблицы с помощью конструкции `table.column`. Например, `pet.name`.

`ex6.sql:2`

Чтобы соединить таблицу `pet` с таблицей `person`, мне нужно пройти через связующую таблицу `person_pet`. В SQL это означает, что мне нужно указать все три таблицы после ключевого слова `FROM`.

`ex6.sql:3`

Начало условий в блоке `WHERE`.

`ex6.sql:4`Сначала я соединяю таблицу `pet` с таблицей `person_pet` по соответствующим столбцам идентификаторов `pet.id` и `person_pet.pet_id`.

`ex6.sql:5`

Затем я также соединяю таблицу `person` с таблицей `person_pet` аналогичным образом. Теперь база данных может просто искать строки, где значения всех указанных столбцов совпадают, то есть это будут объединённые строки.

`ex6.sql:6`

И наконец, я запрашиваю только тех питомцев, которых я сам владею, проверяя мое имя с помощью условия `person.first_name`.

## Часто задаваемые вопросы+   Напишите запрос, который выбирает всех питомцев старше 10 лет.
+   Напишите запрос, который выбирает всех людей младше вас. Затем найдите всех людей старше вас.
+   Напишите запрос, используя несколько условий в блоке `WHERE`, объединив их оператором `AND`. Например, `WHERE first_name = 'Zed' AND age > 30`.
+   Выполните другой запрос, используя три условия, и используйте операторы `AND` и `OR` для поиска строк.
+   Если вы знакомы с языками программирования, такими как Python или Ruby, это может быть удивительным способом взаимодействия с данными. Уделите время тому, чтобы использовать классы и объекты для создания такой же структуры отношений, а затем отобразите её на эту конфигурацию.
+   Выполните запрос, который выбирает всех питомцев, которых вы уже добавили.
+   Измените запрос, чтобы он использовал ваш идентификатор `person.id` вместо имени `person.name`, как это сделано здесь.
+   Обзор выходных данных выполненного запроса и убедитесь, что вы знаете, какие SQL команды создали каждую таблицу и как был получен этот вывод.## Дополнительное чтение

Прочитайте документацию по команде [SELECT](https://sqlite.org/lang_select.html) и функции [EXPLAIN QUERY PLAN](https://sqlite.org/eqp.html) для более глубокого понимания работы с SQLite3. Если вам непонятна причина того, почему SQLite3 выполняет какие-то действия, воспользуйтесь командой `EXPLAIN`.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wizardforcel-lmpythw-zh.git
git@api.gitlife.ru:oschina-mirror/wizardforcel-lmpythw-zh.git
oschina-mirror
wizardforcel-lmpythw-zh
wizardforcel-lmpythw-zh
master