Lab databases

---------- # Create & populate tables ![relations.png](relations.png) # Queries ### Query 1 The description of all Function ```sql SELECT `description` FROM `Function` ``` > [!NOTE|label:Result] > > "description"
> "Fast backwards"
> "Raise up the low frequencies. Cut off frequency : 200 Hz"
> "Reduce the low frequencies. Cut off frequency : 200 Hz"
> "Fast forwards"
> "Tunes down"
> "Tunes up"
> "Plays to the next track"
> "Open or close the player's tray"
> "Pauses the current track"
> "Plays the selected track"
> "Select the preset 1"
> "Select the preset 2"
> "Select the preset 3"
> "Plays to the previous track"
> "Stores the current frequency to a preset"
> "Stops the current track"
> "Reduce the high frequencies.Cut off frequency : 4000 Hz"
> "Raise up the high frequencies. Cut off frequency : 4000 Hz"
> "Slow down fine tuning"
> "Slow up fine tuning"
> "Raise up the volume"
> "Reduce the volume"
> "Select the source of the input (BD, DVD, HDMI, ...)"
> "Select the Audio format to use with the current source (2ch stereo, 5.1, 7.2, 9.2, ...)"
---------- ### Query 2 The `name` of manufacturers that have at least one entry in the `Model` table ```sql SELECT `Manufacturer`.`manufacturerName` FROM `Manufacturer` WHERE EXISTS( SELECT * FROM `Model` WHERE `Model`.`manufacturerID`=`Manufacturer`.`manufacturerID`) ``` > [!NOTE|label:Result] > > "manufacturerName"
> "HEVs"
> "Sony"
> "Onkyo" ---------- ### Query 3 The `modelName` of device models together with the `manufacturerName` of their manufacturers ```sql SELECT `Model`.`modelName`, `Manufacturer`.`manufacturerName` FROM `Model`, `Manufacturer` WHERE `Model`.`manufacturerID` = `Manufacturer`.`manufacturerID` ``` > [!NOTE|label:Result] > > "modelName","manufacturerName"
> "MHC-900","Sony"
> "SDi-Ampli-01","HEVs" > "SDi-CdDvd-01","HEVs"
> "SDi-Tuner-01","HEVs"
> "UBP-X800M2","Sony"
> "TX-RZ70","Onkyo" ---------- ### Query 4 The description of the Function with functionLabel “Stop” ```sql SELECT `Function`.`description` FROM `Function` WHERE `Function`.`functionLabel` like 'Stop' ``` > [!NOTE|label:Result] > "description"
> "Stops the current track" ---------- ### Query 5 The `functionLabel` for `Function` with `functionID` > 10 and with a `description` containing the word “`preset`” (SQL wildcard character is “`%`”) ```sql SELECT `Function`.`functionLabel` FROM `Function` WHERE `Function`.`functionID` > '10' AND `Function`.`description` like '%preset%' ``` > [!NOTE|label:Result] > "functionLabel"
> "Preset 1"
> "Preset 2"
> "Preset 3"
> "Save preset" ---------- ### Query 6 The product of the tables `Code` and `FunctionList` (with and without the `JOIN` keyword), as well as the number of entries in the resulting product table With JOIN keyword
26 elements in 0,0003 seconds ```sql SELECT `Code`.`codeValue`, `FunctionList`.`modelID`, `FunctionList`.`functionID` FROM `Code` JOIN `FunctionList` ON `Code`.`codeID` = `FunctionList`.`codeID`; ``` > [!NOTE|label:Result] > "codeValue","modelID","functionID"
> "7","1","1"
> "124","1","10"
> "125","1","16"
> "547","1","9"
> "698","1","4"
> "59409854","3","8"
> "78546723","3","7"
> "81298355","3","16"
> "84578346","3","9"
> "84793478","3","10"
> "95847623","3","14"
> "458945040","2","17"
> "458945041","2","18"
> "458945042","2","2"
> "458945043","2","3"
> "458945044","2","21"
> "458945045","2","22"
> "1164736495","4","19"
> "1164736496","4","20"
> "1184894580","4","11"
> "1184894581","4","12"
> "1184894582","4","13"
> "1184894589","4","15"
> "1948573644","4","5"
> "1948573645","4","6"
> "1948573646","1","8" Without JOIN keyword
26 elements in 0,0002 seconds ```sql SELECT `Code`.`codeValue`, `FunctionList`.`modelID`, `FunctionList`.`functionID` FROM `Code`, `FunctionList` WHERE `Code`.`codeID` = `FunctionList`.`codeID`; ``` > [!NOTE|label:Result] > "codeValue","modelID","functionID"
> "7","1","1"
> "124","1","10"
> "125","1","16"
> "547","1","9"
> "698","1","4"
> "59409854","3","8"
> "78546723","3","7"
> "81298355","3","16"
> "84578346","3","9"
> "84793478","3","10"
> "95847623","3","14"
> "458945040","2","17"
> "458945041","2","18"
> "458945042","2","2"
> "458945043","2","3"
> "458945044","2","21"
> "458945045","2","22"
> "1164736495","4","19"
> "1164736496","4","20"
> "1184894580","4","11"
> "1184894581","4","12"
> "1184894582","4","13"
> "1184894589","4","15"
> "1948573644","4","5"
> "1948573645","4","6"
> "1948573646","1","8" ---------- ### Query 7 All `codeValue` for `modelID 4` ```sql SELECT `Code`.`codeValue` FROM `Code` CROSS JOIN `FunctionList` ON `Code`.`codeID` = `FunctionList`.`codeID` WHERE `FunctionList`.`modelID` = 4; ``` > [!NOTE|label:Result] > "codeValue"
> "1948573644"
> "1948573645"
> "1184894580"
> "1184894581"
> "1184894582"
> "1184894589"
> "1164736495"
> "1164736496" ---------- ### Query 8 The number of `codeValue` for `modelID 4` ```sql SELECT COUNT(`Code`.`codeValue`) FROM `Code` JOIN `FunctionList` ON `Code`.`codeID` = `FunctionList`.`codeID` WHERE `FunctionList`.`modelID` = 4; ``` > [!NOTE|label:Result] > 8 ---------- ### Query 9 All `codeValue` and `functionLabel` for Model with `modelName “SDi-Tuner-01”` ```sql SELECT `Code`.`codeValue`, `Function`.`functionLabel` FROM `Model` JOIN `FunctionList` ON `Model`.`modelID` = `FunctionList`.`modelID` JOIN `Code` ON `FunctionList`.`codeID` = `Code`.`codeID` JOIN `Function` ON `FunctionList`.`functionID` = `Function`.`functionID` WHERE `Model`.`modelName` like 'SDi-Tuner-01' ``` > [!NOTE|label:Result] > "codeValue","functionLabel"
> "1948573644","Frequency down"
> "1948573645","Frequency up"
> "1184894580","Preset 1"
> "1184894581","Preset 2"
> "1184894582","Preset 3"
> "1184894589","Save preset"
> "1164736495","Tune down"
> "1164736496","Tune up" ---------- ### Query 10 The number of `Function` items per `modelName` ```sql SELECT `Model`.`modelName`, COUNT(`FunctionList`.`functionID`) FROM `Model` LEFT JOIN `FunctionList` ON `Model`.`modelID` = `FunctionList`.`modelID` GROUP BY `Model`.`modelName` ``` > [!NOTE|label:Result] > "modelName","COUNT(`FunctionList`.`functionID`)"
> "MHC-900","6"
> "SDi-Ampli-01","6"
> "SDi-CdDvd-01","6"
> "SDi-Tuner-01","8"
> "UBP-X800M2","0"
> "TX-RZ70","0" ---------- ### Query 11 All `functionLabel` and `description` with their corresponding `modelID`, `functionID` and `codeID`. Be sure to include all `functionLabel` even if they are not used in any device ! ```sql SELECT `Function`.`functionLabel`, `Function`.`description`, `FunctionList`.`modelID`, `FunctionList`.`codeID` FROM `FunctionList` RIGHT JOIN `Function` ON `FunctionList`.`functionID` = `Function`.`functionID`; ``` > [!NOTE|label:Result] > "functionLabel","description","modelID","codeID"
> "Back","Fast backwards","1","1"
> "Bass down","Raise up the low frequencies. Cut off frequency : 200 Hz","2","14"
> "Bass up","Reduce the low frequencies. Cut off frequency : 200 Hz","2","15"
> "Forward","Fast forwards","1","5"
> "Frequency down","Tunes down","4","24"
> "Frequency up","Tunes up","4","25"
> "Next","Plays to the next track","3","7"
> "Open/Close tray","Open or close the player's tray","1","26"
> "Open/Close tray","Open or close the player's tray","3","6"
> "Pause","Pauses the current track","1","4"
> "Pause","Pauses the current track","3","9"
> "Play","Plays the selected track","1","2"
> "Play","Plays the selected track","3","10"
> Preset 1","Select the preset 1","4","20"
> "Preset 2","Select the preset 2","4","21"
> "Preset 3","Select the preset 3","4","22"
> "Previous","Plays to the previous track","3","11"
> "Save preset","Stores the current frequency to a preset","4","23"
> "Stop","Stops the current track","1","3"
> "Stop","Stops the current track","3","8"
> "Treble down","Reduce the high frequencies.Cut off frequency : 4000 Hz","2","12"
> "Treble up","Raise up the high frequencies. Cut off frequency : 4000 Hz","2","13"
> "Tune down","Slow down fine tuning","4","18""Tune up","Slow up fine tuning","4","19"
> "Volume down","Raise up the volume","2","16"
> "Volume up","Reduce the volume","2","17"
> "Input source","Select the source of the input (BD, DVD, HDMI, ...)",NULL,NULL
> "Audio format","Select the Audio format to use with the current source (2ch stereo, 5.1, 7.2, 9.2, ...)",NULL,NULL ---------- ### Query 12 All `functionLabel` and `description` of non-used functions in any device. (insert beforehand a new function in `Function`, with no reference in the `FunctionList` table). Add an unused function in the CSV file ```sql SELECT `Function`.`functionLabel`, `Function`.`description` FROM `FunctionList` RIGHT JOIN `Function` ON `FunctionList`.`functionID` = `Function`.`functionID` WHERE `FunctionList`.`modelID` is NULL ``` > [!NOTE|label:Result] > "functionLabel","description"
> "Input source","Select the source of the input (BD, DVD, HDMI, ...)"
> "Audio format","Select the Audio format to use with the current source (2ch stereo, 5.1, 7.2, 9.2, ...)"
> "Test Function","This function should not be referenced in the FunctionList" ---------- # Test constraints ### Test 1 Try to insert a record in a table using an existing primary key. ```sql INSERT INTO `Code`(`codeId`, `codeValue`) VALUES (1, 42) ``` > [!NOTE|label:Result] > #1062 - Duplicate entry '1' for key 'Code.PRIMARY' ---------- ### Test 2 Choose a table with at least a foreign key. Try to insert a record in that table, with the foreign key pointing to a non-existent record. ```sql INSERT INTO `Model`(`modelId`, `manufacturerID`, `typeID`, `modelName`) VALUES (7, 1, 42, 'dummy test') ``` > [!NOTE|label:Result] > #1452 - Cannot add or update a child row: a foreign key constraint fails (`sdi04`.`Model`, CONSTRAINT `Model_ibfk_2` FOREIGN KEY (`typeID`) REFERENCES `Type` (`typeID`) ON DELETE RESTRICT ON UPDATE RESTRICT) ---------- ### Test 3 Try to delete the record with name “`HEVs`” in the table `Manufacturer`. Explain why this operation fails. ```sql DELETE FROM `Manufacturer` WHERE `Manufacturer`.`manufacturerName` like 'HEVs' ``` > [!NOTE|label:Result] > #1451 - Cannot delete or update a parent row: a foreign key constraint fails (`sdi04`.`Model`, CONSTRAINT `Model_ibfk_1` FOREIGN KEY (`manufacturerID`) REFERENCES `Manufacturer` (`manufacturerID`) ON DELETE RESTRICT ON UPDATE RESTRICT) ---------- ### Test 4 Modify the foreign key definition in `Model` so that “`HEVs`” entry in `Manufacturer` can be deleted. The foreign key `manufacturerID` value in `Model` should be set to `NULL`. Test that it works as expected. ```sql ALTER TABLE `Model` CHANGE `manufacturerID` `manufacturerID` INT NULL; ALTER TABLE `Model` DROP FOREIGN KEY `Model_ibfk_1`; ALTER TABLE `Model` ADD CONSTRAINT `Model_ibfk_1` FOREIGN KEY (`manufacturerID`) REFERENCES `Manufacturer`(`manufacturerID`) ON DELETE SET NULL ON UPDATE RESTRICT; DELETE FROM `Manufacturer` WHERE `Manufacturer`.`manufacturerName` like 'HEVs' ``` > [!NOTE|label:Result] > 1 row deleted ---------- ### Test 5 We want now to delete all `Model` entries somehow related to a manufacturer when the latter is deleted from `Manufacturer`. To implement this feature, we should add a constraint `ON DELETE CASCADE` for the `manufacturerID` foreign key in `Model`. Try this and notice that this does not work. The reason is the following: you are not allowed to delete an entry in `Model` because a `FunctionList` refers to that entry. You could use `ON DELETE CASCADE` for all foreign keys, but deleting a single `Manufacturer` can trigger deletion of a good portion of the database! ```sql ALTER TABLE `Model` DROP FOREIGN KEY `Model_ibfk_1`; ALTER TABLE `Model` ADD CONSTRAINT `Model_ibfk_1` FOREIGN KEY (`manufacturerID`) REFERENCES `Manufacturer`(`manufacturerID`) ON DELETE CASCADE ON UPDATE CASCADE; DELETE FROM `Manufacturer` WHERE `Manufacturer`.`manufacturerName` like 'Sony' ``` > [!NOTE|label:Result] > #1451 - Cannot delete or update a parent row: a foreign key constraint fails (`sdi04`.`FunctionList`, CONSTRAINT `FunctionList_ibfk_3` FOREIGN KEY (`modelID`) REFERENCES `Model` (`modelID`) ON DELETE RESTRICT ON UPDATE RESTRICT) ```sql DELETE FROM `Manufacturer` WHERE `Manufacturer`.`manufacturerName` like 'Onkyo' ``` > [!NOTE|label:Result] > 1 row deleted ----------