MySQL

MySQL Pop Quiz #16

Короткие вопросы с довольно запутанными ответами. В рамках MySQL (и баз данных в общем).

1. Что такое character set?
2. Что такое collation?
3. Как они взаимодействуют?
4. Является ли это чем-то о чём стоит беспокоиться?

Показать ответ

Опубликовано с разрешения Carsten Pedersen. Оригинал

MySQL Pop Quiz #15

Где можно найти классные вопросы (и уловки) о синтаксисе CASE-выражений?

Показать ответ

Опубликовано с разрешения Carsten Pedersen. Оригинал

MySQL Pop Quiz #14

Дано:

SELECT * FROM car_parts:
+---------+---------+-------+--------+
| part_id |  car_id | price | weight |
+---------+---------+-------+--------+
|       1 |       1 |  2.20 |   3.00 |
|       2 |       1 |  3.30 |   5.00 |
|       3 |       1 |  4.40 |   7.00 |
|       4 |       2 |  2.20 |   9.00 |
|       5 |       2 |  3.30 |  11.00 |
|       6 |       2 |  4.40 |  13.00 |
+---------+---------+-------+--------+

Мы хотим найти самую дешёвую часьт машины и узнать сколько она весит:

SELECT car_id, MIN(price), weight
FROM parts
GROUP BY car_id;

+---------+------------+--------+
|  car_id | MIN(price) | weight |
+---------+------------+--------+
|       1 |       2.20 |   3.00 |
|       2 |       2.20 |   9.00 |
+---------+------------+--------+

Врод всё в порядке, теперь мы хотим найти самую дорогую часть каждой машины и опять же - узнать сколько она весит:

SELECT car_id, MAX(price), weight
FROM parts
GROUP BY part_of

Результат:

+---------+------------+--------+
|  car_id | MAX(price) | weight |
+---------+------------+--------+
|       1 |       4.40 |   3.00 |
|       2 |       4.40 |   9.00 |
+---------+------------+--------+

Вопрос: Почему во втором запросе содержимое колонки “weight” неверно?

Показать ответ

Опубликовано с разрешения Carsten Pedersen. Оригинал

MySQL Pop Quiz #13

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

CREATE TABLE t (
  id INT NOT NULL PRIMARY KEY,
  type INT,
  pid INT,
  FOREIGN KEY (pid) REFERENCES t (id)
) ENGINE=INNODB;

CREATE TABLE t1 (
  id INT NOT NULL PRIMARY KEY,
  type INT,
  pid INT,
  FOREIGN KEY (pid) REFERENCES t1 (id)
) ENGINE=INNODB;

Теперь когда уже таблицы созданы выполним следующие действия:

INSERT INTO t VALUES (1,1, NULL);
INSERT INTO t VALUES (2,1, NULL);
UPDATE t SET pid = 2 WHERE id = 1;

Следующим шагом добавим данные в таблицу table из таблицы t:

INSERT INTO t1 SELECT * from t;

Но тут увидим сообщение об ошибке:

ERROR 1452 : Cannot add or update a child row: a foreign key constraint fails

Вопрос №1: Почему не удалось выполнить последний запрос INSERT?

Показать ответ на вопрос №1

Вопрос №2: Что вы можете сделать что бы избежать проблемы?

Показать ответ на вопрос №2

Опубликовано с разрешения Carsten Pedersen. Оригинал

MySQL Pop Quiz #12

Имеем:

CREATE TABLE parts (
   type CHAR(10) NOT NULL,
   id MEDIUMINT NOT NULL AUTO_INCREMENT,
   description CHAR(30) NOT NULL,
   PRIMARY KEY (type, id)
) ENGINE=MyISAM;

INSERT INTO parts (type, description) VALUES
 ('car part', 'brake'),
 ('car part', 'steering wheel'),
 ('furniture', 'table leg'),
 ('printer', 'toner cartridge'),
 ('furniture', 'shelf');

Что возвратит нам следующий запрос:

SELECT DISTINCT id FROM parts;

Показать подсказку

Показать ответ

Опубликовано с разрешения Carsten Pedersen. Оригинал

MySQL Pop Quiz #11

Выполняются следующие запросы (на системе 5.0.45-Debian_1ubuntu3.1-log):

CREATE TABLE t (
  ID INT NOT NULL PRIMARY KEY,
  PID INT,
  FOREIGN KEY (PID) REFERENCES t(ID)
) ENGINE=INNODB;

INSERT INTO t VALUES (1, NULL);
INSERT INTO t VALUES (2, NULL);

SELECT * FROM t

Результат:

+----+------+
| ID | PID  |
+----+------+
|  1 | NULL |
|  2 | NULL |
+----+------+

Теперь выполняется следующее:

UPDATE t SET PID  = 2 WHERE ID = 1

Чтобы узать что хранится в таблице выполним: 

SELECT * FROM t

Результат:

+----+------+
| ID | PID  |
+----+------+
|  2 | NULL |
|  1 |    2 |
+----+------+

Вопрос №1: Можете ли вы объяснить почему записи возвращены в обратном порядке?

Показать ответ на вопрос №1

Вопрос №2: Есть здесь что-то что вы можете или должны исправить?

Показать ответ на вопрос №2

Опубликовано с разрешения Carsten Pedersen. Оригинал

« Prev - Next »