Structured Query Language (SQL) Ask and ye shall receive. The Bible
Class Outline What is SQL? What are the basic SQL select statements and what is the order in which they are to be used? Which are optional? Create SQL statements that use expressions and functions to convert data into information use multiple criteria for searching produce output in a specific order provide summary data from groups of records display data from two tables show data that uses the results of another query as criteria
SQL SQL is a non-procedural data access language that is used primarily in programming by embedding it in other languages SQL is not a user-level language SQL accepts one or more relations as input and produces a single relation as output SQL provides functions for data definition (creates database and table structures), data management (enter, edit, delete data), and data query (convert data into information) developed in mid 1970s by IBM; endorsed by ANSI (American National Standards Institute) as the language of choice for manipulating relational databases language used by DB2, SQL/DS, ORACLE, INGRES, SYBASE, dBase, Paradox, Access (each with its own dialect) computer systems are able to exchange data by passing SQL requests and responses to one another our focus
General SQL Query Syntax SELECT*columns to extract FROMtables containing columns WHEREsearch criteria to restricts rows that are returned GROUP BYsummarizes query results by groups HAVINGsearch criteria to restrict groups that are returned ORDER BYsorts results by one or more columns Preceding is the order in which clauses should appear Order of processing is as follows: From, Where, Group by, Having, Order by, Select required optional, must be in this order if any or all are used
Projections SELECT Name, Salary FROM Employee SELECT Office, EmpID, Name FROM Employee
Unique Projections SELECT DISTINCT Name, Salary FROM Employee SELECT DISTINCT Office, Salary FROM Employee appears only once
Selections SELECT EmpID, Name, Office, Salary FROM Employee WHERE Office = ‘Brussels’ SELECT * FROM Employee WHERE Office = ‘Brussels’
Combining Selections and Projections SELECT Name, Salary FROM Employee WHERE Office = ‘Brussels’ SELECT Name, Office, Salary FROM Employee WHERE EmpID = 35 Single quotes necessary around text and dates (but not values) in criteria.
Comparison Search Conditions SELECT Name, Salary FROM Employee WHERE Salary >= 2500 SELECT EmpID, Name, Office FROM Employee WHERE Name <> ‘Anne Abel’
Comparison Search Conditions
Examples of Search Conditions SELECT Name, Salary FROM Employee WHERE Office IN (‘Brussels’, ‘Tokyo’) SELECT Name, Office, Salary FROM Employee WHERE Salary between 2000 and 3000 SELECT Name, Office, Salary FROM Employee WHERE Name Like ‘%am’ SELECT Name, Office, Salary FROM Employee WHERE Name Like ‘Ab_l’ SELECT Name, Office, Salary FROM Employee WHERE Office is Null SELECT Name, Office, Salary FROM Employee WHERE Office NOT IN (‘Toronto’)
Compound Comparison Search Conditions SELECT Name, Salary FROM Employee WHERE (Office IN (‘Brussels’, ‘Tokyo’) or Salary is Null) and HireDate <= ‘7/15/99’ SELECT Name, Office, Salary FROM Employee WHERE (Salary between 2000 and 3000 and Office <> ‘Tokyo’) or (Name like ‘Gor% and EmpID > 20) SELECT Name, Office, Salary FROM Employee WHERE Name NOT Like ‘%Abel’ and Salary >= 3100 SELECT Name, Office, Salary FROM Employee WHERE Office IN (‘Toronto’) or Name = ‘Anne Abel’ when operators are combined, brackets are evaluated first (inner to outer) AND means that ALL conditions must be met OR means that ANY condition may be met
Sorting SELECT Name, Salary FROM Employee WHERE Office = ‘Tokyo’ ORDER BY Salary, Name SELECT Name, Office, Salary FROM Employee WHERE Salary >= 2000 ORDER BY EmpID DESC
Expressions using Arithmetic SELECT Name, Salary, Commission/Salary FROM Salesperson WHERE Commission >.05*Salary SELECT ContactName, CompanyName FROM Customer WHERE Paid is null and OrderDate >= ‘1/1/99’ ORDER BY SysDate-InvoiceDate SELECT ItemName, Price*1.15 FROM Product SELECT Name, (Sysdate-Birthdate)/365 FROM Employee ORDER BY Name SELECT EmpID, Hiredate+90 FROM Employee ORDER BY Name current system date
SQL Built-in Functions SELECT Count(*) FROM Employee SELECT Count(Distinct Office) FROM Employee SELECT Sum(Salary) FROM Employee SELECT Max(HireDate) FROM Employee SELECT Min(Name) FROM Employee SELECT Avg(Salary) FROM Employee
Aggregate Functions and Grouping SELECT Office, Count(*) FROM Employee GROUP BY Office SELECT Office, Status, Max(Salary) FROM Employee GROUP BY Office, Status To view the groupings, you must also select them!
More Grouping Functions SELECT Category, Avg(Price), Min(Quantity), Sum(Price*Quantity) FROM Product WHERE SupplierID in (1, 2) or SupplierID is null GROUP BY Category ORDER BY Avg(Price)
Restrict Groups with “Having” SELECT Category, Avg(Price), Min(Quantity), Sum(Price*Quantity) FROM Product WHERE SupplierID in (‘1’, ‘2’) or SupplierID is null GROUP BY Category HAVING Min(Quantity) < 5 The ‘WHERE’ clause is always evaluated before the ‘HAVING’ clause.
Another ‘Having’ example SELECT Office, Max(Salary) FROM Employee WHERE Status = ‘full-time’ GROUP BY Office HAVING Count(*) > 1 ORDER BY Office
Subqueries SELECT ProdID, Price, Qty FROM Product WHERE SupID IN (SELECT SupplierID FROM Supplier WHERE City = ‘London’) Subquery is always evaluated before the main query. SELECT ProdID FROM Product WHERE Qty > (SELECT Avg(Qty) FROM Product WHERE SupID IN (‘1’, ‘2’))
Nested Subqueries SELECT Count(Unique PolicyNum) FROM PolicyPlan WHERE PlanCode = ‘45’ and PolicyNum IN (SELECT PolicyNum FROM Commission WHERE AgentNum IN (SELECT AgentNum FROM Agent WHERE Area = 100)) Determine the number of policies sold in area 100 of type 45:
Join (Natural Join) SELECT Product ProdID, Product ProdDesc, Supplier SupplierName FROM Product, Supplier WHERE Product SupID = Supplier SupplierID Table names required in Select statement only if there’s a possibility of ambiguity
Renaming Attributes and Relations with an Alias SELECT SupplierName, avg(price) “Average Price”, count(*) “# of Items” FROM Product P, Supplier S WHERE P SupID = S SupplierID and Category = ‘Accessories’ GROUP BY SupplierName ORDER BY SupplierID alias
‘Exists’ and ‘not exists’ in Subqueries SELECT Name FROM Employee E WHERE EXISTS (SELECT * FROM Dependent D WHERE E.EmpID = D.EmpID and E.Sex = D.DepSex) Which employees have dependents of the same sex as themselves? Which employees have no dependents? SELECT Name FROM Employee E WHERE NOT EXISTS (SELECT * FROM Dependent D WHERE E.EmpID = D.EmpID)