Columns
A column contains data representing a specific characteristic of the records in the table. Columns are also known as fields or attributes.Relationships
A relationship is a link between two tables (i.e, relations). Relationships make it possible to find data in one table that pertains to a specific record in another table.Datatypes
Each of a table's columns has a defined datatype that specifies the type of data that can exist in that column. For example, the FirstName column might be defined as varchar(20), indicating that it can contain a string of up to 20 characters. Unfortunately, datatypes vary widely between databases.imary Keys
Most tables have a column or group of columns that can be used to identify records. For example, an Employees table might have a column called EmployeeID that is unique for every row. This makes it easy to keep track of a record over time and to associate a record with records in other tables.Foreign Keys
Foreign key columns are columns that link to primary key columns in other tables, thereby creating a relationship. For example, the Customers table might have a foreign key column called SalesRep that links to EmployeeID, the primary key in the Employees table.Relational Database Management System
A Relational Database Management System (RDBMS), commonly (but incorrectly) called a database, is software for creating, manipulating, and administering a database. For simplicity, we will often refer to RDBMSs as databases.Popular Databases
Commercial Databases
Oracle
Oracle is the most popular relational database. It runs on both Unix and Windows. It used to be many times more expensive than SQL Server and DB2, but it has come down a lot in price.SQL Server
SQL Server is Microsoft's database and, not surprisingly, only runs on Windows. It has only a slightly higher market share than Oracle on Windows machines. Many people find it easier to use than Oracle.DB2
IBM's DB2 was one of the earliest players in the database market. It is still very commonly used on mainframes and runs on both Windows and Unix.Popular Open Source Databases
MySQL
Because of its small size, its speediness, and its very good documentation, MySQL has quickly become the most popular open source database. MySQL is available on both Windows and Unix, but it lacks some key features such as support for stored procedures.PostgreSQL
Until recently, PostgreSQL was the most popular open source database until that spot was taken over by MySQL. PostgreSQL now calls itself "the world's most advanced Open Source database software." It is certainly a featureful and robust database management system and a good choice for people who want some of the advanced features that MySQL doesn't yet have. PostgreSQL does not yet natively support Windows, but it is supposed to in the upcoming 7.5 release.Valid Object References
- server.database.owner.object
- server.database..object
- server..owner.object
- server...object
- database.owner.object
- database..object
- owner.object
- object
SQL Statements
Database Manipulation Language (DML)
DML statements are used to work with data in an existing database. The most common DML statements are:- SELECT
- INSERT
- UPDATE
- DELETE
Database Definition Language (DDL)
DDL statements are used to structure objects in a database. The most common DDL statements are:- CREATE
- ALTER
- DROP
Database Control Language (DCL)
DCL statements are used for database administration. The most common DCL statements are:- GRANT
- DENY (SQL Server Only)
- REVOKE
Relational Database Basics Conclusion
We have covered a little bit of the history of SQL, how databases work, and the common SQL statements. Now we will get into learning how to work with SQL.To continue to learn SQL go to the top of this page and cli
The SELECT statement is used to retrieve data from tables. SELECT statements can be used to perform simple tasks such as retrieving records from a single table or complicated tasks such as retrieving data from multiple tables with record grouping and sorting. In this lesson, we will look at several of the more basic ways to retrieve data from a single table.
Introduction to the Northwind Database
The Northwind database is a sample database used by Microsoft to demonstrate the features of some of its products, including SQL Server and Microsoft Access. The database contains the sales data for Northwind Traders, a fictitious specialty foods export-import company.Although the code taught in this class is not specific to Microsoft products, we use the Northwind database for many of our examples because many people are already familiar with it and because there are many resources for related learning that make use of the same database.
The diagram below shows the table structure of the Northwind database.
The Northwind database has additional tables, but we will only be using the ones shown above. In this lesson, we will explore some of these tables.
Some Basics
Comments
The standard SQL comment is two hyphens (--). However, some databases use other forms of comments as shown in the table below.SQL Comments
-- | # | /* */ | |
---|---|---|---|
Example | -- Comment | # Comment | /* Comment */ |
ANSI | YES | NO | NO |
SQL Server | YES | NO | YES |
Oracle | YES | NO | YES |
MySQL | YES | YES | YES |
Code Sample: SimpleSelects/Demos/Comments.sql
-- Single-line comment /* Multi-line comment used in: -SQL Server -Oracle -MySQL */
Whitespace and Semi-colons
Whitespace is ignored in SQL statements. Multiple statements are separated with semi-colons. The two statements in the sample below are equally valid.Code Sample: SimpleSelects/Demos/WhiteSpace.sql
SELECT * FROM Employees; SELECT * FROM Employees;
Case Sensitivity
SQL is not case sensitive. It is common practice to write reserved words in all capital letters. User-defined names, such as table names and column names may or may not be case sensitive depending on the operating system used.SELECTing All Columns in All Rows
The following syntax is used to retrieve all columns in all rows of a table.Syntax
SELECT table.* FROM table; -- OR SELECT * FROM table;
Code Sample: SimpleSelects/Demos/SelectAll.sql
--Retrieve all columns in the Region table SELECT * FROM Region;Code Explanation
The above SELECT statement will return the following results:
As you can see, the Region table has only two columns, RegionID and RegionDescription, and four rows.
Exercise: Exploring the Tables
Duration: 10 to 20 minutes.In this exercise, you will explore all the data in the Northwind database by selecting all the rows of each of the tables.
- Select all columns of all rows from the tables below.
- The number of records that should be returned is indicated in parentheses next to the table name.
- Categories (8)
- Customers (91)
- Employees (9)
- Orders (830)
- Products (77)
- Shippers (3)
- Suppliers (29)
SELECTing Specific Columns
The following syntax is used to retrieve specific columns in all rows of a table.Syntax
SELECT table_name.column_name, table_name.column_name FROM table; -- OR SELECT column, column FROM table;
Code Sample: SimpleSelects/Demos/SelectCols.sql
/* Select the FirstName and LastName columns from the Employees table. */ SELECT FirstName, LastName FROM Employees;Code Explanation
The above SELECT statement will return the following results:
Exercise: SELECTing Specific Columns
Duration: 5 to 15 minutes.In this exercise, you will practice selecting specific columns from tables in the Northwind database.
- Select CategoryName and Description from the Categories table.
- Select ContactName, CompanyName, ContactTitle and Phone from the Customers table.
- Select EmployeeID, Title, FirstName, LastName, and Region from the Employees table.
- Select RegionID and RegionDescription from the Region table.
- Select CompanyName, Fax, Phone and HomePage from the Suppliers table.
Sorting Records
The ORDER BY clause of the SELECT statement is used to sort records.Sorting By a Single Column
To sort by a single column, simply name that column in the ORDER BY clause.Syntax
SELECT column, column FROM table ORDER BY column;Note that columns in the ORDER BY clause do not have to appear in the SELECT clause.
Code Sample: SimpleSelects/Demos/OrderBy1.sql
/* Select the FirstName and LastName columns from the Employees table. Sort by LastName. */ SELECT FirstName, LastName FROM Employees ORDER BY LastName;Code Explanation
The above SELECT statement will return the following results:
Sorting By Multiple Columns
To sort by multiple columns, comma-delimit the column names in the ORDER BY clause.Syntax
SELECT column, column FROM table ORDER BY column, column;
Code Sample: SimpleSelects/Demos/OrderBy2.sql
/* Select the Title, FirstName and LastName columns from the Employees table. Sort first by Title and then by LastName. */ SELECT Title, FirstName, LastName FROM Employees ORDER BY Title, LastName;Code Explanation
The above SELECT statement will return the following results:
Sorting By Column Position
It is also possible to sort tables by the position of a column in the SELECT list. To do so, specify the column numbers in the ORDER BY clause.Syntax
SELECT column, column FROM table ORDER BY column_position, column_position;
Code Sample: SimpleSelects/Demos/OrderBy3.sql
/* Select the Title, FirstName and LastName columns from the Employees table. Sort first by Title (position 1) and then by LastName (position 3). */ SELECT Title, FirstName, LastName FROM Employees ORDER BY 1,3;Code Explanation
The above SELECT statement will return the same results as the previous query:
Ascending and Descending Sorts
By default, when an ORDER BY clause is used, records are sorted in ascending order. This can be explicitly specified with the ASC keyword. To sort records in descending order, use the DESC keyword.Syntax
SELECT column, column FROM table ORDER BY column_position DESC, column_position ASC;
Code Sample: SimpleSelects/Demos/OrderBy4.sql
/* Select the Title, FirstName and LastName columns from the Employees table. Sort first by Title in ascending order and then by LastName in descending order. */ SELECT Title, FirstName, LastName FROM Employees ORDER BY Title ASC, LastName DESC;Code Explanation
The above SELECT statement will return the following results:
Exercise: Sorting Results
Duration: 5 to 15 minutes.In this exercise, you will practice sorting results in SELECT statements.
- Select CategoryName and Description from the Categories table sorted by CategoryName.
- Select ContactName, CompanyName, ContactTitle, and Phone from the Customers table sorted by Phone.
- Create a report showing employees' first and last names and hire dates sorted from newest to oldest employee.
- Create a report showing Northwind's orders sorted by Freight from most expensive to cheapest. Show OrderID, OrderDate, ShippedDate, CustomerID, and Freight.
- Select CompanyName, Fax, Phone, HomePage and Country from the Suppliers table sorted by Country in descending order and then by CompanyName in ascending order.
The WHERE Clause and Operator Symbols
The WHERE clause is used to retrieve specific rows from tables. The WHERE clause can contain one or more conditions that specify which rows should be returned.Syntax
SELECT column, column FROM table WHERE conditions;The following table shows the symbolic operators used in WHERE conditions.
SQL Symbol Operators
Operator | Description |
---|---|
= | Equals |
<> | Not Equal |
> | Greater Than |
< | Less Than |
>= | Greater Than or Equal To |
<= | Less Than or Equal To |
Checking for Equality
Code Sample: SimpleSelects/Demos/Where-Equal.sql
/* Create a report showing the title and the first and last name of all sales representatives. */ SELECT Title, FirstName, LastName FROM Employees WHERE Title = 'Sales Representative';Code Explanation
The above SELECT statement will return the following results:
Checking for Inequality
Code Sample: SimpleSelects/Demos/Where-NotEqual.sql
/* Create a report showing the first and last name of all employees excluding sales representatives. */ SELECT FirstName, LastName FROM Employees WHERE Title <> 'Sales Representative';Code Explanation
The above SELECT statement will return the following results:
Exercise: Using the WHERE clause to check for equality or inequality
Duration: 5 to 15 minutes.In this exercise, you will practice using the WHERE clause to check for equality and inequality.
- Create a report showing all the company names and contact names of Northwind's customers in Buenos Aires.
- Create a report showing the product name, unit price and quantity per unit of all products that are out of stock.
- Create a report showing the order date, shipped date, customer id, and freight of all orders placed on May 19, 1997.
- Oracle users will have to use following date format: 'dd-mmm-yyyy' (e.g, '19-May-1997').
- MySQL users will have to use following date format: 'yyyy-mm-dd' (e.g, '1997-05-19').
- Create a report showing the first name, last name, and country of all employees not in the United States.
Checking for Greater or Less Than
The less than (<) and greater than (>) signs are used to compare numbers, dates, and strings.Code Sample: SimpleSelects/Demos/Where-GreaterThanOrEqual.sql
/* Create a report showing the first and last name of all employees whose last names start with a letter in the last half of the alphabet. */ SELECT FirstName, LastName FROM Employees WHERE LastName >= 'N';Code Explanation
The above SELECT statement will return the following results:
Exercise: Using the WHERE clause to check for greater or less than
Duration: 5 to 15 minutes.In this exercise, you will practice using the WHERE clause to check for values greater than or less than a specified value.
- Create a report that shows the employee id, order id, customer id, required date, and shipped date of all orders that were shipped later than they were required.
- Create a report that shows the city, company name, and contact name of all customers who are in cities that begin with "A" or "B."
- Create a report that shows all orders that have a freight cost of more than $500.00.
- Create a report that shows the product name, units in stock, units on order, and reorder level of all products that are up for reorder.
Checking for NULL
When a field in a row has no value, it is said to be NULL. This is not the same as having an empty string. Rather, it means that the field contains no value at all. When checking to see if a field is NULL, you cannot use the equals sign (=); rather, use the IS NULL expression.Code Sample: SimpleSelects/Demos/Where-Null.sql
/* Create a report showing the first and last names of all employees whose region is unspecified. */ SELECT FirstName, LastName FROM Employees WHERE Region IS NULL;Code Explanation
The above SELECT statement will return the following results:![]()
Code Sample: SimpleSelects/Demos/Where-NotNull.sql
/* Create a report showing the first and last names of all employees who have a region specified. */ SELECT FirstName, LastName FROM Employees WHERE Region IS NOT NULL;Code Explanation
The above SELECT statement will return the following results:
Exercise: Checking for NULL
Duration: 5 to 15 minutes.In this exercise, you will practice selecting records with fields that have NULL values.
- Create a report that shows the company name, contact name and fax number of all customers that have a fax number.
- Create a report that shows the first and last name of all employees who do not report to anybody.
WHERE and ORDER BY
When using WHERE and ORDER BY together, the WHERE clause must come before the ORDER BY clause.Code Sample: SimpleSelects/Demos/Where-OrderBy.sql
/* Create a report showing the first and last name of all employees whose last names start with a letter in the last half of the alphabet. Sort by LastName in descending order. */ SELECT FirstName, LastName FROM Employees WHERE LastName >= 'N' ORDER BY LastName DESC;Code Explanation
The above SELECT statement will return the following results:
Exercise: Using WHERE and ORDER BY Together
Duration: 5 to 15 minutes.In this exercise, you will practice writing SELECT statements that use both WHERE and ORDER BY.
- Create a report that shows the company name, contact name and fax number of all customers that have a fax number. Sort by company name.
- Create a report that shows the city, company name, and contact name of all customers who are in cities that begin with "A" or "B." Sort by contact name in descending order.
The WHERE Clause and Operator Words
The following table shows the word operators used in WHERE conditions.SQL Word Operators
Operator | Description |
---|---|
BETWEEN | Returns values in an inclusive range |
IN | Returns values in a specified subset |
LIKE | Returns values that match a simple pattern |
NOT | Negates an operation |
The BETWEEN Operator
The BETWEEN operator is used to check if field values are within a specified inclusive range.Code Sample: SimpleSelects/Demos/Where-Between.sql
/* Create a report showing the first and last name of all employees whose last names start with a letter between "J" and "M". */ SELECT FirstName, LastName FROM Employees WHERE LastName BETWEEN 'J' AND 'M'; -- The above SELECT statement is the same as the one below. SELECT FirstName, LastName FROM Employees WHERE LastName >= 'J' AND LastName <= 'M';Code Explanation
The above SELECT statements will both return the following results:
Note that a person with the last name "M" would be included in this report.
The IN Operator
The IN operator is used to check if field values are included in a specified comma-delimited list.Code Sample: SimpleSelects/Demos/Where-In.sql
/* Create a report showing the title of courtesy and the first and last name of all employees whose title of courtesy is "Mrs." or "Ms.". */ SELECT TitleOfCourtesy, FirstName, LastName FROM Employees WHERE TitleOfCourtesy IN ('Ms.','Mrs.'); -- The above SELECT statement is the same as the one below SELECT TitleOfCourtesy, FirstName, LastName FROM Employees WHERE TitleOfCourtesy = 'Ms.' OR TitleOfCourtesy = 'Mrs.';Code Explanation
The above SELECT statements will both return the following results:![]()
The LIKE Operator
The LIKE operator is used to check if field values match a specified pattern.The Percent Sign (%)
The percent sign (%) is used to match any zero or more characters.Code Sample: SimpleSelects/Demos/Where-Like1.sql
/* Create a report showing the title of courtesy and the first and last name of all employees whose title of courtesy begins with "M". */ SELECT TitleOfCourtesy, FirstName, LastName FROM Employees WHERE TitleOfCourtesy LIKE 'M%';Code Explanation
The above SELECT statement will return the following results:![]()
The Underscore (_)
The underscore (_) is used to match any single character.Code Sample: SimpleSelects/Demos/Where-Like2.sql
/* Create a report showing the title of courtesy and the first and last name of all employees whose title of courtesy begins with "M" and is followed by any character and a period (.). */ SELECT TitleOfCourtesy, FirstName, LastName FROM Employees WHERE TitleOfCourtesy LIKE 'M_.';Code Explanation
The above SELECT statement will return the following results:![]()
Wildcards and Performance
Using wildcards can slow down performance, especially if they are used at the beginning of a pattern. You should use them sparingly.The NOT Operator
The NOT operator is used to negate an operation.Code Sample: SimpleSelects/Demos/Where-Not.sql
/* Create a report showing the title of courtesy and the first and last name of all employees whose title of courtesy is not "Ms." or "Mrs.". */ SELECT TitleOfCourtesy, FirstName, LastName FROM Employees WHERE NOT TitleOfCourtesy IN ('Ms.','Mrs.');Code Explanation
The above SELECT statement will return the following results:![]()
Exercise: More SELECTs with WHERE
Duration: 5 to 15 minutes.In this exercise, you will practice writing SELECT statements that use WHERE with word operators.
- Create a report that shows the first and last names and birth date of all employees born in the 1950s.
- Create a report that shows the product name and supplier id for all products supplied by Exotic Liquids, Grandma Kelly's Homestead, and Tokyo Traders. Hint: you will need to first do a separate SELECT on the Suppliers table to find the supplier ids of these three companies.
- Create a report that shows the shipping postal code, order id, and order date for all orders with a ship postal code beginning with "02389".
- Create a report that shows the contact name and title and the company name for all customers whose contact title does not contain the word "Sales".
Checking Multiple Conditions
AND
AND can be used in a WHERE clause to find records that match more than one condition.Code Sample: SimpleSelects/Demos/Where-And.sql
/* Create a report showing the first and last name of all sales representatives whose title of courtesy is "Mr.". */ SELECT FirstName, LastName FROM Employees WHERE Title = 'Sales Representative' AND TitleOfCourtesy = 'Mr.';Code Explanation
The above SELECT statement will return the following results:![]()
OR
OR can be used in a WHERE clause to find records that match at least one of several conditions.Code Sample: SimpleSelects/Demos/Where-Or.sql
/* Create a report showing the first and last name and the city of all employees who are from Seattle or Redmond. */ SELECT FirstName, LastName, City FROM Employees WHERE City = 'Seattle' OR City = 'Redmond';Code Explanation
The above SELECT statement will return the following results:![]()
Order of Evaluation
By default, SQL processes AND operators before it processes OR operators. To illustrate how this works, take a look at the following example.Code Sample: SimpleSelects/Demos/Where-AndOrPrecedence.sql
/* Create a report showing the first and last name of all sales representatives who are from Seattle or Redmond. */ SELECT FirstName, LastName, City, Title FROM Employees WHERE City = 'Seattle' OR City = 'Redmond' AND Title = 'Sales Representative';Code Explanation
The above SELECT statement will return the following results:Notice that Laura Callahan is returned by the query even though she is not a sales representative. This is because this query is looking for employees from Seattle OR sales representatives from Redmond.![]()
This can be fixed by putting the OR portion of the clause in parentheses.
Code Sample: SimpleSelects/Demos/Where-AndOrPrecedence2.sql
/* Create a report showing the first and last name of all sales representatives who are from Seattle or Redmond. */ SELECT FirstName, LastName, City, Title FROM Employees WHERE (City = 'Seattle' OR City = 'Redmond') AND Title = 'Sales Representative';Code Explanation
The parentheses specify that the OR portion of the clause should be evaluated first, so the above SELECT statement will return the same results minus Laura Callahan.![]()
If only to make the code more readable, it's a good idea to use parentheses whenever the order of precedence might appear ambiguous.
Exercise: Writing SELECTs with Multiple Conditions
Duration: 5 to 15 minutes.In this exercise, you will practice writing SELECT statements that filter records based on multiple conditions.
- Create a report that shows the first and last names and cities of employees from cities other than Seattle in the state of Washington.
- Create a report that shows the company name, contact title, city and country of all customers in Mexico or in any city in Spain except Madrid.
Simple SELECTs Conclusion
In this lesson of the SQL tutorial, you have learned a lot about creating reports with SELECT. However, this is just the tip of the iceberg. SELECT statements can get a lot more powerful and, of course, a lot more complicated.To continue to learn SQL go to the top of this page and click on the next lesson in this SQL Tutorial's Table of Contents.
Last updated on 2009-05-11
Checking for Greater or Less Than
The less than (<) and greater than (>) signs are used to compare numbers, dates, and strings.Code Sample: SimpleSelects/Demos/Where-GreaterThanOrEqual.sql
/* Create a report showing the first and last name of all employees whose last names start with a letter in the last half of the alphabet. */ SELECT FirstName, LastName FROM Employees WHERE LastName >= 'N';Code Explanation
The above SELECT statement will return the following results:![]()
Exercise: Using the WHERE clause to check for greater or less than
Duration: 5 to 15 minutes.In this exercise, you will practice using the WHERE clause to check for values greater than or less than a specified value.
- Create a report that shows the employee id, order id, customer id, required date, and shipped date of all orders that were shipped later than they were required.
- Create a report that shows the city, company name, and contact name of all customers who are in cities that begin with "A" or "B."
- Create a report that shows all orders that have a freight cost of more than $500.00.
- Create a report that shows the product name, units in stock, units on order, and reorder level of all products that are up for reorder.
Checking for NULL
When a field in a row has no value, it is said to be NULL. This is not the same as having an empty string. Rather, it means that the field contains no value at all. When checking to see if a field is NULL, you cannot use the equals sign (=); rather, use the IS NULL expression.Code Sample: SimpleSelects/Demos/Where-Null.sql
/* Create a report showing the first and last names of all employees whose region is unspecified. */ SELECT FirstName, LastName FROM Employees WHERE Region IS NULL;Code Explanation
The above SELECT statement will return the following results:![]()
Code Sample: SimpleSelects/Demos/Where-NotNull.sql
/* Create a report showing the first and last names of all employees who have a region specified. */ SELECT FirstName, LastName FROM Employees WHERE Region IS NOT NULL;Code Explanation
The above SELECT statement will return the following results:![]()
Exercise: Checking for NULL
Duration: 5 to 15 minutes.In this exercise, you will practice selecting records with fields that have NULL values.
- Create a report that shows the company name, contact name and fax number of all customers that have a fax number.
- Create a report that shows the first and last name of all employees who do not report to anybody.
WHERE and ORDER BY
When using WHERE and ORDER BY together, the WHERE clause must come before the ORDER BY clause.Code Sample: SimpleSelects/Demos/Where-OrderBy.sql
/* Create a report showing the first and last name of all employees whose last names start with a letter in the last half of the alphabet. Sort by LastName in descending order. */ SELECT FirstName, LastName FROM Employees WHERE LastName >= 'N' ORDER BY LastName DESC;Code Explanation
The above SELECT statement will return the following results:![]()
Exercise: Using WHERE and ORDER BY Together
Duration: 5 to 15 minutes.In this exercise, you will practice writing SELECT statements that use both WHERE and ORDER BY.
- Create a report that shows the company name, contact name and fax number of all customers that have a fax number. Sort by company name.
- Create a report that shows the city, company name, and contact name of all customers who are in cities that begin with "A" or "B." Sort by contact name in descending order.
The WHERE Clause and Operator Words
The following table shows the word operators used in WHERE conditions.SQL Word Operators
Operator | Description |
---|---|
BETWEEN | Returns values in an inclusive range |
IN | Returns values in a specified subset |
LIKE | Returns values that match a simple pattern |
NOT | Negates an operation |
The BETWEEN Operator
The BETWEEN operator is used to check if field values are within a specified inclusive range.Code Sample: SimpleSelects/Demos/Where-Between.sql
/* Create a report showing the first and last name of all employees whose last names start with a letter between "J" and "M". */ SELECT FirstName, LastName FROM Employees WHERE LastName BETWEEN 'J' AND 'M'; -- The above SELECT statement is the same as the one below. SELECT FirstName, LastName FROM Employees WHERE LastName >= 'J' AND LastName <= 'M';Code Explanation
The above SELECT statements will both return the following results:![]()
Note that a person with the last name "M" would be included in this report.
The IN Operator
The IN operator is used to check if field values are included in a specified comma-delimited list.Code Sample: SimpleSelects/Demos/Where-In.sql
/* Create a report showing the title of courtesy and the first and last name of all employees whose title of courtesy is "Mrs." or "Ms.". */ SELECT TitleOfCourtesy, FirstName, LastName FROM Employees WHERE TitleOfCourtesy IN ('Ms.','Mrs.'); -- The above SELECT statement is the same as the one below SELECT TitleOfCourtesy, FirstName, LastName FROM Employees WHERE TitleOfCourtesy = 'Ms.' OR TitleOfCourtesy = 'Mrs.';Code Explanation
The above SELECT statements will both return the following results:![]()
The LIKE Operator
The LIKE operator is used to check if field values match a specified pattern.The Percent Sign (%)
The percent sign (%) is used to match any zero or more characters.Code Sample: SimpleSelects/Demos/Where-Like1.sql
/* Create a report showing the title of courtesy and the first and last name of all employees whose title of courtesy begins with "M". */ SELECT TitleOfCourtesy, FirstName, LastName FROM Employees WHERE TitleOfCourtesy LIKE 'M%';Code Explanation
The above SELECT statement will return the following results:![]()
The Underscore (_)
The underscore (_) is used to match any single character.Code Sample: SimpleSelects/Demos/Where-Like2.sql
/* Create a report showing the title of courtesy and the first and last name of all employees whose title of courtesy begins with "M" and is followed by any character and a period (.). */ SELECT TitleOfCourtesy, FirstName, LastName FROM Employees WHERE TitleOfCourtesy LIKE 'M_.';Code Explanation
The above SELECT statement will return the following results:![]()
Wildcards and Performance
Using wildcards can slow down performance, especially if they are used at the beginning of a pattern. You should use them sparingly.The NOT Operator
The NOT operator is used to negate an operation.Code Sample: SimpleSelects/Demos/Where-Not.sql
/* Create a report showing the title of courtesy and the first and last name of all employees whose title of courtesy is not "Ms." or "Mrs.". */ SELECT TitleOfCourtesy, FirstName, LastName FROM Employees WHERE NOT TitleOfCourtesy IN ('Ms.','Mrs.');Code Explanation
The above SELECT statement will return the following results:![]()
Exercise: More SELECTs with WHERE
Duration: 5 to 15 minutes.In this exercise, you will practice writing SELECT statements that use WHERE with word operators.
- Create a report that shows the first and last names and birth date of all employees born in the 1950s.
- Create a report that shows the product name and supplier id for all products supplied by Exotic Liquids, Grandma Kelly's Homestead, and Tokyo Traders. Hint: you will need to first do a separate SELECT on the Suppliers table to find the supplier ids of these three companies.
- Create a report that shows the shipping postal code, order id, and order date for all orders with a ship postal code beginning with "02389".
- Create a report that shows the contact name and title and the company name for all customers whose contact title does not contain the word "Sales".
Checking Multiple Conditions
AND
AND can be used in a WHERE clause to find records that match more than one condition.Code Sample: SimpleSelects/Demos/Where-And.sql
/* Create a report showing the first and last name of all sales representatives whose title of courtesy is "Mr.". */ SELECT FirstName, LastName FROM Employees WHERE Title = 'Sales Representative' AND TitleOfCourtesy = 'Mr.';Code Explanation
The above SELECT statement will return the following results:![]()
OR
OR can be used in a WHERE clause to find records that match at least one of several conditions.Code Sample: SimpleSelects/Demos/Where-Or.sql
/* Create a report showing the first and last name and the city of all employees who are from Seattle or Redmond. */ SELECT FirstName, LastName, City FROM Employees WHERE City = 'Seattle' OR City = 'Redmond';Code Explanation
The above SELECT statement will return the following results:![]()
Order of Evaluation
By default, SQL processes AND operators before it processes OR operators. To illustrate how this works, take a look at the following example.Code Sample: SimpleSelects/Demos/Where-AndOrPrecedence.sql
/* Create a report showing the first and last name of all sales representatives who are from Seattle or Redmond. */ SELECT FirstName, LastName, City, Title FROM Employees WHERE City = 'Seattle' OR City = 'Redmond' AND Title = 'Sales Representative';Code Explanation
The above SELECT statement will return the following results:Notice that Laura Callahan is returned by the query even though she is not a sales representative. This is because this query is looking for employees from Seattle OR sales representatives from Redmond.![]()
This can be fixed by putting the OR portion of the clause in parentheses.
Code Sample: SimpleSelects/Demos/Where-AndOrPrecedence2.sql
/* Create a report showing the first and last name of all sales representatives who are from Seattle or Redmond. */ SELECT FirstName, LastName, City, Title FROM Employees WHERE (City = 'Seattle' OR City = 'Redmond') AND Title = 'Sales Representative';Code Explanation
The parentheses specify that the OR portion of the clause should be evaluated first, so the above SELECT statement will return the same results minus Laura Callahan.![]()
If only to make the code more readable, it's a good idea to use parentheses whenever the order of precedence might appear ambiguous.
Exercise: Writing SELECTs with Multiple Conditions
Duration: 5 to 15 minutes.In this exercise, you will practice writing SELECT statements that filter records based on multiple conditions.
- Create a report that shows the first and last names and cities of employees from cities other than Seattle in the state of Washington.
- Create a report that shows the company name, contact title, city and country of all customers in Mexico or in any city in Spain except Madrid.
Simple SELECTs Conclusion
In this lesson of the SQL tutorial, you have learned a lot about creating reports with SELECT. However, this is just the tip of the iceberg. SELECT statements can get a lot more powerful and, of course, a lot more complicated.Calculated Fields
Calculated fields are fields that do not exist in a table, but are created in the SELECT statement. For example, you might want to create FullName from FirstName and LastName.Concatenation
Concatenation is a fancy word for stringing together different words or characters. SQL Server, Oracle and MySQL each has its own way of handling concatenation. All three of the code samples below will return the following results:In SQL Server, the plus sign (+) is used as the concatenation operator.
Code Sample: AdvancedSelects/Demos/Concatenate-SqlServer.sql
-- Select the full name of all employees. SQL SERVER. SELECT FirstName + ' ' + LastName FROM Employees;In Oracle, the double pipe (||) is used as the concatenation operator.
Code Sample: AdvancedSelects/Demos/Concatenate-Oracle.sql
-- Select the full name of all employees. Oracle. SELECT FirstName || ' ' || LastName FROM Employees;MySQL does this in yet another way. There is no concatenation operator. Instead, MySQL uses the CONCAT() function (see footnote).
Code Sample: AdvancedSelects/Demos/Concatenate-MySQL.sql
-- Select the full name of all employees. MySQL. SELECT CONCAT(FirstName, ' ', LastName) FROM Employees;Note that concatenation only works with strings. To concatenate other data types, you must first convert them to strings. (see footnote)
Mathematical Calculations
Mathematical calculations in SQL are similar to those in other languages.Mathematical Operators
Operator | Description |
---|---|
+ | Addition |
- | Subtraction |
* | Multiplication |
/ | Division |
% | Modulus |
Code Sample: AdvancedSelects/Demos/MathCalc.sql
/* If the cost of freight is greater than or equal to $500.00, it will now be taxed by 10%. Create a report that shows the order id, freight cost, freight cost with this tax for all orders of $500 or more. */ SELECT OrderID, Freight, Freight * 1.1 FROM Orders WHERE Freight >= 500;Code Explanation
The above SELECT statement will return the following results:![]()
Aliases
You will notice in the examples above that the calculated columns have the header "(No column name)". The keyword AS is used to provide a named header for the column.Code Sample: AdvancedSelects/Demos/Alias.sql
SELECT OrderID, Freight, Freight * 1.1 AS FreightTotal FROM Orders WHERE Freight >= 500;Code Explanation
As you can see, the third column now has the title "FreightTotal".
Exercise: Calculating Fields
Duration: 10 to 20 minutes.In this exercise, you will practice writing SELECT statements with calculated fields.
- Create a report that shows the unit price, quantity, discount, and the calculated total price using these three fields.
- Note for SQL Server users only: You will be using the Order Details table. Because this table name has a space in it, you will need to put it in double quotes in the FROM clause (e.g, FROM "Order Details").
- Write a SELECT statement that outputs the following.
Aggregate Functions and Grouping
Aggregate Functions
Aggregate functions are used to calculate results using field values from multiple records. There are five common aggregate functions.Common Aggregate Functions
Aggregate Function | Description |
---|---|
COUNT() | Returns the number of rows containing non-NULL values in the specified field. |
SUM() | Returns the sum of the non-NULL values in the specified field. |
AVG() | Returns the average of the non-NULL values in the specified field. |
MAX() | Returns the maximum of the non-NULL values in the specified field. |
MIN() | Returns the minimum of the non-NULL values in the specified field. |
Code Sample: AdvancedSelects/Demos/Aggregate-Count.sql
-- Find the Number of Employees SELECT COUNT(*) AS NumEmployees FROM Employees;Code Explanation
Returns 9.
Code Sample: AdvancedSelects/Demos/Aggregate-Sum.sql
-- Find the Total Number of Units Ordered of Product ID 3 /****************************** SQL Server ******************************/ SELECT SUM(Quantity) AS TotalUnits FROM "Order Details" WHERE ProductID=3; /****************************** Oracle and MySQL ******************************/ SELECT SUM(Quantity) AS TotalUnits FROM Order_Details WHERE ProductID=3;Code Explanation
Returns 328.
Code Sample: AdvancedSelects/Demos/Aggregate-Avg.sql
-- Find the Average Unit Price of Products SELECT AVG(UnitPrice) AS AveragePrice FROM Products;Code Explanation
Returns 28.8663.
Code Sample: AdvancedSelects/Demos/Aggregate-MinMax.sql
-- Find the Earliest and Latest Dates of Hire SELECT MIN(HireDate) AS FirstHireDate, MAX(HireDate) AS LastHireDate FROM Employees;Code Explanation
The above SELECT statement will return April 1, 1992 and November 15, 1994 as the FirstHireDate and LastHireDate, respectively. The date format will vary from database to database.![]()
Grouping Data
GROUP BY
With the GROUP BY clause, aggregate functions can be applied to groups of records based on column values. For example, the following code will return the number of employees in each city.Code Sample: AdvancedSelects/Demos/Aggregate-GroupBy.sql
--Retrieve the number of employees in each city SELECT City, COUNT(EmployeeID) AS NumEmployees FROM Employees GROUP BY City;The above SELECT statement will return the following results:
HAVING
The HAVING clause is used to filter grouped data. For example, the following code specifies that we only want information on cities that have more than one employee.Code Sample: AdvancedSelects/Demos/Aggregate-Having.sql
/* Retrieve the number of employees in each city in which there are at least 2 employees. */ SELECT City, COUNT(EmployeeID) AS NumEmployees FROM Employees GROUP BY City HAVING COUNT(EmployeeID) > 1;The above SELECT statement will return the following results:
Order of Clauses
- SELECT
- FROM
- WHERE
- GROUP BY
- HAVING
- ORDER BY
Code Sample: AdvancedSelects/Demos/Aggregate-OrderOfClauses.sql
/* Find the number of sales representatives in each city that contains at least 2 sales representatives. Order by the number of employees. */ SELECT City, COUNT(EmployeeID) AS NumEmployees FROM Employees WHERE Title = 'Sales Representative' GROUP BY City HAVING COUNT(EmployeeID) > 1 ORDER BY NumEmployees;The above SELECT statement will return the following results:
Grouping Rules
- Every non-aggregate column that appears in the SELECT clause must also appear in the GROUP BY clause.
- You may not use aliases in the HAVING clause.(see footnote)
- You may use aliases in the ORDER BY clause.
- You may only use calculated fields in the HAVING clause.
- You may use calculated field aliases or actual fields in the ORDER BY clause.
Exercise: Working with Aggregate Functions
Duration: 10 to 20 minutes.In this exercise, you will practice working with aggregate functions.
- Create a report that returns the following from the Order_Details table.
The report should only return rows for which TotalUnits is less than 200.
- Create a report that returns the following from the Products table.
The report should only return rows for which the average unit price of a product is greater than 70.
- Create a report that returns the following from the Orders table.
NumOrders represents the number of orders placed by a certain customer. Only return rows where NumOrders is greater than 15.
Where is the solution?
Selecting Distinct Records
The DISTINCT keyword is used to select distinct combinations of column values from a table. For example, the following example shows how you would find all the distinct cities in which Northwind has employees.Code Sample: AdvancedSelects/Demos/Distinct.sql
/* Find all the distinct cities in which Northwind has employees. */ SELECT DISTINCT City FROM Employees ORDER BY CityDISTINCT is often used with aggregate functions. The following example shows how DISTINCT can be used to find out in how many different cities Northwind has employees.
Code Sample: AdvancedSelects/Demos/Distinct-Count.sql
/* Find out in how many different cities Northwind has employees. */ SELECT COUNT(DISTINCT City) AS NumCities FROM Employees
Built-in Data Manipulation Functions
In this section, we will discuss some of the more common built-in data manipulation functions. Unfortunately, the functions differ greatly between databases, so you should be sure to check your database documentation when using these functions.The tables below show some of the more common math, string, and date functions.
Common Math Functions
Common Math Functions
Description | SQL Server | Oracle | MySQL |
---|---|---|---|
Absolute value | ABS | ABS | ABS |
Smallest integer >= value | CEILING | CEIL | CEILING |
Round down to nearest integer | FLOOR | FLOOR | FLOOR |
Power | POWER | POWER | POWER |
Round | ROUND | ROUND | ROUND |
Square root | SQRT | SQRT | SQRT |
Formatting numbers to two decimal places | CAST(num AS decimal(8,2)) | TO_CHAR(num,'9.00') | FORMAT(num,2) or CAST(num AS decimal(8,2)) |
Code Sample: AdvancedSelects/Demos/Functions-Math1.sql
/* Select freight as is and freight rounded to the first decimal (e.g, 1.150 becomes 1.200) from the Orders tables */ SELECT Freight, ROUND(Freight,1) AS ApproxFreight FROM Orders;Code Explanation
The above SELECT statement will return the following results (not all rows shown):![]()
Code Sample: AdvancedSelects/Demos/Functions-Math2.sql
/* Select the unit price as is and unit price as a decimal with 2 places to the right of the decimal point from the Products tables */ /****************************** SQL Server and MySQL ******************************/ SELECT UnitPrice, CAST(UnitPrice AS Decimal(8,2)) FROM Products; /****************************** Oracle ******************************/ SELECT UnitPrice, TO_CHAR(UnitPrice,'999.99') FROM Products;Code Explanation
The above SELECT statement will return the following results (not all rows shown):![]()
Note that you would round to a whole number by passing 0 as the second parameter: ROUND(field,0); and to the tens place by passing -1: ROUND(field,-1).
Common String Functions
Common String Functions
Description | SQL Server | Oracle | MySQL |
---|---|---|---|
Convert characters to lowercase | LOWER | LOWER | LOWER |
Convert characters to uppercase | UPPER | UPPER | UPPER |
Remove trailing blank spaces | RTRIM | RTRIM | RTRIM |
Remove leading blank spaces | LTRIM | LTRIM | LTRIM |
Substring | SUBSTRING | SUBSTR | SUBSTRING |
Code Sample: AdvancedSelects/Demos/Functions-String1.sql
/* Select first and last name from employees in all uppercase letters */ SELECT UPPER(FirstName), UPPER(LastName) FROM Employees;Code Explanation
The above SELECT statement will return the following results:![]()
Code Sample: AdvancedSelects/Demos/Functions-String2.sql
-- Select the first 10 characters of each customer's address /****************************** SQL Server and MySQL ******************************/ SELECT SUBSTRING(Address,1,10) FROM Customers; /****************************** Oracle ******************************/ SELECT SUBSTR(Address,1,10) FROM Customers;Code Explanation
The above SELECT statement will return the following results (not all rows shown):![]()
Common Date Functions
Common Date Functions
Description | SQL Server | Oracle | MySQL |
---|---|---|---|
Date addition | DATEADD | (use +) | DATE_ADD |
Date subtraction | DATEDIFF | (use -) | DATEDIFF |
Convert date to string | DATENAME | TO_CHAR | DATE_FORMAT |
Convert date to number | DATEPART | TO_NUMBER(TO_CHAR) | EXTRACT |
Get current date and time | GETDATE | SYS_DATE | NOW |
Code Sample: AdvancedSelects/Demos/Functions-Date1.sql
-- Find the hiring age of each employee /****************************** SQL Server ******************************/ SELECT LastName, BirthDate, HireDate, DATEDIFF(year,BirthDate,HireDate) AS HireAge FROM Employees ORDER BY HireAge; /****************************** Oracle ******************************/ SELECT LastName, BirthDate, HireDate, FLOOR((HireDate - BirthDate)/365.25) AS HireAge FROM Employees ORDER BY HireAge; /****************************** MySQL ******************************/ -- Find the hiring age of each employee -- in versions of MySQL prior to 4.1.1 SELECT LastName, BirthDate, HireDate, YEAR(HireDate)-YEAR(BirthDate) AS HireAge FROM Employees; -- In MySQL 4.1.1 and later, DATEDIFF() returns the number of days between -- two dates. You can then divide and floor to get age. SELECT LastName, BirthDate, HireDate, FLOOR(DATEDIFF(HireDate,BirthDate)/365) AS HireAge FROM Employees ORDER BY HireAge;Code Explanation
The above SELECT statement will return the following results in SQL Server:![]()
And like this in Oracle:![]()
Note for SQL Server users: SQL Server is subtracting the year the employee was born from the year (s)he was hired. This does not give us an accurate age. We'll fix this in an upcoming exercise.
Code Sample: AdvancedSelects/Demos/Functions-Date2.sql
-- Find the Birth month for every employee /****************************** SQL Server ******************************/ SELECT FirstName, LastName, DATENAME(month,BirthDate) AS BirthMonth FROM Employees ORDER BY DATEPART(month,BirthDate); /****************************** Oracle ******************************/ SELECT FirstName, LastName, TO_CHAR(BirthDate,'MONTH') AS BirthMonth FROM Employees ORDER BY TO_NUMBER(TO_CHAR(BirthDate,'MM')); /****************************** MySQL ******************************/ SELECT FirstName, LastName, DATE_FORMAT(BirthDate, '%M') AS BirthMonth FROM Employees ORDER BY EXTRACT(MONTH FROM BirthDate);Code Explanation
The above SELECT statement will return the following results:![]()
Exercise: Data Manipulation Functions
Duration: 10 to 20 minutes.In this exercise, you will practice using data manipulation functions.
- Create a report that shows the units in stock, unit price, the total price value of all units in stock, the total price value of all units in stock rounded down, and the total price value of all units in stock rounded up. Sort by the total price value descending.
- SQL SERVER AND MYSQL USERS ONLY: In an earlier demo, you saw a report that returned the age of each employee when hired. That report was not entirely accurate as it didn't account for the month and day the employee was born. Fix that report, showing both the original (inaccurate) hire age and the actual hire age. The result will look like this.
- Create a report that shows the first and last names and birth month (as a string) for each employee born in the current month.
- Create a report that shows the contact title in all lowercase letters of each customer contact.
Advanced SELECTs Conclusion
In this lesson of the SQL tutorial, you have continued to use SELECT to create reports from data stored in a single table. In the next lesson, you will learn to create reports from data in multiple tables.Footnotes
- We'll look at functions more in Built-in Data Manipulation Functions.
- Conversion is covered briefly in Built-in Data Manipulation Functions.
- MySQL allows usage of aliases in the HAVING clause, but you may want to avoid this to keep your code as cross-database compatible as possible.
Using CASE
CASE functions contain one or more WHEN clauses as shown below.Syntax
--OPTION 1 SELECT CASE column WHEN VALUE THEN RETURN_VALUE WHEN VALUE THEN RETURN_VALUE WHEN VALUE THEN RETURN_VALUE WHEN VALUE THEN RETURN_VALUE ELSE RETURN_VALUE END AS ColumnName FROM table --OPTION 2 SELECT CASE WHEN EXPRESSION THEN RETURN_VALUE WHEN EXPRESSION THEN RETURN_VALUE WHEN EXPRESSION THEN RETURN_VALUE WHEN EXPRESSION THEN RETURN_VALUE ELSE RETURN_VALUE END AS ColumnName FROM table
Code Sample: Case/Demos/Case.sql
/* Create a report showing the customer ID and company name, employee id, firstname and lastname, and the order id and a conditional column called "Shipped" that displays "On Time" if the order was shipped on time and "Late" if the order was shipped late. */ SELECT c.CustomerID, c.CompanyName, e.EmployeeID, e.FirstName, e.LastName, OrderID, (CASE WHEN ShippedDate < RequiredDate THEN 'On Time' ELSE 'Late' END) AS Shipped FROM Orders o JOIN Employees e ON (e.EmployeeID = o.EmployeeID) JOIN Customers c ON (c.CustomerID = o.CustomerID) ORDER BY Shipped;Code Explanation
The above SELECT statement will return the following results (not all rows shown).![]()
Code Sample: Case/Demos/Case-GroupBy.sql
/* Create a report showing the customer ID and company name, employee id, firstname and lastname, and the order id and a conditional column called "Shipped" that displays "On Time" if the order was shipped on time and "Late" if the order was shipped late. */ SELECT e.FirstName, e.LastName, COUNT(o.OrderID) As NumOrders, (CASE WHEN o.ShippedDate < o.RequiredDate THEN 'On Time' ELSE 'Late' END) AS Shipped FROM Orders o JOIN Employees e ON (e.EmployeeID = o.EmployeeID) GROUP BY e.FirstName, e.LastName, (CASE WHEN o.ShippedDate < o.RequiredDate THEN 'On Time' ELSE 'Late' END) ORDER BY e.LastName, e.FirstName, NumOrders DESC;Code Explanation
The above SELECT statement will return the following results.![]()
Notice how the GROUP BY clause contains the same CASE statement that is in the SELECT clause. This is required because all non-aggregate columns in the SELECT clause must also be in the GROUP BY clause and the GROUP BY clause cannot contain aliases defined in the SELECT clause.
Exercise: Working with CASE
Duration: 10 to 15 minutes.In this exercise you will practice using CASE.
- Create a report that shows the company names and faxes for all customers. If the customer doesn't have a fax, the report should show "No Fax" in that field as shown below.
Conditional Processing with CASE Conclusion
In this lesson of the SQL tutorial, you learned about using CASE to output different values in reports based on data contained in table fields.INSERT
To insert a record into a table, you must specify values for all fields that do not have default values and cannot be NULL.Syntax
INSERT INTO table (columns) VALUES (values);The second line of the above statement can be excluded if all required columns are inserted and the values are listed in the same order as the columns in the table. We recommend you include the second line all the time though as the code will be easier to read and update and less likely to break as the database is modified.
Code Sample: InsertsUpdatesDeletes/Demos/Insert.sql
-- Insert a New Employee /****************************** Both of the inserts below will work in SQL Server Oracle ******************************/ INSERT INTO Employees (LastName, FirstName, Title, TitleOfCourtesy, BirthDate, HireDate, Address, City, Region, PostalCode, Country, HomePhone, Extension) VALUES ('Dunn','Nat','Sales Representative','Mr.','19-Feb-1970', '15-Jan-2004','4933 Jamesville Rd.','Jamesville','NY', '13078','USA','315-555-5555','130'); /****************************** MySQL ******************************/ INSERT INTO Employees (LastName, FirstName, Title, TitleOfCourtesy, BirthDate, HireDate, Address, City, Region, PostalCode, Country, HomePhone, Extension) VALUES ('Dunn','Nat','Sales Representative','Mr.','1970-02-19', '2004-01-15','4933 Jamesville Rd.','Jamesville','NY', '13078','USA','315-555-5555','130');Code Explanation
If the INSERT is successful, the output will read something to this effect:
(1 row(s) affected)
Exercise: Inserting Records
Duration: 5 to 15 minutes.In this exercise, you will practice inserting records.
- Insert yourself into the Employees table.
- Include the following fields: LastName, FirstName, Title, TitleOfCourtesy, BirthDate, HireDate, City, Region, PostalCode, Country, HomePhone, ReportsTo
- Insert an order for yourself in the Orders table.
- Include the following fields: CustomerID, EmployeeID, OrderDate, RequiredDate
- Insert order details in the Order_Details table.
- Include the following fields: OrderID, ProductID, UnitPrice, Quantity, Discount
- Include the following fields: OrderID, ProductID, UnitPrice, Quantity, Discount
UPDATE
The UPDATE statement allows you to update one or more fields for any number of records in a table. You must be very careful not to update more records than you intend to!Syntax
UPDATE table SET field = value, field = value, field = value WHERE conditions;
Code Sample: InsertsUpdatesDeletes/Demos/Update.sql
-- Update an Employee UPDATE Employees SET FirstName = 'Nathaniel' WHERE FirstName = 'Nat';Code Explanation
If the UPDATE is successful, the output will read something to this effect:
(1 row(s) affected)
DELETE
The DELETE statement allows you to delete one or more records in a table. Like with UPDATE, you must be very careful not to delete more records than you intend to!Syntax
DELETE FROM Employees WHERE conditions;
Code Sample: InsertsUpdatesDeletes/Demos/Delete.sql
-- Delete an Employee DELETE FROM Employees WHERE FirstName = 'Nathaniel';Code Explanation
If the DELETE is successful, the output will read something to this effect:
(1 row(s) affected)
Exercise: Updating and Deleting Records
Duration: 5 to 15 minutes.In this exercise, you will practice updating and deleting records.
- Update your record in the Employees table to include some Notes.
- Raise the unit price of all products in the Products table by 10% for all products that are out of stock. This should affect 5 rows.
- Try to delete yourself from the Employees table. Could you?
- If you were not allowed to delete yourself from the Employees table, figure out what other records you have to delete so that you can.
Inserting, Updating and Deleting Records Conclusion
In this lesson of the SQL tutorial, you have learned how to insert, update, and delete records. Remember to be careful with updates and deletes. If you forget or mistype the WHERE clause, you could lose a lot of data.Data Types
All major relational database management systems allow DBAs to specify the type of data a field can contain. The table below shows the most commonly used data types specified in ANSI SQL.ANSI SQL Data Types
Data Type | Description |
---|---|
Character | A specific number of one-byte characters. |
Character varying | Up to a specific number of one-byte characters. |
National character | A specific number of two-byte characters. |
National character varying | Up to a specific number of two-byte characters. |
Integer | A whole number between -2^32 and +2^32 (2,147,483,648). |
Smallint | A whole number between -2^15 and +2^15 (32,768). |
Decimal | A floating-point number between -10^38+1 and 10^38+1. |
Real | An extremely large positive or negative floating-point number often stored using scientific notation with the potential for some relatively small loss of accuracy. |
Date | A date. |
Time | A time. |
ANSI SQL Data Types
Data type | SQL Server | Oracle | MySQL |
---|---|---|---|
Character | char(n) (see footnote) | char(n) | char(n) |
Character varying | varchar(n) | varchar(n) | varchar(n) |
National character | nchar(n) | char(n) | nchar(n) |
National character varying | nvarchar(n) | varchar(n) | nvarchar(n) |
Integer | int | int | int |
Smallint | smallint | smallint | smallint |
Decimal | decimal(n1,n2) (see footnote) | decimal(n1,n2) | decimal(n1,n2) |
Real | real | real | real |
Date | datetime | date | date |
Time | datetime | date | time |
Creating Tables
Now that you understand data types, you're ready to learn how to create a table. Note that you must have the proper database permissions to do so.Syntax
CREATE TABLE table_name ( column_name data_type, column_name data_type, column_name data_type, more columns... )
NULL Values
As we have discussed, in some cases a value may not be set for a specific field in a specific record. In this case, that field contains NULL. In the CREATE TABLE statement, the default for each column is to allow for null values. This can be stated explicitly with the NULL flag or it can be changed with the NOT NULL flag.Syntax
CREATE TABLE table_name ( column_name data_type NOT NULL, column_name data_type NULL, column_name data_type NOT NULL, more columns... )
Primary Keys
Every table should have a primary key, which is a field or group of fields that can be used to uniquely identify specific records in the table. Primary keys can be specified in two ways as shown below.Syntax
CREATE TABLE table_name ( column_name data_type PRIMARY KEY, column_name data_type null, column_name data_type not null, more columns... )Syntax
CREATE TABLE table_name ( column_name_pk data_type, column_name data_type null, column_name data_type not null, more columns..., CONSTRAINT PK_table_name PRIMARY KEY (column_name_pk) )When a table uses a group of fields for the primary key, the key is called a composite primary key. In this case, you must specify the primary key at the end of the CREATE TABLE statement as shown below.
Syntax
CREATE TABLE table_name ( column_name_pk1 data_type, column_name_pk2 data_type, column_name data_type not null, more columns..., CONSTRAINT PK_table_name PRIMARY KEY (column_name_pk1,column_name_pk2) )
Foreign Keys
Foreign keys reference the primary key of another table, thereby creating a relationship between those two tables. They can be specified using the two methods shown below.Syntax
CREATE TABLE table_name ( column_name data_type PRIMARY KEY, column_name data_type null, column_name_fk data_type FOREIGN KEY REFERENCES table2_name(column_name_pk), more columns... )Syntax
CREATE TABLE table_name ( column_name data_type PRIMARY KEY, column_name data_type null, column_name_fk data_type, more columns..., CONSTRAINT FK_table_name FOREIGN KEY REFERENCES table2_name(column_name_pk) )The code samples below show how to create duplicates of the Employees, Customers and Orders tables.
Code Sample: Tables/Demos/CreateTable.sql
CREATE TABLE Employees2 ( EmployeeID int NOT NULL PRIMARY KEY, LastName nvarchar(20) NOT NULL, FirstName nvarchar(10) NOT NULL, Title nvarchar(30) NULL, TitleOfCourtesy nvarchar(25) NULL, BirthDate datetime NULL, HireDate datetime NULL, Address nvarchar(60) NULL, City nvarchar(15) NULL, Region nvarchar(15) NULL, PostalCode nvarchar(10) NULL, Country nvarchar(15) NULL, HomePhone nvarchar(24) NULL, Extension nvarchar(4) NULL, ReportsTo int FOREIGN KEY REFERENCES Employees(EmployeeID) ) CREATE TABLE Customers2 ( CustomerID nchar(5) PRIMARY KEY, CompanyName nvarchar(40) NOT NULL, ContactName nvarchar(30) NULL, ContactTitle nvarchar(30) NULL, Address nvarchar(60) NULL, City nvarchar(15) NULL, Region nvarchar(15) NULL, PostalCode nvarchar(10) NULL, Country nvarchar(15) NULL, Phone nvarchar(24) NULL, Fax nvarchar(24) NULL ) CREATE TABLE Orders2 ( OrderID int PRIMARY KEY, CustomerID nchar(5) FOREIGN KEY REFERENCES Customers2(CustomerID), EmployeeID int FOREIGN KEY REFERENCES Employees2(EmployeeID), OrderDate datetime NULL, RequiredDate datetime NULL, ShippedDate datetime NULL, ShipVia int NULL, Freight decimal(8,2) NULL )Code Explanation
Notice that all three tables have primary keys and that the Orders2 table has two foreign keys referencing the other two tables.
This demo uses SQL Server data types.
Exercise: Creating Tables
Duration: 30 to 40 minutes.In this exercise you will create duplicates of the Products, Categories and Suppliers tables in the Northwind database.
- Open a new query window and write the three CREATE TABLE queries to create Products2, Categories2 and Suppliers2. Note that order matters and the order shown below is not correct. Set data types as you see appropriate.
- Products2 with the following fields:
- ProductID
- ProductName
- SupplierID
- CategoryID
- QuantityPerUnit
- UnitPrice
- UnitsInStock
- UnitsOnOrder
- ReorderLevel
- Categories2 with the following fields:
- CategoryID
- CategoryName
- Suppliers2 with the following fields:
- SupplierID
- CompanyName
- ContactName
- ContactTitle
- Address
- City
- Region
- PostalCode
- Country
- Phone
- Fax
- Run the query to see if it executes. You can test it by select rows from your new tables. Of course, they won't have any, but you shouldn't get an error.
Adding and Dropping Columns
The syntax for adding a column to a table is shown below:Syntax
ALTER TABLE table_name ADD column_name data_typeNote that you will either have to allow for NULL values or set a default value for the new column.
The syntax for dropping a column to a table is shown below:
Syntax
ALTER TABLE table_name DROP COLUMN column_nameNote that you cannot drop primary key columns.
Renaming Tables
The syntax for renaming tables is different in different RDBMSs.SQL Server
SQL Server uses a built-in stored procedure for renaming tables:Syntax
sp_rename table_name, new_table_name
Oracle and MySQL
Oracle and MySQL use the RENAME command for renaming tables:Syntax
RENAME table_name TO new_table_name
Dropping Tables
Dropping tables is scarily easy; however, there are data integrity checks to make sure you don't drop tables that are referenced by other tables.Syntax
DROP TABLE table_name
Creating and Modifying Tables Conclusion
In this lesson of the SQL tutorial, you have learned how to create and modify table structures, how to set data types and how to create relationships between tables using primary and foreign keys.Creating Views
To create views, simply write your SELECT query and wrap it in a CREATE VIEW statement as shown below.Syntax
CREATE VIEW view_name AS SELECT statement goes here...Here is an example showing how to create a view from a complicated query we've seen earlier.
Code Sample: Views/Demos/CreateView.sql
--create view showing detailed order information CREATE VIEW vwOrderInfo AS SELECT o.OrderID, o.OrderDate, o.RequiredDate, o.ShippedDate, c.CompanyName, e.FirstName, e.LastName FROM Orders o JOIN Employees e ON (e.EmployeeID = o.EmployeeID) JOIN Customers c ON (c.CustomerID = o.CustomerID); --Select all records from view that were shipped after the required date SELECT * FROM vwOrderInfo WHERE RequiredDate < ShippedDateCode Explanation
You can see that the process of creating the view is simple. You should also notice how easy it is to get information on specific orders that includes relevant data from the Employees and Customers table.
Note that the ORDER BY clause is usually not allowed in views.
Dropping Views
Don't like your view? Dropping it is easy enough:Syntax
DROP VIEW view_name
Benefits of Views
Views have the following benefits:- Security - Views can be made accessible to users while the underlying tables are not directly accessible. This allows the DBA to give users only the data they need, while protecting other data in the same table.
- Simplicity - Views can be used to hide and reuse complex queries.
- Column Name Simplication or Clarification - Views can be used to provide aliases on column names to make them more memorable and/or meaningful.
- Stepping Stone - Views can provide a stepping stone in a "multi-level" query. For example, you could create a view of a query that counted the number of sales each salesperson had made. You could then query that view to group the sales people by the number of sales they had made.
Exercise: Creating a View
Duration: 15 to 25 minutes.In this exercise you will create a view showing the number of sales by salesperson.
- Open a new query window and create a view that gets the following data:
- Employee first name, last name and id
- Number of orders that employee has made (as NumOrders)
- Write a select statement that shows how many employees have made different numbers of orders rounded to the nearest 10. Your results should look like this:
Views Conclusion
In this lesson of the SQL tutorial, you learned the purpose and benefits of views and how to create and drop them.Creating Stored Procedures
Stored procedures are created with the CREATE PROCEDURE statement. The syntax is shown below.Syntax
CREATE PROCEDURE procedure_name @param data_type = default_value, @param data_type = default_value, @param data_type = default_value AS -- statements for procedure hereThe demo below shows a script that creates a simplified version of a SalesByCategory stored procedure that ships with SQL Server 2000's Northwind sample database.
Code Sample: StoredProcedures/Demos/StoredProc.sql
CREATE PROCEDURE SalesByCategory @CategoryName nvarchar(15), @OrdYear int = 1998 AS SELECT ProductName, SUM(OD.Quantity * (1-OD.Discount) * OD.UnitPrice) AS TotalPurchase FROM "Order Details" od, Orders o, Products p, Categories c WHERE od.OrderID = o.OrderID AND od.ProductID = p.ProductID AND p.CategoryID = c.CategoryID AND c.CategoryName = @CategoryName AND DATEPART(year,OrderDate) = @OrdYear GROUP BY ProductName ORDER BY ProductName --Call stored procedure EXEC SalesByCategory 'Seafood', 1997Code Explanation
The procedure has two parameters defined @CategoryName, which is required, and @OrdYear, which has a default value of 1998.
The stored procedure can be called with the EXEC command:
EXEC SalesByCategory 'Seafood', 1997.
The stored procedure shown in the previous demo returns a result set; however, stored procedures can also be used to insert, update, or delete data. Using conditional processing, it is possible to check parameters to make sure the input parameters are valid. It is also possible to run multiple queries and return multiple results with a single stored procedure. That advanced material is beyond the scope of this course. But even the simple stored procedure shown here is valuable as it makes it easy to get a sales report for a specific category of goods without writing a full SELECT query.
Dropping Stored Procedures
Dropping stored procedures is easy enough:Syntax
DROP PROCEDURE stored_procedure_name
Exercise: Creating a Stored Procedure
Duration: 20 to 30 minutes.In this exercise you will create a stored procedure that returns a sales report for a given time period for a given employee.
- Open a new query window and create a spSalesReport stored procedure that returns first name, last name, number of orders (NumOrders) and revenue for a given employee for a given time period. The stored procedure should take four required input parameters:
- @StartOrderDate
- @EndOrderDate
- @SpFirstName
- @SpLastName
- Test the stored procedure by running:
EXEC spSalesReport '11/1/1997','12/1/1997', 'Steven', 'Buchanan'
EXEC spSalesReport2 '11/1/1997','12/1/1997', 'Steve'... it should return the results for Steven Buchanan.
When called with no parameters, it should return result for all the salespeople.
Where is the solution?
Benefits of Stored Procedures
Stored procedures have many benefits, including:- Speed - Stored procedures are pre-compiled, so the execution plan doesn't have to be figured out each time they're called. This can result in a significant performance improvement.
- Code reuse and abstraction - Stored procedures often involve complex code. It's nice that this code doesn't have to be rewritten over and over again and that even entry-level SQL programmers can make use of it with a simple stored procedure call.
- Security - Permissions can be granted for stored procedures while being restricted for the underlying tables. This allows the DBA to provide a method for SQL programmers and report writers to access and/or manipulate data in a safe way.
- Reduced traffic between client and server - Since the bulk of the query is already stored on the server and only the relatively short stored procedure call has to get sent, traffic to the server is decreased.
Stored Procedures Conclusion
In this lesson of the SQL tutorial, you learned the purpose and benefits of stored procedures and how to create, use and drop them.Relational Database Design
Most popular database management systems are relational systems, and are usually referred to as Relational Database Management Systems (RDBMS). What this means is that their databases can contain multiple tables, some (or all) of which are related to each other.For example, consider the following screenshot:
In this example, the database has 20 tables. Each table serves a specific purpose. This enables us to organize our data much better. It can also help us with the integrity of our data.
Using the example above, the Individual table can hold data that is strictly about the individual. The City table can hold a list of all cities. If we want to know which city each individual lives, we could store a "pointer" in the Individual table to that city in the City table.
The above example demonstrates the relationship between the Individual table and the City table. The individuals in the "Individual" table live in cities that are defined in the "City" table. Therefore, we can cross-reference each "Individual" record with a "City" record.
How Does This Work?
Firstly, in the City table, each record has a unique identifier. A unique identifier is a value that is unique to each record. This identifier can be as simple as an incrementing number. So, in our City table, the first record has a number of 1, the second record has a number of 2, and so on.Secondly, when entering each individual into the Individual table, instead of writing out the full city name in that table, we only need to add the city's unique identifier. In this case, the unique identifier is a number, so we enter this number into the "CityId" column of the "Individual" table.
The following screenshots demonstrate this:
So, by looking at both tables, we can determine that Homer lives in Sydney, Barney lives in Cairns, and both Ozzy and Fred live in Osaka. At this stage, nobody in our database lives in Queenstown or Dunedin.
Primary Keys and Foreign Keys
Primary keys and foreign keys are terms that you will become very familiar with when designing databases. These terms describe what role each of the columns play in their relationship with each other.The column that contains the unique identifier is referred to as the Primary Key. So, in our City table, the primary key is the CityId column.
A foreign key is the column in the other table that points to the primary key. Therefore, the CityId column in the Individual table is a foreign key to the CityId column in the City table.
About SQL
SQL stands for Structured Query Language.SQL is a language that enables you to work with a database. Using SQL, you can insert records, update records, and delete records. You can also create new database objects such as databases and tables. And you can drop (delete) them.
More advanced features include creating stored procedures (self contained scripts), views (pre-made queries), and setting permissions on database objects (such as tables, stored procedures, and views).
Although SQL is an ANSI (American National Standards Institute) standard, there are many different versions of SQL. Different database vendors have their own variations of the language.
Having said this, to be in compliance with the ANSI standard, they need to at least support the major commands such as DELETE, INSERT, UPDATE, WHERE etc. Also, you will find that many vendors have their own extensions to the language - features that are only supported in their database system.
Furthermore, transact-SQL is an extension to the ANSI standard and provides extra functionality.
Using SQL
If you need to build a website with a database providing the content, you will generally need the following:- A server side scripting language (i.e. ColdFusion, PHP, ASP/.NET)
- A database query language (i.e. SQL)
- A client side markup language and style sheets (i.e. HTML/CSS)
The next lesson covers the SQL syntax basics.
The SQL syntax is quite an easy one to grasp. Most of the actions you need to perform are done with a SQL statement.
Generally, a SQL statement begins by stating what to do (for example, "SELECT"), then states which object to do it to (for example, using the "FROM" clause).
SELECT * FROM IndividualIt may also have a condition added to the end (for example, with a WHERE clause).
SELECT * FROM Individual WHERE FirstName = 'Homer'SQL is not case sensitive - the above examples could just have easily used all lowercase or all uppercase. Different programmers have their own preferences. For readability purposes, many SQL programmers prefer to use uppercase for SQL commands and lowercase for everything else.
The SQL syntax allows you to include line breaks at logical points without it breaking the statement. For example, the above example could have been written all on one line - or across 4 lines.
Also, some database systems require that you use a semicolon at the end of each SQL statement (although this tutorial doesn't use the semicolon).
DML & DDL
SQL is divided into two main categories; Data Manipulation Language (DML), and Data Definition Language (DDL). An explanation follows.Data Manipulation Language (DML)
DML enables you to work with the data that goes into the database. DML is used to insert, select, update, and delete records in the database. Many of your SQL statements will begin with one of the following commands:- SELECT - Retrieves data from the database
- INSERT - Inserts new data into the database
- UPDATE - Updates existing data in the database
- DELETE - Deletes existing data from the database
Data Definition Language (DDL)
You may also occasionally need to create or drop a table or other datbase object. SQL enables you to do this programatically using DDL.Examples of DDL commands:
- CREATE DATABASE - Creates a new database
- ALTER DATABASE - Modifies the database
- DROP DATABASE - Drops (deletes) a database
- CREATE TABLE - Creates a new table
- ALTER TABLE - Modifies the table
- DROP TABLE - Drops (deletes) a table
As you can see, the SQL syntax is quite simple. It is also very powerful syntax - you can do a lot of damage with one line of code!
The SELECT statement is probably the most commonly used in SQL. It simply retrieves data from the database.
Lets have a look at a simple SELECT statement:
SELECT * FROM IndividualThis SQL SELECT statement is attempting to retrieve all columns from a table called Individual.
How do we know it is trying to select all columns? Because it is using an asterisk (*). This is a quick way of selecting all columns - it's much easier than writing out the names of all columns (especially if there are a lot of columns).
Of course, this SQL SELECT statement assumes that there is a table called Individual. If there wasn't, an error would be generated.
Lets have a look at the table the statement is trying to select data from:
IndividualId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
4 | Ozzy | Ozzbourne | sabbath |
5 | Homer | Gain | noplacelike |
IndividualId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
4 | Ozzy | Ozzbourne | sabbath |
5 | Homer | Gain | noplacelike |
Select from Multiple Tables
You can select from more than one table at a time. To do this, simply separate each table with a comma. You should also qualify any references to columns by placing the table name in front, separated by a dot.We have another table called Occupation, which contains the individual's occupation.
OccupationId | IndividualId | JobTitle |
---|---|---|
1 | 1 | Engineer |
2 | 2 | Accountant |
3 | 3 | Cleaner |
4 | 4 | Attorney |
5 | 5 | Sales Executive |
SQL statement
We will select from both the Individual table and the Occupation table. We will qualify any column names by prefixing them with its table's name and a dot.SELECT * FROM Individual, Occupation WHERE Individual.FirstName = 'Homer'
Result
IndividualId | FirstName | LastName | UserName | OccupationId | IndividualId | JobTitle |
---|---|---|---|---|---|---|
1 | Fred | Flinstone | freddo | 1 | 1 | Engineer |
2 | Homer | Simpson | homey | 2 | 2 | Accountant |
3 | Homer | Brown | notsofamous | 3 | 3 | Cleaner |
4 | Ozzy | Ozzbourne | sabbath | 4 | 4 | Attorney |
5 | Homer | Gain | noplacelike | 5 | 5 | Sales Executive |
Displaying Less Columns
If you don't need every column to be displayed you can single out just the columns you're interested in. It's good programming practice to do this - the more columns your program has to return, the more it will impact its performance.To only display those columns you're interested in, simply replace the asterisk (*) with a comma separated list of the column names.
SQL statement
SELECT IndividualId, LastName, UserName FROM Individual WHERE FirstName = 'Homer'
Result
IndividualId | LastName | UserName |
---|---|---|
2 | Simpson | homey |
3 | Brown | notsofamous |
5 | Gain | noplacelike |
SQL Where
In the previous lesson, we used a SQL SELECT statement to retrieve all records from a database table. This is fine if we want to see every record, but what if we were only interested in some records? For example, what if we were only interested in individuals whose first name is "Homer"?We could use the WHERE clause.
Using the WHERE clause, you can filter out only those records that satisfy a given condition.
SQL WHERE Syntax
SELECT * FROM table_name WHERE column_name = 'criteria'
Example
SQL WHERE Statement
SELECT * FROM Individual WHERE FirstName = 'Homer'
Source Table
IndividualId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
4 | Ozzy | Ozzbourne | sabbath |
5 | Homer | Gain | noplacelike |
Result
Given there are 3 people with the first name of "Homer", the results will look like this:IndividualId | FirstName | LastName | UserName |
---|---|---|---|
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
5 | Homer | Gain | noplacelike |
Multiple Conditions
You can filter records based on more than one condition using operators. Two common operators are the AND and OR operators.AND Operator
The AND operator filters the query to only those records that satisfy both the first condition and the second condition.SELECT * FROM Individual WHERE FirstName = 'Homer' AND LastName = 'Brown'
Result
IndividualId | FirstName | LastName | UserName |
---|---|---|---|
3 | Homer | Brown | notsofamous |
OR Operator
The OR operator filters the query to only those records that satisfy either one or the other condition.SELECT * FROM Individual WHERE FirstName = 'Homer' OR LastName = 'Ozzbourne'
Result
IndividualId | FirstName | LastName | UserName |
---|---|---|---|
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
5 | Homer | Gain | noplacelike |
4 | Ozzy | Ozzbourne | sabbath |
SQL Order By
SQL statement
SELECT * FROM Individual ORDER BY LastName
Source Table
IndividualId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
4 | Ozzy | Ozzbourne | sabbath |
5 | Homer | Gain | noplacelike |
Result
IndividualId | FirstName | LastName | UserName |
---|---|---|---|
3 | Homer | Brown | notsofamous |
1 | Fred | Flinstone | freddo |
5 | Homer | Gain | noplacelike |
4 | Ozzy | Ozzbourne | sabbath |
2 | Homer | Simpson | homey |
Descending Order
By default, ORDER BY sorts the column in ascending order - that is, from lowest values to highest values. You could also explicitly state this using the ASC keyword, but it's not necessary.If you want highest values to appear first, you can use the DESC keyword.
SQL statement
SELECT * FROM Individual ORDER BY LastName DESC
Result
IndividualId | FirstName | LastName | UserName |
---|---|---|---|
2 | Homer | Simpson | homey |
4 | Ozzy | Ozzbourne | sabbath |
5 | Homer | Gain | noplacelike |
1 | Fred | Flinstone | freddo |
3 | Homer | Brown | notsofamous |
Sorting By Multiple Columns
You can sort by multiple columns by stating each column in the ORDER BY clause, separating each column name with a comma. SQL will first order the results by the first column, then the second, and so on for as many columns that are included in the ORDER BY clause.SQL statement
SELECT * FROM Individual ORDER BY FirstName, LastName
Result
IndividualId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
3 | Homer | Brown | notsofamous |
5 | Homer | Gain | noplacelike |
2 | Homer | Simpson | homey |
4 | Ozzy | Ozzbourne | sabbath |
SQL Top
Sounds like you need the SQL TOP clause.
The TOP clause allows us to specify how many rows to return. This can be useful on very large tables when there are thousands of records. Returning thousands of records can impact on performance, and if you are working with a production database, this could have an adverse impact on the users.
Note: The SQL TOP clause is Transact-SQL, and not part of ANSI SQL. Therefore, depending on your database system, you may not be able to use this clause.
SQL statement
SELECT TOP 3 * FROM Individual
Source Table
IndividualId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
4 | Ozzy | Ozzbourne | sabbath |
5 | Homer | Gain | noplacelike |
Result
IndividualId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
Specifying a Percentage
You have the option of specifying a percentage of the result set instead of an absolute value. You do this with the PERCENT keyword.SQL statement
SELECT TOP 40 PERCENT * FROM Individual
Result
IndividualId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
SQL TOP and the ORDER BY clause
If you are using the TOP clause along with the ORDER BY clause, the TOP clause is applied to the ordered result set.Therefore, if we add an ORDER BY to the above query, we end up with something like this:
SQL statement
SELECT TOP 40 PERCENT * FROM Individual ORDER BY LastName DESC
Result
IndividualId | FirstName | LastName | UserName |
---|---|---|---|
2 | Homer | Simpson | homey |
4 | Ozzy | Ozzbourne | sabbath |
SQL Distinct
Once a table starts getting a lot of data in it, some columns will contain duplicate values. For example, many Individuals share first names and surnames. Most of the time this isn't a problem. But sometimes you will want to find out how many unique values there are in a table. To do this you can use the DISTINCT keyword.SQL statement
SELECT DISTINCT(FirstName) FROM Individual
Source Table
IndividualId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
4 | Ozzy | Ozzbourne | sabbath |
5 | Homer | Gain | noplacelike |
Result
Using the DISTINCT keyword, all customers with a name of "Homer" are counted as one.FirstName |
---|
Fred |
Homer |
Ozzy |
SQL In
The SQL IN operator assists you in providing multiple values in your WHERE clause. This can provide very useful when you need to compare your value to a list of values. Often this list could be the result of a query from another table.SQL Syntax
SELECT * FROM table_name WHERE column_name IN (value1,value2,...)
Example
SQL statement
SELECT * FROM Individual WHERE LastName IN ('Simpson','Ozzbourne','Flinstone')
Source Table
Id | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
4 | Ozzy | Ozzbourne | sabbath |
5 | Homer | Gain | noplacelike |
Result
IndividualId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
4 | Ozzy | Ozzbourne | sabbath |
SELECT * FROM Individual WHERE LastName = 'Simpson' OR LastName = 'Ozzbourne' OR LastName = 'Flinstone'Yes, we could just have easily used that statement but the SQL IN statement is more concise.
SQL IN and Subqueries
Now, where the SQL IN operator becomes really useful is when you need to compare a value against the result of another query.For example, lets say we have another table called "Publisher". This table contains users who are allowed to contribute to the website via an administration console. All users in the Publisher table are also in the Individual table, but not all users in the Individual table are in the Publisher table.
Source Tables
Individual TableIndividualId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
4 | Ozzy | Ozzbourne | sabbath |
5 | Homer | Gain | noplacelike |
IndividualId | AccessLevel |
---|---|
1 | Administrator |
2 | Contributor |
3 | Contributor |
4 | Contributor |
You may notice that the usernames are in the Individual table but the access level is stored in the Publisher table. Also, there could potentially be many contributors. This is a good candidate for the SQL IN operator!
SQL statement
SELECT UserName FROM Individual WHERE IndividualId IN (SELECT IndividualId FROM Publisher WHERE AccessLevel = 'Contributor')
Result
UserName |
---|
homey |
notsofamous |
sabbath |
SQL Alias
In SQL, an alias is a name that you give a table. This can make it easier to work with table names - especially when they are long. You could name the alias anything, but usually you'd make it short.You may be thinking "a table already has a name, why give it another one?". Well, there are some good reasons for creating an alias. The main reasons are:
- Queries can sometimes get very long. Aliases can make your query easier to read.
- You may find yourself referencing the same table name over and over again - this will occur if you're working with multiple tables and you need to refer to columns from those tables. It can be annoying to have to write the whole name all the time - especially if it's a long one.
- You may need to work with multiple instances of the same table, for example, a self join. If you're not familiar with joins, they are covered later in this tutorial.
Alias Syntax
SELECT * FROM table_name AS alias_name
Example SQL Statement
SELECT o.JobTitle FROM Individual AS i, Occupation AS o WHERE i.FirstName = 'Homer' ORDER BY o.JobTitle
SQL Join
The SQL JOIN refers to using the JOIN keyword in a SQL statement in order to query data from two tables.When you perform a SQL join, you specify one column from each table to join on. These two columns contain data that is shared across both tables.
You can use multiple joins in the same SQL statement to query data from as many tables as you like.
Join Types
Depending on your requirements, you can do an "inner" join or an "outer" join. These are different in a subtle way- INNER JOIN: This will only return rows when there is at least one row in both tables that match the join condition.
- LEFT OUTER JOIN (or LEFT JOIN): This will return rows that have data in the left table (left of the JOIN keyword), even if there's no matching rows in the right table.
- RIGHT OUTER JOIN (or RIGHT JOIN): This will return rows that have data in the right table (right of the JOIN keyword), even if there's no matching rows in the left table.
- FULL OUTER JOIN (or FULL JOIN): This will return all rows, as long as there's matching data in one of the tables.
Join Syntax
Inner Join:SELECT * FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name = table_name2.column_nameLeft Join:
SELECT * FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name = table_name2.column_nameRight Join:
SELECT * FROM table_name1 RIGHT JOIN table_name2 ON table_name1.column_name = table_name2.column_nameFull Join:
SELECT * FROM table_name1 FULL JOIN table_name2 ON table_name1.column_name = table_name2.column_name
Example Inner Join Statement
SELECT * FROM Individual INNER JOIN Publisher ON Individual.IndividualId = Publisher.IndividualIdNote: We could use table aliases instead of the full table name. This will keep our statement shorter. For example:
SELECT * FROM Individual AS Ind INNER JOIN Publisher AS Pub ON Ind.IndividualId = Pub.IndividualId
SQL Inner Join
As discussed in the previous lesson, you should use the SQL INNER JOIN when you only want to return records where there is at least one row in both tables that match the join condition.Example SQL statement
SELECT * FROM Individual INNER JOIN Publisher ON Individual.IndividualId = Publisher.IndividualId WHERE Individual.IndividualId = '2'
Source Tables
Left TableId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
4 | Ozzy | Ozzbourne | sabbath |
5 | Homer | Gain | noplacelike |
IndividualId | AccessLevel |
---|---|
1 | Administrator |
2 | Contributor |
3 | Contributor |
4 | Contributor |
10 | Administrator |
Result
IndividualId | FirstName | LastName | UserName | IndividualId | AccessLevel |
---|---|---|---|---|---|
2 | Homer | Simpson | homey | 2 | Contributor |
SQL Outer Join
This lesson covers both the left outer join, the right outer join, and the full outer join, and explains the differences between them. There are some occasions where you would need to use a left outer join or a right outer join, and others where you would need a full outer join. The join type you use will depend on the situation and what data you need to return.Left Outer Join
Use this when you only want to return rows that have matching data in the left table, even if there's no matching rows in the right table.Example SQL statement
SELECT * FROM Individual AS Ind LEFT JOIN Publisher AS Pub ON Ind.IndividualId = Pub.IndividualId
Source Tables
Left TableId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
4 | Ozzy | Ozzbourne | sabbath |
5 | Homer | Gain | noplacelike |
IndividualId | AccessLevel |
---|---|
1 | Administrator |
2 | Contributor |
3 | Contributor |
4 | Contributor |
10 | Administrator |
Result
IndividualId | FirstName | LastName | UserName | IndividualId | AccessLevel |
---|---|---|---|---|---|
1 | Fred | Flinstone | freddo | 1 | Administrator |
2 | Homer | Simpson | homey | 2 | Contributor |
3 | Homer | Brown | notsofamous | 3 | Contributor |
4 | Ozzy | Osbourne | sabbath | 4 | Contributor |
5 | Homer | Gain | noplacelike | NULL | NULL |
Right Outer Join
Use this when you only want to return rows that have matching data in the right table, even if there's no matching rows in the left table.Example SQL statement
SELECT * FROM Individual AS Ind RIGHT JOIN Publisher AS Pub ON Ind.IndividualId = Pub.IndividualId
Source Tables
Left TableId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
4 | Ozzy | Ozzbourne | sabbath |
5 | Homer | Gain | noplacelike |
IndividualId | AccessLevel |
---|---|
1 | Administrator |
2 | Contributor |
3 | Contributor |
4 | Contributor |
10 | Administrator |
Result
IndividualId | FirstName | LastName | UserName | IndividualId | AccessLevel |
---|---|---|---|---|---|
1 | Fred | Flinstone | freddo | 1 | Administrator |
2 | Homer | Simpson | homey | 2 | Contributor |
3 | Homer | Brown | notsofamous | 3 | Contributor |
4 | Ozzy | Osbourne | sabbath | 4 | Contributor |
NULL | NULL | NULL | NULL | 10 | Administrator |
Full Outer Join
Use this when you want to all rows, even if there's no matching rows in the right table.Example SQL statement
SELECT * FROM Individual AS Ind FULL JOIN Publisher AS Pub ON Ind.IndividualId = Pub.IndividualId
Source Tables
Left TableId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
4 | Ozzy | Ozzbourne | sabbath |
5 | Homer | Gain | noplacelike |
IndividualId | AccessLevel |
---|---|
1 | Administrator |
2 | Contributor |
3 | Contributor |
4 | Contributor |
10 | Administrator |
Result
IndividualId | FirstName | LastName | UserName | IndividualId | AccessLevel |
---|---|---|---|---|---|
1 | Fred | Flinstone | freddo | 1 | Administrator |
2 | Homer | Simpson | homey | 2 | Contributor |
3 | Homer | Brown | notsofamous | 3 | Contributor |
4 | Ozzy | Osbourne | sabbath | 4 | Contributor |
5 | Homer | Gain | noplacelike | NULL | NULL |
NULL | NULL | NULL | NULL | 10 | Administrator |
SQL Insert
Up until now, this tutorial has covered the SELECT statement and variations on it. We are now about to learn a new statement - the INSERT statement.The SQL INSERT command allows you to insert a record into a table in your database. As with the SELECT syntax, the INSERT syntax is quite straight forward.
SQL statement
INSERT INTO Individual VALUES ( '6', 'Benny', 'Hill', 'hillbenny' )
Source Table
IndividualId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
4 | Ozzy | Ozzbourne | sabbath |
5 | Homer | Gain | noplacelike |
Result
Now if we do a SELECT on the Individual table, we can see the new record added to the bottom of the result set.IndividualId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
4 | Ozzy | Ozzbourne | sabbath |
5 | Homer | Gain | noplacelike |
6 | Benny | Hill | hillbenny |
Now, it's important to note that the INSERT statement is used only when you want to add a new record to the table. If you want to update an existing record, use an UPDATE statement. The UPDATE command is described in the next lesson
SQL Update
The SQL UPDATE statement allows you to update an existing record in the database.The UPDATE command uses a WHERE clause. If you don't use a WHERE clause, all rows will be updated. In fact, the syntax for a basic UPDATE statement is very similar to a SELECT statement.
SQL statement
UPDATE Individual SET UserName = 'funnyman' WHERE IndividualId = '6'
Source Table
IndividualId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
4 | Ozzy | Ozzbourne | sabbath |
5 | Homer | Gain | noplacelike |
6 | Benny | Hill | hillbenny |
Result
Now if we select this record, we can see the updated value.IndividualId | FirstName | LastName | UserName |
---|---|---|---|
6 | Benny | Hill | funnyman |
Updating Multiple Fields
To update multiple fields, separate each field assignment with a comma.SQL statement
UPDATE Individual SET UserName = 'getserious', FirstName = 'Onetree' WHERE IndividualId = '6'
Result
IndividualId | FirstName | LastName | UserName |
---|---|---|---|
6 | Onetree | Hill | getserious |
SQL Delete
The SQL DELETE statement allows you to delete a record from the database.The DELETE command uses a WHERE clause. If you don't use a WHERE clause, all rows in the table will be deleted. Again, as with the UPDATE statement, the syntax for a basic DELETE statement is similar to a SELECT statement.
SQL statement
DELETE FROM Individual WHERE IndividualId = '6'
Source Table
IndividualId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
4 | Ozzy | Ozzbourne | sabbath |
5 | Homer | Gain | noplacelike |
6 | Benny | Hill | funnyman |
Result
Now if we select all records from the table, we see that record 6 has been deleted.IndividualId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
4 | Ozzy | Ozzbourne | sabbath |
5 | Homer | Gain | noplaceliike |
SQL Functions
SQL has a number of functions to assist you in your database programming.Functions are a self contained script/program built for a specific purpose. Generally, the value returned by a function will depend on the context in which it is being used. Often, a SQL function will be used within a query and this is what provides it with it's context.
Transact-SQL provides 3 different types of functions:
Rowset Functions | These return an object that can be used in place of a table reference in a SQL statement |
---|---|
Aggregate Functions | Perform a calculation on a set of values and return a single value. Aggregate functions can be used in the following:
|
Scalar Functions | These return a single value from a single value. Scalar functions are categorized as follows:
|
In the next lesson you will learn about one of the more commonly used SQL functions - the COUNT function.
SQL Count
A commonly used aggregate function in SQL is COUNT. COUNT returns the number of rows that match the given criteria.COUNT(*)
If we only want to see how many records are in a table (but not actually view those records), we could use COUNT(*). COUNT(*) returns everything - including null values and duplicates.SQL statement
SELECT COUNT(*) FROM Individual
Source Table
IndividualId | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
4 | Ozzy | Ozzbourne | sabbath |
5 | Homer | Gain | noplacelike |
6 | Bono | u2 |
Result
6 |
COUNT(column name)
If we want to see how many non-null values are in a given column, we use COUNT(column name) where column name is the name of the column we want to test.SQL statement
SELECT COUNT(LastName) FROM Individual
Source Table
Id | FirstName | LastName | UserName |
---|---|---|---|
1 | Fred | Flinstone | freddo |
2 | Homer | Simpson | homey |
3 | Homer | Brown | notsofamous |
4 | Ozzy | Ozzbourne | sabbath |
5 | Homer | Gain | noplacelike |
6 | Bono | u2 |
Result
5 |
Combining COUNT & DISTINCT
If we only want to see how many unique names are in the table, we could nest the DISTINCT inside a COUNT function.SQL statement
SELECT COUNT(DISTINCT(FirstName)) FROM Individual
SQL Create
Most database systems provide a way for you to create database objects via a WYSIWYG interface. For example, Microsoft's SQL Server has Enterprise Manager. The Enterprise Manager gives you a kind of graphical representation of your database system. You can browse through your databases, view the tables and their contents etc.Despite having a tool like Enterprise Manager to make these tasks easier, there can be good reasons for wanting to perform some of these tasks programatically. Possible reasons could include:
- Your application allows users to create objects on the fly.
- You have multiple environments (for example development, staging, production). It's much easier, and less error prone, to run a script against 3 environments than to open up Enterprise Manager and repeat the steps in 3 environments - especially if you have lots of changes.
- You don't have access to Enterprise Manager (or your database system's equivalent).
Here are the CREATE commands supported by SQL Server:
- CREATE ACTION
- CREATE CACHE
- CREATE CELL CALCULATION
- CREATE CUBE
- CREATE DATABASE
- CREATE DEFAULT
- CREATE FUNCTION
- CREATE INDEX
- CREATE MEMBER
- CREATE MINING MODEL
- CREATE PROCEDURE
- CREATE RULE
- CREATE SCHEMA
- CREATE SET
- CREATE STATISTICS
- CREATE TABLE
- CREATE TRIGGER
- CREATE UNIQUE CLUSTERED INDEX
- CREATE VIEW
SQL Create Database
You can create a database using the CREATE DATABASE command.SQL syntax
CREATE DATABASE database_name
Example Code
This statement creates a database called "Payroll". Because no arguments have been specified, the database data files and transaction logs will be created automatically in the default location.CREATE DATABASE Payroll
Adding Arguments
There are a number of optional arguments that you can supply with the CREATE DATABASE command. You should check your database system's documentation for the specific arguments supported and their usage, but here's an example of supplying arguments when creating a database using Microsoft's SQL Server.Example Code
In this example, we are supplying the name and location of the database's data file and transaction log. We are also specifying the initial size of these files (with the SIZE argument), the maximum size it can grow to (with the MAXSIZE argument) and the growth increment of each file (using the FILEGROWTH) argument.USE master GO CREATE DATABASE Payroll ON ( NAME = Payroll_dat, FILENAME = 'c:\program files\microsoft sql server\mssql\data\payrolldat.mdf', SIZE = 20MB, MAXSIZE = 70MB, FILEGROWTH = 5MB ) LOG ON ( NAME = 'Payroll_log', FILENAME = 'c:\program files\microsoft sql server\mssql\data\payroll.ldf', SIZE = 10MB, MAXSIZE = 40MB, FILEGROWTH = 5MB ) GO
SQL Create Table
You create a table using the CREATE TABLE command.SQL syntax
CREATE TABLE table_name (column_name_1 datatype, column_name_2 datatype, ... )
Example
CREATE TABLE Individual (IndividualId int, FirstName Varchar(255), LastName Varchar(255), UserName Char(10) )
Result
This results in an empty table. You can now use an INSERT statement to add data to the table.IndividualId | FirstName | LastName | UserName |
---|---|---|---|
Data Types
You'll notice we explicitly stated the data type in our CREATE TABLE statement. This is because, when you create a column, you need to tell the database what type of data it can hold.The exact data types and how their expressed differs with each database system and vendor, but you'll find that generally, there will be support for fixed length strings (eg char), variable length strings (eg varchar), date/time values (eg datetime), numbers and integers (eg, bigint, int, smallint, tinyint, numeric).
The following base data types are available in SQL Server 2000.
bigint | Binary | bit | char | cursor |
datetime | Decimal | float | image | int |
money | Nchar | ntext | nvarchar | real |
smalldatetime | Smallint | smallmoney | text | timestamp |
tinyint | Varbinary | Varchar | uniqueidentifier |
SQL Create Index
Indexes can be created against a table to make searches more efficient. A database index is similar to an index of a book - a book index allows you to find information without having to read through the whole book. A database index enables the database application to find data quickly without having to scan the whole table.Indexes can have a slight impact on performance so you should only create indexes against tables and columns that will be frequently searched against. For example, if users of your application often search against the LastName field then that field is a great candidate for an index.
You create an index using the CREATE INDEX command.
SQL syntax
CREATE INDEX index_name ON table_name (column_name)
Example
CREATE INDEX IndividualIndex ON Individual (LastName)
SQL Alter Table
In an earlier lesson, we created a table with the CREATE TABLE command. In this lesson, we will modify the table using the ALTER TABLE command.Add a Column
SQL syntax
ALTER TABLE table_name ADD column_name datatype
Example SQL Statement
ALTER TABLE Individual ADD age int
Change the Datatype
SQL syntax
ALTER TABLE table_name ALTER COLUMN column_name datatype
Example SQL Statement
ALTER TABLE Individual ALTER COLUMN age numeric
Drop a Column
'Dropping' a column means removing or deleting that column.SQL syntax
ALTER TABLE table_name DROP COLUMN column_name
Example SQL Statement
ALTER TABLE Individual DROP COLUMN age
Relational Database tutorial
The experiments database
Datatabase are used to store data in a structured way. Let's explain the basics with a small example. 1. The Data
Assume I want to store the results of experiments performed at the lab. I group the data in 4 tables. Each row contains the information about 1 specific item or entity, the columns represent the information elements.experiments
ID | name | creation | who | p | comment |
1 | my first parallel program | 22/2/2002 | jan | 4 | just a test |
2 | parallel genetic algorithm | 22/3/2002 | jan | 8 | |
3 | parallel curve measurements | 25/3/2002 | erik | 8 | speedup curve |
users
name | function |
jan | assistant |
johan | assistant |
erik | professor |
andy | student |
variables
name | isParallel | explanation |
Ts | FALSE | sequential processing time |
Tp | TRUE | parallel processing time |
Tpart | TRUE | partitioning time |
Tsync | TRUE | synchronisation time |
Tcomm | TRUE | communication time |
measurements
experimentID | variable | value |
1 | Ts | 101.5 |
1 | Tp | 51.2 |
1 | Tpart | 5.3 |
1 | Tsync | 10.2 |
1 | Tcomm | 12.2 |
2 | Ts | 12356.5 |
2 | Tp | 8562.6 |
2 | Tpart | 256 |
2 | Tsync | 5023.3 |
2 | Tcomm | 2036.6 |
3 | Ts | 2305.6 |
3 | Tp | 805.6 |
3 | Tpart | 56.2 |
3 | Tsync | 12.6 |
3 | Tcomm | 98.5 |
2. Entity-Relationship Diagram
The definition of the database is represented by the ERD:Another important feature in relational databases is the relationship between the tables. In the experiments table, the who attribute is a member of the users table. This connects both tables, what is indicated with
3. Database creation
The Database Definition file ddt.txt with CREATE SQL commands.Upload this file with the mysql monitor (in a console or terminal):
mysql -h info9 -u guest ExperimentsExample < ddt.txt
- info9 is the network address of our database server
- you need to log in with a user, use guest (no password is necessary, when logging in from our computers)
- ExperimentsExample is the name of the database
- the < indicates the file has used as input for mysql
Check the definition of the database with mysqlshow:
mysqlshow -h info9 -u guest ExperimentsExample
=> you get all the tables
mysqlshow -h info9 -u guest ExperimentsExample experiments
=> the definition of the table experiments
4. Database access
Add the data with the INSERT statements. First start the mysql monitormysql -h info9 -u guest ExperimentsExample
mySQL> INSERT INTO users VALUES ('john', 'student');
Remark that the ; is to end the query and send it to the database.
All INSERT commands to fill the database.
Also try the SELECT statements:
mySQL> SELECT * FROM experiments\g
5. Database access in C
mySQL provides a mySQL API library to access the database.Let's illustrate this with an example program, download the following files:
- experiments.pro the project file, to create the makefile
qmake experiments.proMake the executable:
make allRun it:
experimentsStudy the code of experiments.cc, change the query, etc.
6. Data analysis
Once you have added data to the database, it is ready to be analysed for reporting, Microsoft Excel is a good tool herefore.But, how get the data in Excel?
- Put your query in a file.
- Start msql with the query file as input and an empty result file as output:
- mysql -h info9 -u guest ExperimentsExample < example_query.txt > example_result.txt
- Open the result file in Excel, it will use a Wizard to convert the text file into rows and columns
- Step 1:
- Original data type: or you choose Delimited or Fixed width, both will work
- Start import at row 9
- Step 2:
- if you have chosen 'Delimited', you should choose space as delimiter
- otherwise, indicate the columns (put the '|' in a seperated column)
- Step 3: here you could for example skip the columns with the '|'