==== Mysql basic commands ==== ===Fallpits === * Quotes |" | don't use it, it is disabled in some databases| |' | wrap Strings| |` | wrap table names or columns| * === Details === The Details about MySQL are {{ http://www.w3schools.com/sql/sql_intro.asp | here}}. === Sample Database === The tool, which generated the picture is called {{ http://www.mysql.com/downloads/workbench/ | MySQL Workbench }} === Querying === ==Selecting columns and rows== Select Columns "Title,Salesrank" from the album databse, with the salesrank more than 10000: SELECT Title,Salesrank FROM album WHERE 10000; ==Destinct== Merges the duplicates Select all Labels from the album database: SELECT DISTINCT Label FROM album WHERE 1; == Select LIKE, Between, IN, AND, OR, NOT == SELECT DISTINCT Country FROM Customers WHERE Country LIKE "M%" OR Country LIKE "S%" OR PostalCode BETWEEN 2000 AND 3000 OR City IN ('London', 'Paris') SELECT * FROM Customers WHERE ( CustomerName LIKE 'G%' OR CustomerName LIKE 'S%') AND NOT Country = 'Spain'; SELECT * FROM Customers WHERE ( CustomerName LIKE 'G%' OR CustomerName LIKE 'S%') AND NOT Country IN ('Spain', 'USA'); == Select parenthesis grouping == SELECT * FROM Customers WHERE ( Country = 'Spain' AND CustomerName LIKE 'G%') OR ( Country = 'Mexico') == ORDER BY - sorting== Select all Titles and Prices ordered by the price, ascending | descending SELECT Title, Price FROM album WHERE 1 ORDER BY Price ASC SELECT Title, Price FROM album WHERE 1 ORDER BY Price DESC SELECT * FROM Customers ORDER BY Country, CustomerName; SELECT * FROM Customers ORDER BY Country ASC, CustomerName DESC; Select all Titles and Prices ordered by the price, ascending | descending SELECT Title, Price FROM album WHERE 1 ORDER BY Price ASC SELECT Title, Price FROM album WHERE 1 ORDER BY Price DESC == Insert == --- 92 Cardinal Tom B. Erichsen Skagen 21 Stavanger 4006 Norway INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country) VALUES ('AALfreddo','Tom B. Erichsen','Skagen 21','Stavanger','4006','Norway'); --- 92 Cardinal null null Stavanger null Norway INSERT INTO Customers (CustomerName, City, Country) VALUES ('Cardinal', 'Stavanger', 'Norway'); --- insert many groups with parenthesis INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country) VALUES ('Cardinal', 'Tom B. Erichsen', 'Skagen 21', 'Stavanger', '4006', 'Norway'), ('Greasy Burger', 'Per Olsen', 'Gateveien 15', 'Sandnes', '4306', 'Norway'), ('Tasty Tee', 'Finn Egan', 'Streetroad 19B', 'Liverpool', 'L1 0AA', 'UK'); == NULL comparison == To handle NULLs correctly, SQL provides two special comparison operators: IS NULL and IS NOT NULL. They **return only true or false** and are the best practice for incorporating NULL values into your queries. See how those evaluate to **unknown**? +---------+---------+---------+---------+ | = | TRUE | FALSE | UNKNOWN | +---------+---------+---------+---------+ | TRUE | TRUE | FALSE | UNKNOWN | | FALSE | FALSE | TRUE | UNKNOWN | | UNKNOWN | UNKNOWN | UNKNOWN | UNKNOWN | +---------+---------+---------+---------+ That means a query comparing null with = returns nothing. --- --- no result SELECT * FROM Customers WHERE Country = NULL --- comparing with IS works --- Number of Records: 2 SELECT * FROM Customers WHERE Country IS NULL -- invert via NOT SELECT * FROM Customers WHERE Country IS NOT NULL == Update == UPDATE Customers SET ContactName = 'Alfred Schmidt', City= 'Frankfurt' WHERE CustomerID = 1; UPDATE Customers SET Country='Burkinafaso' WHERE Country IS NULL; UPDATE Customers SET ContactName='Juan'; == Delete== --- delete with where DELETE FROM Customers WHERE Country == 'Burkinafaso' --- remove all Delete from Customers == DROP== --- delete with where DROP TABLE Customers; --- You have made changes to the database. == Select TOP== --- top 3 or LIMIT SELECT TOP 3 * FROM Customers; SELECT TOP 10 * FROM Customers ORDER BY CustomerID SELECT TOP 50 Percent * FROM Customers; SELECT * FROM Customers ORDER BY CustomerID DESC LIMIT 10; == Nested Queries == SELECT TOP 5 * FROM (SELECT * FROM Customers ORDER BY CustomerName ASC) CustomerName Country Alfreds Futterkiste Germany Ana Trujillo Emparedados y helados Mexico Antonio Moreno Taquería Mexico Around the Horn UK Berglunds snabbköp Sweden == MIN / MAX == SELECT MIN(PostalCode) FROM Customers WHERE Country = "Germany" SELECT MAX(PostalCode) FROM Customers WHERE Country = "Germany" == Count == --- count PostalCodes from Germany in this DB SELECT Count(PostalCode) FROM Customers WHERE Country = "Germany" --- count how many DISTINCT countries do we have in db --- as nested query Select COUNT(Country) FROM ( SELECT DISTINCT Country FROM Customers) --- more efficient SELECT COUNT(DISTINCT Price) FROM Products; SELECT COUNT(DISTINCT Country) FROM Customers; == SUM == SELECT SUM(Quantity) FROM OrderDetails; SELECT SUM(Quantity) FROM OrderDetails WHERE ProdictId = 11; --- use expressions in SUM to figure out the total revenue from all sold products cross all orders SELECT SUM(Price * Quantity) FROM OrderDetails LEFT JOIN Products ON OrderDetails.ProductID = Products.ProductID; == AVG Average == SELECT AVG(Price) FROM Products; --- below average SELECT * FROM Products WHERE price < (SELECT AVG(price) FROM Products); == Like Wildcards == SELECT * FROM Customers WHERE city LIKE 'L_nd__'; SELECT * FROM Customers WHERE CustomerName LIKE 'a%'; SELECT * FROM Customers WHERE CustomerName LIKE '%or%'; --- min 2 chars starts with a SELECT * FROM Customers WHERE CustomerName LIKE 'a_%'; --- any of the chards in the set: starts with b,s,p SELECT * FROM Customers WHERE CustomerName LIKE '[bsp]%'; SELECT * FROM Customers WHERE CustomerName LIKE '[a-f]%'; == IN or NOT IN == SELECT * FROM Customers WHERE Country NOT IN ('Germany', 'France', 'UK'); SELECT * FROM Customers WHERE CustomerID IN (SELECT CustomerID FROM Orders); == BETWEEN == SELECT * FROM Orders WHERE OrderDate BETWEEN '1996-07-01' AND '1996-07-31'; --- alphabetically sorted SELECT * FROM Products WHERE ProductName BETWEEN "Carnarvon Tigers" AND "Chef Anton's Cajun Seasoning" ORDER BY ProductName; == Alias == --- "MyIDAlias With empty space" Customer --- 1 Alfreds Futterkiste SELECT TOP 1 CustomerID AS "MyIDAlias With empty space", CustomerName AS Customer FROM Customers; --- let the DB concat address --- Address --- Obere Str. 57, 12209, Berlin, Germany SELECT CONCAT(Address,', ',PostalCode,', ',City,', ',Country) AS Address FROM Customers WHERE CustomerName="Alfreds Futterkiste"; Aliases to shorten table names, to shorten them --- long SELECT Orders.OrderID, Orders.OrderDate, Customers.CustomerName FROM Customers, Orders WHERE Customers.CustomerName='Around the Horn' AND Customers.CustomerID=Orders.CustomerID; -- short SELECT o.OrderID, o.OrderDate, c.CustomerName FROM Customers AS c, Orders AS o WHERE c.CustomerName='Around the Horn' AND c.CustomerID=o.CustomerID; == Having == The ''HAVING'' clause was added to SQL because the ''WHERE'' keyword cannot be used with aggregate functions. --- The following SQL statement lists the number of customers in each country. Only include countries with more than 5 customers SELECT COUNT(CustomerID), Country FROM Customers GROUP BY Country HAVING COUNT(CustomerID) > 5; --- The following SQL statement lists the number of employees having less than 20 sales SELECT e.EmployeeID, LastName, FirstName, COUNT(o.OrderID) As Sales FROM [Employees] AS e LEFT JOIN "Orders" AS o ON o.EmployeeID = e.EmployeeID GROUP BY e.EmployeeID HAVING COUNT(o.OrderID) < 20 ORDER BY Sales DESC, FirstName DESC, LastName ASC == Exist == --- suppliers with products of price under 20 SELECT SupplierName FROM Suppliers WHERE EXISTS (SELECT ProductName FROM Products WHERE Products.SupplierID = Suppliers.supplierID AND Price < 20); --- employees with orders SELECT LastName FROM Employees WHERE NOT EXISTS (SELECT OrderID FROM Orders WHERE Orders.EmployeeID = Employees.EmployeeID); == ANY, ALL== The ANY and ALL operators allow you to perform a comparison between a single column value and a range of other values. --- product name with productID having quantity=10 somewhere SELECT ProductName FROM Products WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE Quantity = 10); == ANY, ALL== The ANY and ALL operators allow you to perform a comparison between a single column value and a range of other values. SELECT OrderID, Quantity, CASE WHEN Quantity > 30 THEN 'The quantity is greater than 30' WHEN Quantity = 30 THEN 'The quantity is 30' ELSE 'The quantity is under 30' END AS QuantityText FROM OrderDetails; == CASE WHEN == Case expression SELECT OrderID, Quantity, CASE WHEN Quantity > 30 THEN 'The quantity is greater than 30' WHEN Quantity = 30 THEN 'The quantity is 30' ELSE 'The quantity is under 30' END AS QuantityText FROM OrderDetails; == IFNULL(), ISNULL(), COALESCE(), and NVL() Functions == | ''IFNULL(COLUMN, DEFAULTVALUE) -> COLUMN_VALUE or DEFAULT'' | The IFNULL() function returns a specified value if the expression is NULL. | | ''ISNULL(COLUMN, DEFAULTVALUE) -> BOOL'' | Return boolean. | | ''COALESCE(val1, val2, ...., val_n)'' | Return the first non-null value in a list: | --- fall back to 0 for NULL "UnitsOnOrder" SELECT ProductName, UnitPrice * (UnitsInStock + IFNULL(UnitsOnOrder, 0)) FROM Products; --- using boolean ISNULL SELECT OrderID, CASE WHEN ISNULL(AmountDue) THEN "Paid in full" WHEN DATE(DueDate) < date(NOW()) THEN "Order is past due" ELSE CONCAT("Order is due on ", CONVERT(VARCHAR, DueDate, 121)) END FROM OrderDetails; == Stored Procedure Example == --- procedure CREATE PROCEDURE SelectAllCustomers AS SELECT * FROM Customers GO; --- execute EXEC SelectAllCustomers; --- procedure with args CREATE PROCEDURE SelectAllCustomers @City nvarchar(30) AS SELECT * FROM Customers WHERE City = @City GO; --- exec EXEC SelectAllCustomers @City = 'London'; ==== Joins ==== * (INNER) JOIN: Returns records that have matching values in **both** tables * LEFT (OUTER) JOIN: Returns all records from the left table, and the matched records from the right table * RIGHT (OUTER) JOIN: Returns all records from the right table, and the matched records from the left table * FULL (OUTER) JOIN: Returns all records when there is a match in either left or right table {{https://s3.eu-central-1.amazonaws.com/alf-digital-wiki-pics/sharex/2hwjHojm7D.png?490x85}} == JOIN (same as INNER JOIN) == Ignores null values in Orders and Customers tables SELECT * FROM Orders AS o JOIN Customers AS c ON c.CustomerID = o.CustomerID WHERE OrderID > 10441 -- join 3 tables together --- Achtung - there is only 1 SELECT but multiple joins SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName FROM ((Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID) INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID); == FULL (OUTER) Join == Takes null CustomerIDs from both tables. Also shows Customers without Orders. And Orders without Customers. SELECT * FROM Orders AS o FULL JOIN Customers AS c ON c.CustomerID = o.CustomerID WHERE OrderID > 10441 --- same as FULL OUTER SELECT * FROM Orders AS o FULL OUTER JOIN Customers AS c ON c.CustomerID = o.CustomerID WHERE OrderID > 10441 == LEFT Join == SELECT * FROM Orders AS o LEFT JOIN Customers AS c ON c.CustomerID = o.CustomerID WHERE OrderID > 10441 == RIGHT Join == SELECT * FROM Orders AS o RIGHT JOIN Customers AS c ON c.CustomerID = o.CustomerID WHERE OrderID > 10441 == Self Join == -- show customer pairs from the same city SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City FROM Customers A, Customers B WHERE A.CustomerID <> B.CustomerID AND A.City = B.City ORDER BY A.City; -- show the customers, who are in the same city, like "Rancho grande" SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City FROM Customers A, Customers B WHERE A.CustomerID <> B.CustomerID AND A.CustomerName = "Rancho grande" AND A.City = B.City ORDER BY A.City; ==== Unions ==== == UNION / UNION ALL == -- all cities, distinct union SELECT City FROM Customers UNION SELECT City FROM Suppliers ORDER BY City; -- UNION ALL means, cities are NOT unique SELECT City FROM Customers UNION ALL SELECT City FROM Suppliers ORDER BY City; When putting together Customer, Supplier you can remember who is who by adding a **AS Role** column. It will contain values Customer / Supplier SELECT 'Customer' AS Role, ContactName, City, Country FROM Customers UNION SELECT 'Supplier', ContactName, City, Country FROM Suppliers ==== Aufgaben ==== ==0. == Waehle die DB aus, liste die tabellen. use mydatabase show tables ==1.== Führen Sie Titel, Preis und Verkaufsrang aller Alben des Künstlers Sting auf. Sortieren Sie die Liste aufsteigend nach dem Verkaufsrang. SELECT title, price, salesrank WHERE Artist="Sting" ORDER BY Salesrank ASC; ==2.== Führen Sie die ersten 5 Tracks und den Albumtitel der Alben auf, denen kein Label zugeordnet ist. SELECT track.trackno, track.tracktitle, album.title FROM track INNER JOIN album ON track.fromalbum = album.asin WHERE album.label IS NULL LIMIT 5; ==3.== Listen Sie für jedes Label den durchschnittlichen Verkaufsrang der von ihm verlegten Alben auf. Es sollten nur Label aufgeführt werden, die mindestens 50 Alben verlegen. SELECT album.label, AVG(album.Salesrank) As AvgAlbumSalesrank, COUNT(ASIN) AS AlbumsCnt FROM album WHERE 1 GROUP BY Label HAVING COUNT(ASIN)>=50 ==4.== Führen Sie neben Titel und Künstler die minimale und maximale Kundenbewertung von Alben auf, die zu einem Album von Sting direkt ähnlich sind. SELECT Artists.artist, Artists.title,Ratings.minRating, Ratings.maxRating FROM (SELECT * FROM (SELECT similardest FROM (SELECT * FROM album WHERE Artist="Sting") AS StingAlbums LEFT JOIN albumsimilar ON StingAlbums.asin=albumsimilar.SIMILARSOURCE ) As SimilarIds LEFT JOIN album ON album.asin=SimilarIds.similardest) As Artists LEFT JOIN (SELECT album.artist, MAX(rating) As maxRating, MIN(rating) As minRating FROM customerreview INNER JOIN album ON album.ASIN=customerreview.ALBUM GROUP BY Artist) AS Ratings ON Artists.artist = Ratings.artist; ==5.== Listen Sie pro Kunden seine Anzahl von Bewertungen und seine durchschnittliche Bewertung auf. Kunden, die auch eine Bewertung eines Sting-Albums durchgeführt haben, sollen in dem Ergebnis nicht auftreten. CREATE VIEW StingRaters AS SELECT DISTINCT customerreview.customerid FROM customerreview LEFT JOIN album ON album.ASIN=customerreview.album WHERE album.artist="Sting"; SELECT customerreview.customerid, COUNT(customerreview.rating), AVG(customerreview.rating) FROM customerreview WHERE customerreview.customerid NOT IN (SELECT * FROM StingRaters) GROUP BY customerreview.customerid Drop VIEW Stingraters; ==6.== Führen Sie die Namen der ListMania-Listen an, die (mindestens) zwei Alben enthalten, die auch von Amazon als ähnlich bezeichnet werden. SELECT Listname FROM (SELECT DISTINCT BothJoined.LISTID1 AS LISTID FROM (SELECT FirstJoin.LISTID1, FirstJoin.ALBUM1, FirstJoin.SIMILARSOURCE, FirstJoin.SIMILARDEST, listmaniaentry.LISTID AS LISTID2, listmaniaentry.ALBUM AS ALBUM2 FROM (SELECT l1.`LISTID` AS LISTID1, l1.`ALBUM` AS ALBUM1, albumsimilar.SIMILARSOURCE, albumsimilar.SIMILARDEST FROM listmaniaentry AS l1 LEFT JOIN albumsimilar ON l1.ALBUM=albumsimilar.SIMILARSOURCE) AS FirstJoin LEFT JOIN listmaniaentry ON FirstJoin.SIMILARDEST=listmaniaentry.ALBUM) AS BothJoined WHERE LISTID1=LISTID2 ) ListIds NATURAL JOIN Listmanialist ==7.== Führen Sie die Titel und Künstler aller Alben auf, die zwar von Kunden bewertet wurden,für die jedoch keine Track-Informationen in der Datenbank gespeichert sind. SELECT * FROM (SELECT album.asin, album.title, album.artist FROM album WHERE album.asin NOT IN (SELECT FROMALBUM FROM track) ) AS WithTrackInfo WHERE WithTrackInfo.asin IN (SELECT ALBUM FROM customerreview WHERE RATING IS NOT NULL) ==8.== Listen Sie die IDs aller Kunden, die im Durchschnitt schlechter bewerten als der Gesamtdurchschnitt der Kundenbewertungen. SELECT AvgCustomerRating.CUSTOMERID FROM (SELECT CUSTOMERID, AVG(rating) AS AvgRating FROM customerreview GROUP BY Customerid) AS AvgCustomerRating WHERE AvgCustomerRating.AvgRating < (SELECT AVG(customerreview.rating) FROM customerreview WHERE 1) ==9.== Ich habe eine Tabelle mit Zeiten und Zustaenden in der folgenden Form: Date Time Device Configuration 01.01.2012 12.00 8193 12345 01.01.2012 12.15 8193 12345 01.01.2012 12.35 8193 22375 01.01.2012 12.37 7191 32335 Wie findet man die max. configurations fuer jedes Date-Device Paar? Date Device Configuration 01.01.2012 8193 22375 01.01.2012 7191 32335 **Antwort:** \\ "Group By" Kann mehrere Spalten nehmen und die Passenden operationen fuer jede Kombination dieser Spalten ausfuehren. select `date`,`Device`,max(Configuration) as MaxConfig from logData group by `date`,`Device` ==== Mysql advanced commands ==== === flush root pass === First Stop mysql service. # /etc/init.d/mysqld stop Start MySQL server without password: # mysqld_safe – -skip-grant-tables & Connect to mysql server using mysql client: # mysql -u root Setup new MySQL root user password mysql> use mysql; mysql> update user set password=PASSWORD(“NEW-PASSWORD”) where User=’root’; mysql> flush privileges; mysql> quit Finally restart MySQL Server and test it. # /etc/init.d/mysqld restart # mysql -u root -p === restrict to localhost === open /etc/mysql/my.cnf add bind-address = 127.0.0.1 === import of csv file === LOAD DATA LOCAL INFILE 'D:\\1PROJEKTE\\1Papierstaus\\DATA\\LVV\\2012-09-11_printing-context.lvl.txt.csv' INTO TABLE `tbl_name` FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES (`SystemTemperatur`, `Geraete-Nr.`, `Aktives-Setup`, `Firmware-Version`, `b4Ticket-Version`, `Fahrzeug-Nr.`, `Fahrer-Nr.`, `Transition`, `Datum`, `Zeitstempel`, `Logdatei`, `printingState`, `printedLines`, `linesToPrint`, `printError`, `cutterJam`, `paperInTray`, `cavity1Jam`, `cavity2Jam`, `paperAtEntry`, `coverClosed`, `coverLocked`, `temperatureCritical`, `bufferUnderrun`, `timeSinceLastPrint`, `analogPaperInTray`, `analogCavity1Jam`, `analogCavity2Jam`, `analogCoverLocked`, `analogPaperAtEntry`, `analogCoverClosed`, `analogCutterJam`, `analog24V`, `analogV`)