Запросы в sql простые: SQL за 20 минут
Содержание
Общие правила (советы) написания запросов на SQL
Несмотря на то, что все реляционные СУБД имеют встроенный оптимизатор, существуют общие правила, которым стоит придерживаться при создании запросов:
1) Никогда не следует выполнять вычислений на индексированном столбце, например WHERE Amt*5 > : Value
2) Для отключения индекса следует использовать выражения: CName||”, CNum+0 или использовать функцию от значения столбца.
3) Вместо оператора OR предпочтительно использовать оператор UNION.
4) Вместо ключевых слов NOT IN лучше использовать оператор NOT EXISTS.
5) Нельзя допускать значение NULL в индексированном столбце.
6) Не следует использовать оператор LIKE, если достаточно оператора =.
7) Не следует использовать подзапросы, если можно обойтись соединением таблиц JOIN.
8) При объединении таблиц в разделе FROM запроса их следует указывать в порядке уменьшения числа выбираемых из них строк (для продукционного оптимизатора).
9) При ссылке на столбцы при объединении таблиц используйте псевдонимы таблиц.
10) Наибольшее ограничение на выборку строк в разделе WHERE должно стоять первым, если условие выборки включает оператор OR и последним, если содержит только операторы AND (для продукционного оптимизатора).
11) Алгоритмы соединения на основе индексирования производительнее, если меньшую таблицы указать левой. Она загружается в буфер оперативной памяти, а правая затем поблочно считывается для проверки соединения.
12) Используйте полный просмотр, если запрос возвращает более 20% строк из таблиц.
13) В СУБД Oracle8 можно использовать с помощью подсказки /*+INDEX_EFS*/ индексный полный просмотр (EFS), если индекс содержит все столбцы, требуемые в запросе
Простые запросы могут быть написаны самыми различными способами.
Рассмотрим запрос, возвращающий имена всех покупателей, сделавших заказы 10 марта 1990 года.
Варианты реализации запросов:
1) Запрос с объединением таблиц
SELECT DISTINCT CName FROM Customer INNER JOIN Orders ON Orders. CNum=Customer.CNum WHERE Odate=10/03/1990
2) Запрос с коррелируемым подзапросом
SELECT DISTINCT CName FROM Customer WHERE 0SELECT COUNT(*) FROM Orders WHERE Odate=10/03/1990 AND Orders.CNum=Customer.CNum)
3) Примечания
Две редакции запроса возвращают аналогичные результаты, однако, время выборки возрастает от первого запроса к второму. Надеяться, что оптимизатор все исправит, не приходится, поэтому важно изначально создавать «правильные» редакции запросов.
Комментарии запрещены.
mysql — Вложенный SQl запрос, как правильно составить?
Вопрос задан
Изменён
5 лет 8 месяцев назад
Просмотрен
1k раза
Задача:
Получить количество лайков и подписок через один запрос.
Подписки и лайки хранятся в отношении многие к многим.
Сделал отдельные запросы, которые получают кол-во лайков и подписок отдельно.
Для лайков получилось так:
select count(user_article_likes.article_id) as likes from `articles` inner join `user_article_likes` on `user_article_likes`.`article_id` = `articles`.`id` group by `articles`.`id`;
Для подписок получилось так:
select count(subscribed_user_articles.article_id) as subscribed from `articles` inner join `subscribed_user_articles` on `subscribed_user_articles`.`article_id` = `articles`.`id` group by `articles`.`id`;
Из всего этого хочу получить всего лишь один запрос с выводом:
Article
— кол-во лайков
— кол-во подписок
(ну и так на каждой статье)
Пробовал так:
SELECT COUNT(subscribed_user_articles.article_id) AS subscribed, COUNT(user_article_likes.article_id) AS likes FROM `articles` INNER JOIN `subscribed_user_articles` ON `subscribed_user_articles`.`article_id` = `articles`. `id` INNER JOIN `user_articles_likes` ON `user_articles_likes`.`article_id` = `articles`.`id` GROUP BY `articles`.`id`
И так:
select articles.id, count(distinct user_article_likes.article_id), count(distinct subscribed_user_articles.article_id) from articles left join user_article_likes on user_article_likes.article_id = articles.id left join subscribed_user_articles on subscribed_user_articles.article_id = articles.id group by articles.id
Все не то. Либо у лайков и подписок одно и тоже значение(чего быть не может, ибо показывает кол-во записей больше чем есть в БД).
Какие есть идеи? Мысли? Куда смотреть и что почитать?
- mysql
- sql
- база-данных
2
Самый простой и понятный подход будет выглядеть так:
select articles.id, (select count(user_article_likes.article_id) from user_article_likes where user_article_likes.article_id = articles.id) AS likes (select count(subscribed_user_articles. article_id) from subscribed_user_articles where subscribed_user_articles.article_id = articles.id) as subscriptions from articles order by articles.id
Ваши запросы не работают потому как когда вы создаете join, в результирующей таблице у вас получается столько строчек сколько в двух таблицах вместе взятых. Отсюда и результат.
Многие не любят вложенные запросы и часто это оправданно, все зависит от того как движок оптимизирует выполнение запроса.
Зарегистрируйтесь или войдите
Регистрация через Google
Регистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
By clicking “Отправить ответ”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.
SQLZOO
Язык:Проект:Языковая политика | Английский • 日本語 • 中文 |
---|
Учебные пособия: поэтапное изучение SQL
- 0 Основы SELECT
- Несколько простых запросов для начала работы
- 1 ВЫБЕРИТЕ имя
- Некоторые запросы на сопоставление с образцом
- 2 ВЫБЕРИТЕ из мира
- В котором мы запрашиваем таблицу профилей стран мира.
- 3 ВЫБЕРИТЕ из Нобеля
- Дополнительная практика основных функций с использованием таблицы Нобелевских лауреатов.
- 4 ВЫБОР внутри ВЫБОР
- В котором мы формируем запросы, используя другие запросы.
- 5 СУММ и СЧЕТ
- В котором мы применяем агрегатные функции. больше того же
- 6 ПРИСОЕДИНЯЙТЕСЬ
- В котором мы соединяем две таблицы; игра и голы. ранее музыкальный учебник
- 7 Дополнительные операции JOIN
- В котором мы присоединяем актеров к фильмам в базе данных фильмов.
- 8 Использование нуля
- В котором мы смотрим на преподавателей на факультетах. ранее шотландский парламент
- 8+ числовых примеров
- В котором мы смотрим на опрос и занимаемся более сложными расчетами.
- 9- Функция окна
- , в котором мы изучаем результаты всеобщих выборов в Великобритании.
- 9+ COVID 19
- В котором мы измеряем влияние COVID-19
- 9 Самостоятельное соединение
- В котором мы соединяем автобусные маршруты Эдинбурга с автобусными маршрутами Эдинбурга.
- 10 обучающих викторин
- Проверьте свои знания с помощью викторин с несколькими вариантами ответов
- 11 Записи учащихся учебника
- Создание базы данных
- 12 Учебник DDL
- Инструкции по импорту данных и их анализу в mysql
Ссылка: как.
..
- 1 SELECT
- Как прочитать данные из базы данных.
- 2 СОЗДАТЬ И УДАЛИТЬ
- Как создавать таблицы, индексы, представления и прочее. Как от них избавиться.
- 3 ВСТАВИТЬ и УДАЛИТЬ
- Как вносить записи в таблицу, изменять их и как снова вынимать.
- 4 ДАТА и ВРЕМЯ
- Как работать с датами; сложение, вычитание и форматирование.
- 5 функций
- Как использовать строковые функции, логические функции и математические функции.
- 6 пользователей
- Как создавать пользователей, ПРЕДОСТАВЛЯТЬ и ЗАПРЕЩАТЬ доступ, получать доступ к чужим столам. Как найти процессы и убить их.
- 7 Метаданные
- Как узнать, какие таблицы и столбцы существуют. Как подсчитать и ограничить возврат строк.
- 8 взломов SQL
- Some SQL Hacks, взятые из «SQL Hacks», опубликованного O’Reilly
- 9 Использование SQL с PHP на серверах Amazon EC2
- Видеоуроки, показывающие, как запускать MySQL, PHP и Apache на облачных серверах Amazon EC2.
- Упрощенные инструкции для студентов, изучающих модуль INF08104 в Эдинбургском университете Нейпира
- 10 Введение в транзакции
- Видеоуроки, показывающие, как сеансы могут мешать друг другу и как это остановить.
- 11 Использование SQL с C#
- Код для подключения к базе данных в Visual Studio.
Тесты: дополнительные примеры для уверенных пользователей
Каждый тест включает 15 простых, средних и сложных вопросов.
- Модуль обратной связи
- ответов учащихся об их опыте обучения.
- Справочная служба
- Звонки в службу поддержки
- Гостевой дом
- Управление бронированием отеля
- Приключенческие работы
- Пример на основе оптового продавца (на основе образца базы данных Microsoft)
- Расписания университетов
- Расписание лекций и практических занятий
- Музыканты
- Группы, Концерты, Представления
- Портниха
- Изготовление и заказ платьев
- Плата за перегрузку
- Мониторинг и зарядка автомобилей, въезжающих и выезжающих из Лондона
Проблемы
- Белое Рождество
Ресурсы SQL
- NoSQL Mongo
- Выберите основы — ответы
- Выбрать из мира — ответы
- Посмотрите, сможете ли вы определить шаблон
- Руководства пользователя SQL
- MimerMySQL Oracle SQL Server Access DB2 Sybase Postgres SQLite
- Онлайн-копии руководств пользователя по конкретным реализациям.
- Запуск SQL
- [ MySQL | Оракул | SQL-сервер | БД2 | Постгрес | Энгр]
- Как подключиться к серверу и выполнить операторы SQL.
- Программирование с помощью SQL
- [ SQL в Perl в Интернете | SQL из Java]
- Сообщения об ошибках
- Некоторые сообщения об ошибках от механизмов SQL
- Раздел «Временная оценка» до закрытия главного меню.
- Оценка Temp
Список дел
запросов sql для практики | расширенные запросы sql
Автор: — Иша Малхотра
- Вопрос интервью SQL
- Технический Альтум
SQL-запросы с ответом
В этом уроке я представляю некоторые запросов sql с ответом . Это поможет всем улучшить свои навыки sql. Эти SQL-запросы делятся на две части. В первой части я обсудил основных запросов sql с ответами. во второй части я обсудил вложенных запросов .
Для этого урока я использую следующие таблицы: —
Имя таблицы: — Сотрудник
Empid | EmpName | Отдел | ContactNo | EmailId | EmpHeadId |
---|---|---|---|---|---|
101 | Иша | E-101 | 1234567890 | [email protected] | 105 |
102 | Прия | E-104 | 1234567890 | [email protected] | 103 |
103 | Неха | E-101 | 1234567890 | [email protected] | 101 |
104 | Рахул | E-102 | 1234567890 | [email protected] | 105 |
105 | Абхишек | E-101 | 1234567890 | [email protected] | 102 |
Схема:-
создать таблицу сотрудников (empid int первичный ключ, empname varchar (100), отдел varchar (50), contactno bigint, emaildid varchar (100), empheadid int)
Таблица :- EmpDept
DeptId | DeptName | Dept_off | DeptHead |
---|---|---|---|
E-101 | ЧАС | Понедельник | 105 |
E-102 | Разработка | Вторник | 101 |
E-103 | Жилищное хозяйство | Суббота | 103 |
E-104 | Продажа | Воскресенье | 104 |
E-105 | Покупка | Вторник | 104 |
Схема:-
создать таблицу empdept(deptid varchar(50) первичный ключ,deptname varchar(100), dept_off varchar(100), deepead int ссылки на внешние ключи employee(empid))
Таблица: — Оклад
EmpId | Зарплата | Постоянная |
---|---|---|
101 | 2000 | Да |
102 | 10000 | Да |
103 | 5000 | № |
104 | 1900 | Да |
105 | 2300 | Да |
Схема:-
создать таблицу empsalary (empid int ссылки на внешние ключи employee (empid), зарплата bigint, ispermanent varchar (3))
Таблица :- Проект
Идентификатор проекта | Продолжительность |
---|---|
стр-1 | 23 |
стр-2 | 15 |
стр-3 | 45 |
стр-4 | 2 |
стр-5 | 30 |
Схема:-
создать табличный проект (projectid varchar (50) первичный ключ, продолжительность int)
Таблица :- Страна
идентификатор | псевдоним |
---|---|
c-1 | Индия |
c-2 | США |
с-3 | Китай |
c-4 | Пакистан |
с-5 | Россия |
Схема:-
создать таблицу страны (первичный ключ cid varchar (50), cname varchar (100))
Таблица :- ClientTable
ClientId | ClientName | cid |
---|---|---|
кл-1 | ABC Group | кл-1 |
кл-2 | PQR | кл-1 |
класс-3 | XYZ | класс-2 |
класс-4 | технический альтум | класс-3 |
кл-5 | мнп | кл-5 |
Схема:-
создать таблицу clienttable (первичный ключ clientid varchar (50), clientname varchar (100), cid varchar (50) ссылается на страну (cid))
Таблица: — EmpProject
EmpId | ProjectId | ClientID | StartYear | EndYear |
---|---|---|---|---|
101 | р-1 | Кл-1 | 2010 | 2010 |
102 | р-2 | Кл-2 | 2010 | 2012 |
103 | р-1 | Кл-3 | 2013 | |
104 | р-4 | Кл-1 | 2014 | 2015 |
105 | р-4 | Кл-5 | 2015 |
Схема:-
создать таблицу empproject (empid int ссылки на внешние ключи employee (empid), projectid varchar (50) ссылки на внешние ключи project (projectid), clientid varchar (50) ссылки на внешние ключи clienttable (clientid), startyear int, endyear int)
Запросы:-
Простые запросы
1.
Выберите сведения о сотруднике, имя которого начинается с P.
выберите * из сотрудника, где empname как «p%» выход:-
2. Сколько постоянных кандидатов берут зарплату больше 5000.
выберите количество (зарплата) как количество из empsalary, где ispermanent = 'да' и зарплата> 5000 выход:-
3. Выберите сведения о сотруднике, чей адрес электронной почты указан в gmail.
выберите * у сотрудника, где электронная почта похожа на «%@gmail.com» выход:-
4. Выберите сведения о сотруднике, который работает в отделе E-104 или E-102.
выберите * из сотрудника, где отдел = «E-102» или отдел = «E-104» или выберите * у сотрудника, где находится отдел ('E-102','E-104') выход:-
5. Как называется отдел для DeptID E-102?
выберите имя отдела из empdept, где deptid = 'E-102' выход:-
6. Какая общая заработная плата выплачивается постоянным сотрудникам?
выберите сумму (зарплату) в качестве зарплаты из empsalary, где ispermanent = 'да' выход:-
7.
Перечислите имена всех сотрудников, чьи имена заканчиваются на a.
выберите * из сотрудника, где empname как «%a» выход:-
8. Укажите количество сотрудников отдела в каждом проекте.
выберите количество (empid) в качестве сотрудника, идентификатор проекта из группы empproject по идентификатору проекта выход:-
9. Сколько проектов было начато в 2010 году.
выберите count(projectid) в качестве проекта из empproject, где startyear=2010 выход:-
10. Сколько проектов было начато и завершено в одном и том же году.
выберите count (projectid) в качестве проекта из empproject, где startyear = endyear выход:-
11. выберите имя сотрудника, в имени которого третий символ — «h».
выберите * из сотрудника, где empname как «__h%» выход:-
Вложенные запросы
1. Выберите название отдела компании, которое назначено сотруднику, чей идентификатор больше 103.
выберите имя отдела из empdept, где находится deptid (выберите отдел из сотрудника, где empid > 103) выход:-
2. Выберите имя сотрудника, который работает под началом Абхишека.
выберите empname от сотрудника, где empheadid = (выберите empid от сотрудника, где empname = 'abhishek') выход:-
3. Выберите имя сотрудника, который является начальником отдела кадров.
выберите empname из сотрудника, где empid = (выберите deepead из empdept, где deptname = 'hr') выход:-
4. Выберите имя руководителя сотрудника, который является постоянным.
выберите empname из сотрудника, где empid in (выберите empheadid из сотрудника) и empid in (выберите empid из empsalary, где ispermanent = 'да') выход:-
5. Выберите имя и адрес электронной почты руководителя отдела, который не является постоянным.
выберите empname, emaildid от сотрудника, где empid (выберите depthead из empdept) и empid (выберите empid из empsalary, где ispermanent = 'нет') выход:-