База данных Общие вопросы интервью (разработчик)
Что такое хранимая процедура? Какие преимущества и недостатки?
Что такое хранимая процедура? Какие преимущества и недостатки?
Хранимые процедуры похожи на функции нашего языка программирования, инкапсулирующие наш код (PLSQL, T-SQL)..
Преимущества хранимых процедур:
- Возможность инкапсулировать код
- хранится в базе данных
- Пусть язык программирования сделает вызов
- Хранимая процедура представляет собой предварительно скомпилированный блок кода, выполнение которого более эффективно.
- Хранимая процедура заменяет большое количество операторов T_SQL, что может уменьшить сетевой трафик и повысить скорость связи.
Недостатки хранимых процедур:
- Синтаксис хранимых процедур каждой базы данных почти разный, что очень сложно поддерживать (не универсальный)
- Бизнес-логика размещена в базе данных, и ее сложно повторять
Какие три парадигмы
Какие три парадигмы
Первая нормальная форма (1NF): все поля в таблице базы данных являются отдельными атрибутами и не могут быть разделены. Этот единственный атрибут состоит из основных типов, включая целые, действительные, символьные, логические, даты и т. д. Вторая нормальная форма (2NF): нет частичной функциональной зависимости неключевого поля от любого ключевого поля-кандидата в таблице базы данных (частичная функциональная зависимость относится к ситуации, когда некоторые поля в комбинированном ключе определяют неключевое поле). , то есть все неключевые поля полностью зависят от любого набора ключевых слов-кандидатов.
Третья нормальная форма (3NF): на основе второй нормальной формы, если нет зависимости передаточной функции неключевого поля от любого потенциального ключевого поля в таблице данных, это соответствует третьей нормальной форме. Так называемая зависимость передаточной функции означает, что если существует решающее отношение «A → B → C», то передаточная функция C зависит от A. Следовательно, таблица базы данных, удовлетворяющая третьей нормальной форме, не должна иметь следующих зависимостей: ключевое поле → неключевое поле x → неключевое поле y
Мы, конечно, не понимаем приведенный выше текст и не хотим его читать. Далее резюмирую:
- Первое, что должно быть ясно, это:Если выполняется третья нормальная форма, то должна выполняться и вторая нормальная форма, если выполняется вторая нормальная форма, то должна выполняться и первая нормальная форма.
- Первая нормальная форма:Поле – это наименьшая единица, которую нельзя разделить
- Информация о студентах формирует таблицу информации о студентах, которая состоит из возраста, пола, студенческого билета и другой информации. Ни одно из этих полей не может быть разделено, поэтому оно находится в первой нормальной форме.
- Вторая нормальная форма: Удовлетворить первой нормальной форме,Поля в таблице должны полностью зависеть от всего первичного ключа, а не от части первичного ключа.
- Этот ряд записей, состоящий из других полей и первичного ключа, представляет одно и то же, а первичный ключ уникален, им нужно только зависеть от первичного ключа, и они становятся уникальными.
- Студенту с номером 1024, которого зовут Java3y, 22 года. Поля имени и возраста зависят от первичного ключа идентификатора учащегося.
- Третья нормальная форма: удовлетворить второй нормальной форме,Все поля, кроме первичного ключа, должны быть независимы друг от друга.
- То есть данные хранятся только в одном месте и не появляются повторно в нескольких таблицах, что можно рассматривать как устранение транзитивных зависимостей.
- Например, наш университет разделен на множество факультетов (китайский факультет, английский факультет, компьютерный факультет...), а информация в таблице управления факультетом состоит из следующих полей: номер факультета, заведующий кафедрой, профиль кафедры и структура кафедры. Тогда можем ли мы добавить поля номера отдела, руководителя отдела, профиля отдела и структуры отдела в таблицу информации о студентах? Нет, потому что это избыточно, а поля вне первичного ключа образуют зависимость (в зависимости от таблицы информации о студентах)! Правильный способ: таблица студентов может добавить только одно поле номера отдела.
Ссылка на ссылку:
Что такое представление? И каковы сценарии использования представлений?
Что такое представление? И каковы сценарии использования представлений?
Представление основано на таблице данных.виртуальный стол
- (1) Представление — это виртуальная таблица.
- (2) Представления строятся на основе существующих таблиц, и эти таблицы, на которых строятся представления, называются базовыми таблицами.
- (3)Оператор, предоставляющий содержимое данных представлению, — это оператор SELECT, а представление можно понимать как сохраненный оператор SELECT.
- (4) Представления предоставляют пользователям другое представление данных базовой таблицы.
- (5) Представление не хранит реальные данные, реальные данные по-прежнему хранятся в базовой таблице.
- (6) Хотя программист работает с представлением, окончательное представление также будет преобразовано в рабочую базовую таблицу.
- (7) Базовая таблица может иметь 0 или более представлений
Иногда мы можем относиться только к некоторым полям в таблице данных, в то время как другие относятся только к некоторым полям той же таблицы данных...
Тогда неразумно показывать им все поля.
Мы должны сделать:Какие данные они хотят видеть, мы даем им какие данные... С одной стороны, мы можем позволить им обращать внимание только на свои собственные данные, с другой стороны, мы также гарантируем, что некоторые конфиденциальные данные в техпаспорт не просочится...
Когда мы запрашиваем данные, нам часто приходится писать очень длинные операторы SQL, почти каждый раз нам приходится писать очень долго и очень долго... Как упоминалось выше,Представление — это виртуальная таблица на основе запроса, то есть представление может инкапсулировать запрошенные данные. . . Тогда это будет очень удобно, когда мы будем использовать его...
Стоит отметить, что:Использование представлений позволяет нам сосредоточиться и логику, но не повышает эффективность запросов.
В каких сценариях используются отбрасывание, удаление и усечение?
В каких сценариях используются отбрасывание, удаление и усечение?
Сравним их отличия:
drop table
- 1) Принадлежит ДДЛ
- 2) Без отката
- 3) не могу принести куда
- 4) Удаление содержимого и структуры таблицы
- 5) Быстрая скорость удаления
truncate table
- 1) Принадлежит ДДЛ
- 2) Без отката
- 3) не могу принести куда
- 4) Удалить содержимое таблицы
- 5) Быстрая скорость удаления
delete from
-
1) Принадлежит ДМЛ
-
2) можно откатить
-
3) может принести куда
-
4) Структура таблицы есть, а содержимое таблицы зависит от исполнения где
-
5) Скорость удаления низкая и нужно удалять построчно
-
Когда вам больше не нужна таблица, используйте drop
-
Если вы хотите удалить некоторые строки данных, используйте удаление с предложением where
-
Используйте усечение, чтобы сохранить таблицу и удалить все данные
Что такое индекс? Какие преимущества и недостатки?
Что такое индекс? Какие преимущества и недостатки?
Что такое индекс [Индекс]
- (1)Это механизм быстрого поиска содержимого таблицы, аналогичный каталогу словаря Синьхуа.
- (2)Применяется к некоторым полям в таблице, но сохраняется независимо от таблицы
Индексная таблица приводит данные в порядок....
Быстро найти файлы данных на жестком диске...
функции rowid
Особенности rowid
- (1) Расположен в каждой таблице, но не виден на поверхности, например: desc emp невидим
- (2) Только в селекте отображается и пишется rowid, чтобы его было видно
- (3) Он привязан к каждой таблице, таблица мертва, идентификатор строки таблицы мертв, номер строки двух таблиц может быть одинаковым, но идентификатор строки должен быть уникальным.
- (4) rowid представляет собой смесь 18 прописных и строчных цифр, которая однозначно представляет позицию записи в файле DBF.
- (5) Если rowid может участвовать в сравнении =/like, используйте одинарные кавычки, чтобы заключить значение rowid с учетом регистра.
- (6) rowid является связующим звеном между таблицей контактов и файлом DBF.
Функции указателя
Функции указателя
- (1) После того, как индекс установлен, система управления Oracle автоматически поддерживает его, и система управления Oracle решает, когда использовать индекс.
- (2) Пользователю не нужно указывать, какой индекс использовать в операторе запроса.
- (3)После определения первичного ключа или ограничения уникальности система автоматически создает индекс для соответствующего столбца.
- (4) Пользователи также могут добавлять индексы к указанному одному полю или нескольким полям в соответствии со своими потребностями.
нужно знать, это:Oracle автоматически управляет индексами для нас, и если мы укажем первичный ключ или уникальное ограничение, система автоматически создаст индекс для соответствующего столбца...
Когда [к] создать индекс
- (1) Таблицы часто выбираются
- (2) Таблица очень большая (слишком много записей), и содержимое записей широко распространено
- (3) Имена столбцов часто появляются в предложениях WHERE или условиях соединения.
Когда [НЕ] создавать индекс
- (1) Таблицы часто представляют собой операции INSERT/UPDATE/DELETE.
- (2) Таблица очень маленькая (очень мало записей)
- (3) Имена столбцов не часто появляются в качестве условий соединения или в предложениях WHERE.
Плюсы и минусы индекса:
- Индексы ускоряют поиск в базе данных
- Индексы замедляют задачи обслуживания, такие как вставка, удаление, изменение и т. д. (Хотя индексы могут повысить скорость запросов, они также могут привести к снижению производительности систем баз данных, обновляющих данные,Поскольку для большинства обновлений данных требуется одновременное обновление индекса.)
- Уникальный индекс может гарантировать уникальность каждой строки данных. С его помощью в процессе запроса можно использовать средство оптимизации оптимизации для повышения производительности системы.
- Для индексов требуется физическое пространство и пространство для данных
Классификация индекса:
- уникальный индекс: Уникальные индексы не позволяют двум строкам иметь одинаковое значение индекса.
- индекс первичного ключа: определение первичного ключа для таблицы автоматически создаст индекс первичного ключа, который представляет собой особый тип уникального индекса. Индекс первичного ключа требует, чтобы каждое значение в первичном ключе было уникальным и не могло быть нулевым.
- кластеризованный индекс(кластеризованный): физический порядок строк в таблице совпадает с логическим (индексным) порядком значений ключа, и в каждой таблице может быть только один
- некластеризованный индекс(Некластеризованный): некластеризованный индекс определяет логический порядок таблицы. Данные хранятся в одном месте, а индекс — в другом, и индекс содержит указатели на то, где хранятся данные. Их может быть несколько, меньше 249
Для более глубокого понимания индекса, пожалуйста, обратитесь к:
Что такое транзакция?
Что такое транзакция?
Транзакции просто:Все операции в сеансе либо выполняются успешно, либо терпят неудачу одновременно.
ACID — четыре основных элемента для правильного выполнения транзакций базы данных
- Включите: Атомарность, Согласованность, Изоляцию, Долговечность.
Система баз данных, поддерживающая транзакции, должна обладать этими четырьмя характеристиками, иначе нельзя гарантировать правильность данных в процессе транзакции, и процесс транзакции может не достичь транзакции.
Например:A переводит деньги B. Если в процессе перевода возникла проблема, транзакция может восстановить данные до исходных [деньги на счете A не изменились, и деньги на счете B не изменились].
Описание случая:
/*
* 我们来模拟A向B账号转账的场景
* A和B账户都有1000块,现在我让A账户向B账号转500块钱
*
* */
//JDBC默认的情况下是关闭事务的,下面我们看看关闭事务去操作转账操作有什么问题
//A账户减去500块
String sql = "UPDATE a SET money=money-500 ";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.executeUpdate();
//B账户多了500块
String sql2 = "UPDATE b SET money=money+500";
preparedStatement = connection.prepareStatement(sql2);
preparedStatement.executeUpdate();
Из вышесказанного мы действительно можем обнаружить, что передача от A к B прошла успешно. Но **Что делать, если в процессе перевода из пункта А в пункт Б возникают проблемы? **Смоделируйте ниже
//A账户减去500块
String sql = "UPDATE a SET money=money-500 ";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.executeUpdate();
//这里模拟出现问题
int a = 3 / 0;
String sql2 = "UPDATE b SET money=money+500";
preparedStatement = connection.prepareStatement(sql2);
preparedStatement.executeUpdate();
Очевидно, вышеизложенноекод выдает исключения, давайте снова запросим данные.Счет А теряет 500 юаней, но деньги на счете Б не увеличиваются.Это явно неразумно.
Мы можем решить вышеуказанные проблемы с помощью транзакций
//开启事务,对数据的操作就不会立即生效。
connection.setAutoCommit(false);
//A账户减去500块
String sql = "UPDATE a SET money=money-500 ";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.executeUpdate();
//在转账过程中出现问题
int a = 3 / 0;
//B账户多500块
String sql2 = "UPDATE b SET money=money+500";
preparedStatement = connection.prepareStatement(sql2);
preparedStatement.executeUpdate();
//如果程序能执行到这里,没有抛出异常,我们就提交数据
connection.commit();
//关闭事务【自动提交】
connection.setAutoCommit(true);
} catch (SQLException e) {
try {
//如果出现了异常,就会进到这里来,我们就把事务回滚【将数据变成原来那样】
connection.rollback();
//关闭事务【自动提交】
connection.setAutoCommit(true);
} catch (SQLException e1) {
e1.printStackTrace();
}
Вышеуказанная программа также выдает исключение, деньги на счете A не уменьшаются, а деньги на счете B не увеличиваются.
Примечание. Когда Connection сталкивается с необработанным SQLException, система аварийно завершает работу, и транзакция автоматически откатывается, ноЕсли программа перехватывает исключение, ей необходимо явно откатить транзакцию в перехвате.
Уровень изоляции транзакции
База данных определяет 4 уровня изоляции:
- Сериализуемый [избегает грязных чтений, неповторяемых чтений, виртуальных чтений]
- Повторяемое чтение [избегайте грязного чтения, неповторяемого чтения]
- Чтение зафиксировано [чтобы избежать грязных чтений]
- Читать незафиксированные [Самый низкий уровень, ничего нельзя избежать]
Соответствует четырем константам в классе Connection
- TRANSACTION_READ_UNCOMMITTED
- TRANSACTION_READ_COMMITTED
- TRANSACTION_REPEATABLE_READ
- TRANSACTION_SERIALIZABLE
Грязное чтение:Транзакция считывает незафиксированные данные из другой транзакции
Пример: A переводит деньги B,A выполняет заявление о переводе, но A еще не отправил транзакцию, B считывает данные и обнаруживает, что на его счету больше денег.! Б сказал А, что я получил деньги. А откатывает транзакцию [rollback], а когда Б снова проверяет деньги на счету, то обнаруживает, что денег мало.
Неповторимое чтение:Транзакция считывает данные, которые были зафиксированы другой транзакцией, что означает, что транзакция может видеть изменения, сделанные другими транзакциями.
Примечание:A запрашивает базу данных для получения данных, а B изменяет данные в базе данных, что приводит к различным результатам нескольких запросов A к базе данных. 】
Виртуальное чтение (фантомное чтение):Это означает, что данные, вставленные другими транзакциями, считываются внутри транзакции, что приводит к непоследовательному чтению до и после.
Примечание:Подобно неповторяемому чтению, но виртуальное чтение (фантомное чтение) будет считывать данные, вставленные другими транзакциями, что приводит к непоследовательному чтению до и после
Краткое содержание:Грязное чтение недопустимо, неповторяемое чтение и виртуальное чтение возможны при определенных обстоятельствах [ведение статистики не должно работать].
Что такое оптимистическая блокировка и пессимистическая блокировка базы данных?
Что такое оптимистическая блокировка и пессимистическая блокировка базы данных?
Чтобы изоляция и единство транзакций и единство базы данных не нарушались, когда несколько транзакций одновременно обращаются к одним и тем же данным в базе данных,Оптимистическая блокировка и пессимистическая блокировка являются основными техническими средствами, используемыми для управления параллелизмом.
- Пессимистическая блокировка: предполагается, что будут возникать конфликты параллелизма, блокируя все операции, которые могут нарушить целостность данных.
- Блокировать транзакцию при запросе данных, пока транзакция не будет зафиксирована
- Метод реализации: использовать механизм блокировки в базе данных
- Оптимистическая блокировка: если предположить, что конфликтов параллелизма не возникнет, проверка нарушений целостности данных выполняется только при фиксации операции.
- Блокировать транзакцию при изменении данных и блокировать ее по версии
- Реализация: использовать версию или отметку времени
Пессимистический замок:
Оптимистичная блокировка:
Использованная литература:
Что такое суперключ, ключ-кандидат, первичный ключ и внешний ключ?
Что такое суперключ, ключ-кандидат, первичный ключ и внешний ключ?
- Супер ключ:Набор атрибутов, однозначно идентифицирующих кортеж в отношении, называется суперключом реляционной схемы.. Атрибут можно использовать в качестве суперключа, а несколько атрибутов также можно комбинировать в качестве суперключа.Суперключ содержит ключ-кандидат и первичный ключ.
- Ключ-кандидат (ключ-кандидат): это наименьший суперключ, то есть суперключ без избыточных элементов..
- Первичный ключ (primary key): комбинация столбцов данных или атрибутов в таблице базы данных, однозначно и полностью идентифицирующая хранимый объект данных.. Столбец данных может иметь только один первичный ключ, и значение первичного ключа не может отсутствовать, то есть оно не может быть нулевым.
- Внешний ключ: первичный ключ другой таблицы, которая существует в одной таблице, называется внешним ключом этой таблицы..
Ключ-кандидат и первичный ключ:
Пример: почтовый адрес (название города, название улицы, почтовый индекс, название подразделения, получатель)
- У него есть два ключа-кандидата: {название города, название улицы} и {название улицы, почтовый индекс}.
- Если я выберу {название города, название улицы} в качестве атрибута, однозначно идентифицирующего объект, тогда {название города, название улицы} будет первичным ключом (первичным ключом)
Какие виды ограничений SQL существуют?
Какие виды ограничений SQL существуют?
- NOT NULL: содержимое поля управления не должно быть пустым (NULL).
- UNIQUE: содержимое управляющего поля не может повторяться, и таблица может иметь несколько уникальных ограничений.
- ПЕРВИЧНЫЙ КЛЮЧ: он также используется для содержимого поля управления и не может повторяться, но может появляться в таблице только один раз.
- ВНЕШНИЙ КЛЮЧ: Он используется для предотвращения действий, которые нарушают соединение между таблицами, а также предотвращает вставку недопустимых данных в столбец внешнего ключа, поскольку он должен быть одним из значений в таблице, на которую он указывает.
- ПРОВЕРКА: используется для контроля диапазона значений поля.
В каком состоянии работает база данных, чтобы предотвратить потерю данных?
В каком состоянии работает база данных, чтобы предотвратить потерю данных?
В режиме archivelog (режим архива) до тех пор, пока файлы архивного журнала не будут потеряны, можно эффективно предотвратить потерю данных.
Механизм хранения MySQL
Механизмы хранения Mysql следующие:
У меня версия 5.7.15, а версия по умолчанию — Innodb!
Обычно используемые механизмы хранения следующие:
- Иннодб двигатель, механизм Innodb обеспечивает поддержку ACID-транзакций базы данных. А также обеспечивает блокировку на уровне строк и ограничения внешнего ключа. Он предназначен для работы с системами баз данных с большими объемами данных.
- Двигатель MyIASM(Первоначально движок Mysql по умолчанию), он не обеспечивает поддержку транзакций, а также не поддерживает блокировки на уровне строк и внешние ключи.
- ПАМЯТЬ двигателя: Все данные находятся в памяти, скорость обработки данных высокая, но безопасность невысокая.
Одна и та же база данных может также использовать таблицы из нескольких механизмов хранения.Если модификация таблицы требует относительно высокой обработки транзакций, вы можете выбрать InnoDB. В этой базе данных хранилище MyISAM может быть выбрано для таблиц с высокими требованиями к запросам. Если базе данных требуется временная таблица для запросов, вы можете выбрать механизм хранения MEMORY..
Использованная литература:
- woo woo woo.cn блог на.com/children you...
- blog.CSDN.net/Учитель 5718/Арити…
- blog.CSDN.net/He 146 Lala 128 small…
Какова структура данных индексов, используемых механизмами MyIASM и Innodb?
Какова структура данных индексов, используемых механизмами MyIASM и Innodb?
Ответ: Все они B+ деревья!
Механизм MyIASM, содержимое, хранящееся в структуре данных дерева B+, на самом деле является значением адреса фактических данных. То есть его индекс и фактические данные разделены,Просто используйте индекс, чтобы указать на фактические данные. Модель такого индекса называется некластеризованным индексом.
Структура данных индекса механизма Innodb также представляет собой дерево B+.Просто фактические данные хранятся в структуре данных.Такой тип индекса называется кластерным индексом..
Разница между varchar и char
Разница между varchar и char
Char — тип фиксированной длины, varchar — тип переменной длины.
Какие таблицы относятся к разрешениям в mysql
Какие таблицы относятся к разрешениям в mysql
Сервер MySQL контролирует доступ пользователей к базе данных через таблицу разрешений, которая хранится в базе данных mysql и инициализируется сценарием mysql_install_db. Этими таблицами привилегий являются user, db, table_priv, columns_priv и host. Структура и содержание этих таблиц описаны ниже:
- Таблица разрешений пользователей: записывает информацию об учетной записи пользователя, которой разрешено подключение к серверу, а разрешения в ней находятся на глобальном уровне.
- таблица разрешений базы данных: запишите разрешения на операции каждой учетной записи в каждой базе данных.
- таблица разрешений table_priv: записывает разрешения операций на уровне таблицы данных.
- Таблица разрешений columns_priv: записывает разрешения операций на уровне столбцов данных.
- Таблица разрешений хоста: взаимодействуйте с таблицей разрешений базы данных для более подробного управления разрешениями операций на уровне базы данных на данном хосте. На эту таблицу разрешений не влияют операторы GRANT и REVOKE.
Каковы способы восстановления поврежденного листа данных?
Каковы способы восстановления поврежденного листа данных?
Используйте myisamchk для исправления конкретных шагов:
- 1) Остановите службу mysql перед восстановлением.
- 2) Откройте режим командной строки, а затем войдите в каталог /bin mysql.
- 3) Выполнить myisamchk – восстановить путь, где находится база данных/*.MYI
Используйте таблицу восстановления или команду OPTIMIZE таблицы для восстановления, REPAIR TABLE имя_таблицы таблица восстановления OPTIMIZE TABLE имя_таблицы таблица оптимизации REPAIR TABLE используется для восстановления поврежденной таблицы. OPTIMIZE TABLE используется для высвобождения свободного места в базе данных. Когда строки данных в таблице удаляются, занятое место на диске не высвобождается немедленно. После использования команды OPTIMIZE TABLE эти пространства будут высвобождены, а строки данных на диске быть восстановлены. сделать перестановку (примечание: на диске, а не в базе данных)
Блокировка строки механизма InnoDB в MySQL выполняется путем добавления
Блокировка строки механизма InnoDB в MySQL выполняется путем добавления
InnoDB завершает блокировки строк на основе индексов
пример:select * from tab_with_index where id = 1 for update
;
for update
Блокировка блокировки строки может быть выполнена на основе условий,а id — это столбец с индексным ключом,
Если id не является ключом индекса, InnoDB завершит блокировку таблицы, и параллелизм будет невозможен.
Идеи оптимизации базы данных
SQL-оптимизация
Фактически, когда мы пишем операторы SQL, порядок и стратегия написания будут влиять на производительность SQL.Хотя реализованные функции одинаковы, их производительность будет немного отличаться.
Поэтому ниже объясняется, как лучше писать при написании SQL.
① Выберите наиболее эффективный порядок имен таблиц.
Парсер для базы данных следуетИмена таблиц в предложении FROM обрабатываются справа налево, и таблица, записанная последней в предложении FROM, будет обработана первой.
В случае нескольких таблиц в предложении FROM:
- Если три таблицы совершенно не связаны между собой, запишите таблицу с наименьшим количеством записей и имен столбцов в конце и т. д.
- То есть: выберите таблицу с наименьшим количеством записей и поместите ее в конец
Если имеется более 3 таблиц, запрос на соединение:
- Если три таблицы связаны, таблица с наибольшим количеством ссылок будет помещена последней и так далее..
- То есть: таблицы, на которые ссылаются другие таблицы, размещаются последними.
Например: запросите номер сотрудника, имя, зарплату, уровень зарплаты, название отдела.
На таблицу emp ссылаются чаще всего и в ней больше всего записей, поэтому она помещается в конец предложения формы.
select emp.empno,emp.ename,emp.sal,salgrade.grade,dept.dname
from salgrade,dept,emp
where (emp.deptno = dept.deptno) and (emp.sal between salgrade.losal and salgrade.hisal)
②Порядок соединения в предложении WHERE
база данных изРазобрать предложение WHERE в порядке справа налево, по этому принципуСоединения между таблицами должны быть записаны слева от других условий WHERE.,ТеУсловия, которые могут отфильтровать максимальное количество записей, должны быть записаны справа от предложения WHERE..
emp.sal может фильтровать несколько записей, написанных в крайнем правом углу предложения WHERE.
select emp.empno,emp.ename,emp.sal,dept.dname
from dept,emp
where (emp.deptno = dept.deptno) and (emp.sal > 1500)
③ Избегайте использования * в предложении SELECT.
Когда мы учились, знак «*» мог получить все данные поля в таблице.
- Но это делается путем запроса словаря данных, а значит это займет больше времени
- Операторы SQL, написанные с помощью *, недостаточно интуитивны.
④Замените DELETE на TRUNCATE
Вот только:Удалить все записи таблицы, кроме структуры таблицы.
DELETE удаляет записи по одной, а Truncate удаляет всю таблицу и сохраняет структуру таблицы, что быстрее, чем DELETE.
⑤ Используйте больше внутренних функций для повышения эффективности SQL.
Например, использование функции mysql concat() будет быстрее, чем использование || для конкатенации, потому что функция concat() была оптимизирована mysql.
⑥ Используйте псевдонимы для таблиц или столбцов.
Если имена таблиц или столбцов слишком длинные, использование некоторых коротких псевдонимов также может немного повысить производительность SQL. Ведь длина сканируемых символов становится меньше. . .
⑦Используйте больше коммитов
comiit выпустит точку отката...
⑧ Эффективно используйте индексы
Индекс предназначен для улучшения данных нашего запроса.Когда количество записей в таблице очень велико, мы можем использовать индекс.
⑨SQL в верхнем регистре
Когда мы пишем SQL, официально рекомендуется использовать заглавные буквы для написания ключевых слов,Поскольку сервер Oracle всегда преобразует строчные буквы в прописные перед выполнением
⑩ Избегайте использования NOT в индексированных столбцах.
Потому что после того, как сервер Oracle обнаружит НЕ, он остановит текущую работу и вместо этого выполнит полное сканирование таблицы.
①①Избегайте использования вычислений в индексных столбцах.
В предложении WHEREЕсли индексированный столбец является частью функции, оптимизатор не будет использовать индекс, а будет использовать полное сканирование таблицы, что будет медленнее.
①②Использовать>=
заменять>
低效:
SELECT * FROM EMP WHERE DEPTNO > 3
首先定位到DEPTNO=3的记录并且扫描到第一个DEPT大于3的记录
高效:
SELECT * FROM EMP WHERE DEPTNO >= 4
直接跳到第一个DEPT等于4的记录
①③Используйте IN вместо OR
select * from emp where sal = 1500 or sal = 3000 or sal = 800;
select * from emp where sal in (1500,3000,800);
①④Всегда используйте первый столбец указателя
Если индекс построен на нескольких столбцах, оптимизатор решит использовать индекс только в том случае, если на его первый столбец ссылается предложение WHERE. Когда имеется ссылка только на второй столбец индекса, а на первый столбец индекса нет ссылок, оптимизатор использует полное сканирование таблицы и игнорирует индекс.
create index emp_sal_job_idex
on emp(sal,job);
----------------------------------
select *
from emp
where job != 'SALES';
上边就不使用索引了。
Оптимизация структуры базы данных
- 1) Оптимизация парадигмы: например, устранение избыточности (экономия места..)
- 2) Антипарадигмальная оптимизация: например, надлежащее добавление избыточности (уменьшение количества объединений).
- 3) Таблица разделения: вертикальное разделение и горизонтальное разделение
Оптимизация серверного оборудования
Это столько денег!
Вопросы по практике SQL
Следующие практические вопросы относятся к официальному аккаунту закадычного друга Java:
Базовая структура таблицы:
student(sno,sname,sage,ssex)学生表
course(cno,cname,tno) 课程表
sc(sno,cno,score) 成绩表
teacher(tno,tname) 教师表
тема:
101,查询课程1的成绩比课程2的成绩高的所有学生的学号
select a.sno from
(select sno,score from sc where cno=1) a,
(select sno,score from sc where cno=2) b
where a.score>b.score and a.sno=b.sno
102,查询平均成绩大于60分的同学的学号和平均成绩
select a.sno as "学号", avg(a.score) as "平均成绩"
from
(select sno,score from sc) a
group by sno having avg(a.score)>60
103,查询所有同学的学号、姓名、选课数、总成绩
select a.sno as 学号, b.sname as 姓名,
count(a.cno) as 选课数, sum(a.score) as 总成绩
from sc a, student b
where a.sno = b.sno
group by a.sno, b.sname
或者:
selectstudent.sno as 学号, student.sname as 姓名,
count(sc.cno) as 选课数, sum(score) as 总成绩
from student left Outer join sc on student.sno = sc.sno
group by student.sno, sname
104,查询姓“张”的老师的个数
selectcount(distinct(tname)) from teacher where tname like '张%‘
或者:
select tname as "姓名", count(distinct(tname)) as "人数"
from teacher
where tname like'张%'
group by tname
105,查询没学过“张三”老师课的同学的学号、姓名
select student.sno,student.sname from student
where sno not in (select distinct(sc.sno) from sc,course,teacher
where sc.cno=course.cno and teacher.tno=course.tno and teacher.tname='张三')
106,查询同时学过课程1和课程2的同学的学号、姓名
select sno, sname from student
where sno in (select sno from sc where sc.cno = 1)
and sno in (select sno from sc where sc.cno = 2)
或者:
selectc.sno, c.sname from
(select sno from sc where sc.cno = 1) a,
(select sno from sc where sc.cno = 2) b,
student c
where a.sno = b.sno and a.sno = c.sno
或者:
select student.sno,student.sname from student,sc where student.sno=sc.sno and sc.cno=1
and exists( select * from sc as sc_2 where sc_2.sno=sc.sno and sc_2.cno=2)
107,查询学过“李四”老师所教所有课程的所有同学的学号、姓名
select a.sno, a.sname from student a, sc b
where a.sno = b.sno and b.cno in
(select c.cno from course c, teacher d where c.tno = d.tno and d.tname = '李四')
或者:
select a.sno, a.sname from student a, sc b,
(select c.cno from course c, teacher d where c.tno = d.tno and d.tname = '李四') e
where a.sno = b.sno and b.cno = e.cno
108,查询课程编号1的成绩比课程编号2的成绩高的所有同学的学号、姓名
select a.sno, a.sname from student a,
(select sno, score from sc where cno = 1) b,
(select sno, score from sc where cno = 2) c
where b.score > c.score and b.sno = c.sno and a.sno = b.sno
109,查询所有课程成绩小于60分的同学的学号、姓名
select sno,sname from student
where sno not in (select distinct sno from sc where score > 60)
110,查询至少有一门课程与学号为1的同学所学课程相同的同学的学号和姓名
select distinct a.sno, a.sname
from student a, sc b
where a.sno <> 1 and a.sno=b.sno and
b.cno in (select cno from sc where sno = 1)
或者:
select s.sno,s.sname
from student s,
(select sc.sno
from sc
where sc.cno in (select sc1.cno from sc sc1 where sc1.sno=1)and sc.sno<>1
group by sc.sno)r1
where r1.sno=s.sno
111、把“sc”表中“王五”所教课的成绩都更改为此课程的平均成绩
update sc set score = (select avg(sc_2.score) from sc sc_2 wheresc_2.cno=sc.cno)
from course,teacher where course.cno=sc.cno and course.tno=teacher.tno andteacher.tname='王五'
112、查询和编号为2的同学学习的课程完全相同的其他同学学号和姓名
这一题分两步查:
1,
select sno
from sc
where sno <> 2
group by sno
having sum(cno) = (select sum(cno) from sc where sno = 2)
2,
select b.sno, b.sname
from sc a, student b
where b.sno <> 2 and a.sno = b.sno
group by b.sno, b.sname
having sum(cno) = (select sum(cno) from sc where sno = 2)
113、删除学习“王五”老师课的sc表记录
delete sc from course, teacher
where course.cno = sc.cno and course.tno = teacher.tno and tname = '王五'
114、向sc表中插入一些记录,这些记录要求符合以下条件:
将没有课程3成绩同学的该成绩补齐, 其成绩取所有学生的课程2的平均成绩
insert sc select sno, 3, (select avg(score) from sc where cno = 2)
from student
where sno not in (select sno from sc where cno = 3)
115、按平平均分从高到低显示所有学生的如下统计报表:
-- 学号,企业管理,马克思,UML,数据库,物理,课程数,平均分
select sno as 学号
,max(case when cno = 1 then score end) AS 企业管理
,max(case when cno = 2 then score end) AS 马克思
,max(case when cno = 3 then score end) AS UML
,max(case when cno = 4 then score end) AS 数据库
,max(case when cno = 5 then score end) AS 物理
,count(cno) AS 课程数
,avg(score) AS 平均分
FROM sc
GROUP by sno
ORDER by avg(score) DESC
116、查询各科成绩最高分和最低分:
以如下形式显示:课程号,最高分,最低分
select cno as 课程号, max(score) as 最高分, min(score) 最低分
from sc group by cno
select course.cno as '课程号'
,MAX(score) as '最高分'
,MIN(score) as '最低分'
from sc,course
where sc.cno=course.cno
group by course.cno
117、按各科平均成绩从低到高和及格率的百分数从高到低顺序
SELECT t.cno AS 课程号,
max(course.cname)AS 课程名,
isnull(AVG(score),0) AS 平均成绩,
100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/count(1) AS 及格率
FROM sc t, course
where t.cno = course.cno
GROUP BY t.cno
ORDER BY 及格率 desc
118、查询如下课程平均成绩和及格率的百分数(用"1行"显示):
企业管理(001),马克思(002),UML (003),数据库(004)
select
avg(case when cno = 1 then score end) as 平均分1,
avg(case when cno = 2 then score end) as 平均分2,
avg(case when cno = 3 then score end) as 平均分3,
avg(case when cno = 4 then score end) as 平均分4,
100 * sum(case when cno = 1 and score > 60 then 1 else 0 end) / sum(casewhen cno = 1 then 1 else 0 end) as 及格率1,
100 * sum(case when cno = 2 and score > 60 then 1 else 0 end) / sum(casewhen cno = 2 then 1 else 0 end) as 及格率2,
100 * sum(case when cno = 3 and score > 60 then 1 else 0 end) / sum(casewhen cno = 3 then 1 else 0 end) as 及格率3,
100 * sum(case when cno = 4 and score > 60 then 1 else 0 end) / sum(casewhen cno = 4 then 1 else 0 end) as 及格率4
from sc
119、查询不同老师所教不同课程平均分, 从高到低显示
select max(c.tname) as 教师, max(b.cname) 课程, avg(a.score) 平均分
from sc a, course b, teacher c
where a.cno = b.cno and b.tno = c.tno
group by a.cno
order by 平均分 desc
或者:
select r.tname as '教师',r.rname as '课程' , AVG(score) as '平均分'
from sc,
(select t.tname,c.cno as rcso,c.cname as rname
from teacher t ,course c
where t.tno=c.tno)r
where sc.cno=r.rcso
group by sc.cno,r.tname,r.rname
order by AVG(score) desc
120、查询如下课程成绩均在第3名到第6名之间的学生的成绩:
-- [学生ID],[学生姓名],企业管理,马克思,UML,数据库,平均成绩
select top 6 max(a.sno) 学号, max(b.sname) 姓名,
max(case when cno = 1 then score end) as 企业管理,
max(case when cno = 2 then score end) as 马克思,
max(case when cno = 3 then score end) as UML,
max(case when cno = 4 then score end) as 数据库,
avg(score) as 平均分
from sc a, student b
where a.sno not in
(select top 2 sno from sc where cno = 1 order by score desc)
and a.sno not in (select top 2 sno from sc where cno = 2 order by scoredesc)
and a.sno not in (select top 2 sno from sc where cno = 3 order by scoredesc)
and a.sno not in (select top 2 sno from sc where cno = 4 order by scoredesc)
and a.sno = b.sno
group by a.sno
Разница между Oracle и Mysql
В Mysql,Несколько библиотек могут быть созданы под одним пользователем:
В Oracle сервер Oracle состоит из двух частей.
- Экземпляр базы данных [понимается как объект, невидимый]
- База данных [понимается как класс, видимый]
Экземпляр базы данных может иметь несколько пользователей, и по умолчанию у каждого пользователя есть одно табличное пространство.
Табличное пространство — это место, где хранятся наши таблицы базы данных, и в табличном пространстве может быть несколько файлов.
Когда мы используем Oracle в качестве нашей базы данных,Нам нужно указать пользователей и табличные пространства для хранения нужных нам данных.!
Наконец
Использованная литература:
- blog.CSDN.net/157387 в моем сердце…
- blog.CSDN.net/beauty_1991…
- zhuanlan.zhihu.com/p/23713529
- blog.CSDN.net/злой вал...
- blog.CSDN.net/Температура Чжугэ/…
Если в статье есть какие-либо ошибки, пожалуйста, поправьте меня, и мы сможем общаться друг с другом. Учащиеся, привыкшие читать технические статьи в WeChat и желающие получить больше ресурсов по Java, могутОбратите внимание на публичный аккаунт WeChat: Java3y