Перейти к содержимому

Sql как выбрать все записи из таблицы

  • автор:

SQL — Урок 4. Выборка данных — оператор SELECT

Итак, в нашей БД forum есть три таблицы: users (пользователи), topics (темы) и posts (сообщения). И мы хотим посмотреть, какие данные в них содержатся. Для этого в SQL существует оператор SELECT. Синтаксис его использования следующий:

SELECT что_выбрать FROM откуда_выбрать;

Вместо «что_выбрать» мы должны указать либо имя столбца, значения которого хотим увидеть, либо имена нескольких столбцов через запятую, либо символ звездочки (*), означающий выбор всех столбцов таблицы. Вместо «откуда_выбрать» следует указать имя таблицы.

Давайте сначала посмотрим все столбцы из таблицы users:

SELECT * FROM users;

Вот и все наши данные, которые мы вносили в эту таблицу. Но предположим, что мы хотим посмотреть только столбец id_user (например, в прошлом уроке, нам надо было для заполнения таблицы topics (темы) знать, какие id_user есть в таблице users). Для этого в запросе мы укажем имя этого столбца:

SELECT id_user FROM users;

Ну, а если мы захотим посмотреть, например, имена и e-mail наших пользователей, то мы перечислим интересующие столбцы через запятую:

SELECT name, email FROM users;

Аналогично, вы можете посмотреть, какие данные содержат и другие наши таблицы. Давайте посмотрим, какие у нас существуют темы:

SELECT * FROM topics;

Сейчас у нас всего 4 темы, а если их будет 100? Хотелось бы, чтобы они выводились, например, по алфавиту. Для этого в SQL существует ключевое слово ORDER BY после которого указывается имя столбца по которому будет происходить сортировка. Синтаксис следующий:

SELECT имя_столбца FROM имя_таблицы ORDER BY имя_столбца_сортировки;

По умолчанию сортировка идет по возрастанию, но это можно изменить, добавив ключевое слово DESC

Теперь наши данные отсортированы в порядке по убыванию.

Сортировку можно производить сразу по нескольким столбцам. Например, следующий запрос отсортирует данные по столбцу topic_name, и если в этом столбце будет несколько одинаковых строк, то в столбце id_author будет осуществлена сортировка по убыванию:

Сравните результат с результатом предыдущего запроса.

Очень часто нам не нужна вся информация из таблицы. Например, мы хотим узнать, какие темы были созданы пользователем sveta (id=4). Для этого в SQL есть ключевое слово WHERE, синтаксис у такого запроса следующий:

SELECT имя_столбца FROM имя_таблицы WHERE условие;

Для нашего примера условием является идентификатор пользователя, т.е. нам нужны только те строки, в столбце id_author которых стоит 4 (идентификатор пользователя sveta):

SELECT * FROM topics WHERE id_author=4;

Или мы хотим узнать, кто создал тему «велосипеды»:

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

SELECT * FROM topics WHERE id_author=4;

SELECT * FROM topics WHERE id_author>2;

SELECT * FROM topics WHERE id_author =2;

Научись программировать на Python прямо сейчас!

  • Научись программировать на Python прямо сейчас
  • Бесплатный курс

Если этот сайт оказался вам полезен, пожалуйста, посмотрите другие наши статьи и разделы.

Как выбрать все записи из таблицы sql

Чтобы получить все записи из таблицы, используется запрос SELECT .

SELECT * FROM cars; 

Мы получим все записи из таблицы cars . * в запросе означает, что нужно выбрать все столбцы из таблицы. Если нужны только какие-то определённые, то их можно перечислить:

SELECT brand, price FROM cars; 

Как вывести все записи из одной таблицы, встречающиеся определенное количество раз в другой таблице MsSQL

Есть 2 таблицы — t1, содержащая перечень названий и их id и t2, содержащая название событий, связанных с id из первой. Во второй таблице нет названий, только id. Подскажите, как вывести перечень названий из первой таблицы, которые встречаются во второй более определенного кол-ва раз. Если не использовать Having

Отслеживать
задан 15 авг 2022 в 17:18

Количества посчитать в подзапросе, а отбор и присоединение наименований сделать во внешнем запросе. Тогда будет не HAVING, а WHERE.

15 авг 2022 в 17:28

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Можно, конечно и в WHERE подзапрос запилить, но вероятно так будет медленнее работать.

Вот запрос для вывода событий, произошедших более 5 раз:

SELECT t1.Id, Name FROM t1 JOIN ( SELECT t2.Id FROM t2 GROUP BY t2.Id HAVING COUNT(*) > 5 ) AS t2 ON t1.Id = t2.Id 

Отслеживать
ответ дан 16 авг 2022 в 2:33
Vitaliy Zlobin Vitaliy Zlobin
1,661 1 1 золотой знак 5 5 серебряных знаков 15 15 бронзовых знаков

Решение, о котором говорит @Akina

Скорее всего у автора вопроса нет необходимости оптимизировать запрос, а именно стоит конкретная задачка, без HAVING

DECLARE @NeedCount INT = 5 SELECT t1.Id, t1.Name FROM t1 INNER JOIN ( SELECT t2.Id, COUNT(*) AS cnt FROM t2 GROUP BY t2.Id ) AS t2 ON t1.Id = t2.Id WHERE t2.cnt > @NeedCount 

Отслеживать
ответ дан 16 авг 2022 в 9:49
Andrew Nikolaev Andrew Nikolaev
521 4 4 серебряных знака 9 9 бронзовых знаков
Тут видимо просто студенческая задача, потому такие условия. Иного не могу предположить)
16 авг 2022 в 13:13
Спасибо, люди добрые!! Да, дело именно в том, что задача была сделать без Хевинг)
17 авг 2022 в 15:48
@Den.di а почему нельзя использовать HAVING?
18 авг 2022 в 3:16

@Vitaliy Zlobin, вот Вы писали про оптимизатор, и то, что он может исходный запрос переписать по своему усмотрению. А есть возможность увидеть результат работы оптимизатора каким то образом? Или это незримая штука, которую можно понять только по плану выполнения?

18 авг 2022 в 7:58

@AndrewNikolaev нужно анализировать план, но не картинки, а свойство предиката для подзапроса. Либо сравнить оба плана выполнения — если одинаковые, значит оптимизатор догадался как лучше, но на него лучше не полагаться, т.е. завтра будет кривая статистика и план будет тоже другой и тоже кривой.

Предикаты ALL, DISTINCT, DISTINCTROW и TOP

Эти предикаты задают записи, выбираемые с помощью запросов SQL.

Синтаксис

SELECT [ALL | DISTINCT | DISTINCTROW | [TOP n [PERCENT]]]
FROM таблица

Инструкция SELECT, содержащая эти предикаты, состоит из следующих частей:

Используется по умолчанию, если вы не указываете ни один из предикатов. Ядро СУБД Microsoft Access выбирает все записи, которые удовлетворяют условиям в инструкции SQL. Следующие два примера эквивалентны и возвращает все записи из таблицы Employees:

SELECT ALL *
FROM Employees
ORDER BY EmployeeID;
SELECT *
FROM Employees
ORDER BY EmployeeID;

Исключает записи, содержащие повторяющиеся данные в выбранных полях. Для включения в результаты запроса значения каждого из полей, перечисленных в инструкции SELECT, должны быть уникальными. Например, у нескольких сотрудников, перечисленных в таблице Employees, могут быть одинаковые фамилии. Если две записи содержат «Глазков» в поле LastName, следующая инструкция SQL возвращает только одну запись, содержащую значение «Глазков»:

SELECT DISTINCT LastName
FROM Employees;

Если опустить DISTINCT, этот запрос возвратит обе записи с фамилией «Глазков».

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

Выходные данные запроса, использующего DISTINCT, не является обновляемыми и не отражают изменения, внесенные другими пользователями.

Данные не просто повторяют поля, но и не повторяются. Например, можно создать запрос, который соединяет таблицы Customers и Orders по полю CustomerID. Таблица «Клиенты» не содержит повторяют поля CustomerID, но таблица Orders содержит, так как у каждого клиента может быть множество заказов. В следующей SQL показано, как использовать DISTINCTROW для создания списка компаний, у кого есть хотя бы один заказ, но нет сведений об этих заказах:

SELECT DISTINCTROW CompanyName
FROM Customers INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
ORDER BY CompanyName;

Если опустить DISTINCTROW, этот запрос создаст несколько строк для каждой компании, от которой поступало более одного заказа.

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

TOP n [PERCENT]

Возвращает записи, относящиеся к верхней или нижней части диапазона, заданного предложением ORDER BY. Предположим, что вы хотите получить имена 25 лучших студентов из группы 1994 г.:

SELECT TOP 25
FirstName, LastName
FROM Students
WHERE GraduationYear = 2003
ORDER BY GradePointAverage DESC;

Если не включить предложение ORDER BY, запрос вернет из таблицы Students произвольный набор, включающий 25 записей, которые удовлетворяют предложению WHERE.

Предикат TOP не выбирает между равными значениями. Если в предыдущем примере двадцать пятый и двадцать шестой средний балл совпадают, запрос вернет 26 записей.

Вы также можете использовать зарезервированное слово PERCENT для возвращения определенного процента записей из верхней или нижней части диапазона, заданного предложением ORDER BY. Предположим, что вместо 25 лучших студентов вы хотите получить 10 процентов худших студентов группы:

SELECT TOP 10 PERCENT
FirstName, LastName
FROM Students
WHERE GraduationYear = 2003
ORDER BY GradePointAverage ASC;

Предикат ASC позволяет вернуть нижние значения. Значение после TOP должно быть целым числом без знака.

TOP не влияет на возможность обновления запроса.

Имя таблицы, из которой извлекаются записи.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *