Advance Database Systems
Advance Database Systems
Cadena
1
MODULE 1: TABLE OF CONTENTS
SQL Introduction 3
Syntax 8
Select 10
Select Distinct 14
Where 20
And, Or, Not 23
Order By 41
Insert Into 63
Null Values 66
Update 71
Delete 76
Select Top 78
Min and Max 80
Count, Avg, Sum 81
Like 83
Wildcards 97
In 100
Between 101
Aliases 107
Joins 107
Inner Join 110
Left Join 111
Right Join 113
Full Join 115
Self Join 117
Union 118
Group By 121
Having 122
Exists 124
Any, All 125
Select Into 128
Insert Into Select 129
Case 131
Null Functions 132
Stored Procedure 133
Comments 135
Operators 137
2
SQL Introduction
What is SQL?
SQL stands for Structured Query Language
SQL lets you access and manipulate databases
SQL became a standard of the American National Standards Institute (ANSI) in 1986, and of the
International Organization for Standardization (ISO) in 1987
However, to be compliant with the ANSI standard, they all support at least the major commands (such
as SELECT, UPDATE, DELETE, INSERT, WHERE) in a similar manner.
Note: Most of the SQL database programs also have their own proprietary extensions in addition to the
SQL standard!
RDBMS
RDBMS stands for Relational Database Management System.
RDBMS is the basis for SQL, and for all modern database systems such as MS SQL Server, IBM DB2,
Oracle, MySQL, and Microsoft Access.
The data in RDBMS is stored in database objects called tables. A table is a collection of related data
entries and it consists of columns and rows.
Example
3
CustomerID CustomerName ContactName Address City PostalCode Country
3 Antonio Moreno Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico
Taquería
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
7 Blondel père et fils Frédérique Citeaux 24, place Kléber Strasbourg 67000 France
9 Bon app' Laurence Lebihans 12, rue des Marseille 13008 France
Bouchers
12 Cactus Comidas Patricio Simpson Cerrito 333 Buenos Aires 1010 Argentina
para llevar
15 Comércio Mineiro Pedro Afonso Av. dos Lusíadas, São Paulo 05432-043 Brazil
23
18 Du monde entier Janine Labrune 67, rue des Nantes 44000 France
Cinquante Otages
21 Familia Arquibaldo Aria Cruz Rua Orós, 92 São Paulo 05442-030 Brazil
4
23 Folies gourmandes Martine Rancé 184, chaussée de Lille 59000 France
Tournai
26 France restauration Carine Schmitt 54, rue Royale Nantes 44000 France
27 Franchi S.p.A. Paolo Accorti Via Monte Bianco Torino 10100 Italy
34
28 Furia Bacalhau e Lino Rodriguez Jardim das rosas Lisboa 1675 Portugal
Frutos do Mar n. 32
30 Godos Cocina Típica José Pedro Freyre C/ Romero, 33 Sevilla 41101 Spain
32 Great Lakes Food Howard Snyder 2732 Baker Blvd. Eugene 97403 USA
Market
36 Hungry Coyote Yoshi Latimer City Center Plaza Elgin 97827 USA
Import Store 516 Main St.
42 Laughing Bacchus Yoshi Tannamuri 1900 Oak St. Vancouver V3F 2K1 Canada
Wine Cellars
5
44 Lehmanns Renate Messner Magazinweg 7 Frankfurt 60528 Germany
Marktstand a.M.
45 Let's Stop N Shop Jaime Yorres 87 Polk St. Suite San 94117 USA
5 Francisco
51 Mère Paillarde Jean Fresnière 43 rue St. Laurent Montréal H1J 1C3 Canada
54 Océano Atlántico Yvonne Moncada Ing. Gustavo Buenos Aires 1010 Argentina
Ltda. Moncada 8585
Piso 20-A
55 Old World Rene Phillips 2743 Bering St. Anchorage 99508 USA
Delicatessen
58 Pericles Comidas Guillermo Calle Dr. Jorge México D.F. 05033 Mexico
clásicas Fernández Cash 321
62 Queen Cozinha Lúcia Carvalho Alameda dos São Paulo 05487-020 Brazil
Canàrios, 891
6
64 Rancho grande Sergio Gutiérrez Av. del Libertador Buenos Aires 1010 Argentina
900
65 Rattlesnake Canyon Paula Wilson 2817 Milton Dr. Albuquerque 87110 USA
Grocery
71 Save-a-lot Markets Jose Pavarotti 187 Suffolk Ln. Boise 83720 USA
72 Seven Seas Imports Hari Kumar 90 Wadhurst Rd. London OX15 4NB UK
75 Split Rail Beer & Ale Art P.O. Box 555 Lander 82520 USA
Braunschweiger
77 The Big Cheese Liz Nixon 89 Jefferson Way Portland 97201 USA
Suite 2
78 The Cracker Box Liu Wong 55 Grizzly Peak Butte 59801 USA
Rd.
80 Tortuga Miguel Angel Avda. Azteca 123 México D.F. 05033 Mexico
Restaurante Paolino
82 Trail's Head Helvetius Nagy 722 DaVinci Blvd. Kirkland 98034 USA
Gourmet
Provisioners
7
86 Die Wandernde Kuh Rita Müller Adenauerallee 900 Stuttgart 70563 Germany
89 White Clover Karl Jablonski 305 - 14th Ave. S. Seattle 98128 USA
Markets Suite 3B
Table 1.0
Every table is broken up into smaller entities called fields. The fields in the Customers table consist of
CustomerID, CustomerName, ContactName, Address, City, PostalCode and Country. A field is a column
in a table that is designed to maintain specific information about every record in the table.
A record, also called a row, is each individual entry that exists in a table. For example, there are 91
records in the above Customers table. A record is a horizontal entity in a table.
A column is a vertical entity in a table that contains all information associated with a specific field in a
table.
SQL Syntax
Database Tables
A database most often contains one or more tables. Each table is identified by a name (e.g. "Customers"
or "Orders"). Tables contain records (rows) with data.
In this Module we will use the well-known Northwind sample database (included in MS Access and MS
SQL Server).
8
2 Ana Trujillo Ana Trujillo Avda. de la México 05021 Mexico
Emparedados y Constitución D.F.
helados 2222
4 Around the Horn Thomas Hardy 120 Hanover London WA1 1DP UK
Sq.
The table above contains five records (one for each customer) and seven columns (CustomerID,
CustomerName, ContactName, Address, City, PostalCode, and Country).
SQL Statements
Most of the actions you need to perform on a database are done with SQL statements.
The following SQL statement selects all the records in the "Customers" table:
Example
Semicolon is the standard way to separate each SQL statement in database systems that allow more
than one SQL statement to be executed in the same call to the server.
In this Module, we will use semicolon at the end of each SQL statement.
9
Some of The Most Important SQL Commands
SELECT - extracts data from a database
UPDATE - updates data in a database
DELETE - deletes data from a database
INSERT INTO - inserts new data into a database
CREATE DATABASE - creates a new database
ALTER DATABASE - modifies a database
CREATE TABLE - creates a new table
ALTER TABLE - modifies a table
DROP TABLE - deletes a table
CREATE INDEX - creates an index (search key)
DROP INDEX - deletes an index
SELECT Syntax
Demo Database
Below is a selection from the "Customers" table in the Northwind sample database:
10
3 Antonio Moreno Antonio Mataderos México 05023 Mexico
Taquería Moreno 2312 D.F.
4 Around the Horn Thomas Hardy 120 Hanover London WA1 1DP UK
Sq.
Example
CustomerName City
11
Comércio Mineiro São Paulo
Frankenversand München
GROSELLA-Restaurante Caracas
12
Lazy K Kountry Store Walla Walla
LILA-Supermercado Barquisimeto
LINO-Delicateses I. de Margarita
North/South London
QUICK-Stop Cunewalde
13
Save-a-lot Markets Boise
Vaffeljernet Århus
Wolski Walla
Inside a table, a column often contains many duplicate values; and sometimes you only want to list the
different (distinct) values.
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
Example
Country
Germany
Mexico
Mexico
UK
15
Sweden
Germany
France
Spain
France
Canada
UK
Argentina
Mexico
Switzerland
Brazil
UK
Germany
France
UK
Austria
Brazil
Spain
France
Sweden
Germany
France
Italy
Portugal
Spain
Spain
Brazil
USA
Venezuela
16
Brazil
Venezuela
USA
Ireland
UK
Germany
France
France
Canada
USA
Germany
USA
Venezuela
Venezuela
USA
Italy
Belgium
Canada
Germany
UK
Argentina
USA
Germany
France
Mexico
Austria
Portugal
Brazil
Brazil
17
Germany
Argentina
USA
Italy
Brazil
Switzerland
Spain
Norway
USA
UK
Denmark
France
USA
Belgium
USA
USA
Germany
Mexico
Brazil
USA
Denmark
France
France
Germany
Finland
Brazil
USA
Finland
Poland
Now, let us use the DISTINCT keyword with the above SELECT statement and see the result.
18
SELECT DISTINCT Examples
The following SQL statement selects only the DISTINCT values from the "Country" column in the
"Customers" table:
Example
Country
Germany
Mexico
UK
Sweden
France
Spain
Canada
Argentina
Switzerland
Brazil
Austria
Italy
Portugal
USA
Venezuela
Ireland
Belgium
Norway
Denmark
Finland
Poland
The following SQL statement lists the number of different (distinct) customer countries:
Example
19
COUNT(DISTINCT Country)
21
Note: The example above will not work in Firefox! Because COUNT(DISTINCT column_name) is not
supported in Microsoft Access databases. Firefox is using Microsoft Access in our examples.
Example
EXERCISES:
1. Insert the missing statement to get all the columns from the Customers table.
* FROM Customers;
2. Write a statement that will select the City column from the Customers table.
Customers;
3. Select all the different values from the Country column in the Customers table.
The WHERE clause is used to extract only those records that fulfill a specified condition.
WHERE Syntax
SELECT column1, column2, ...
FROM table_name
WHERE condition;
Note: The WHERE clause is not only used in SELECT statement, it is also used in UPDATE, DELETE
statement, etc.!
20
Demo Database
Below is a selection from the "Customers" table in the Northwind sample database:
4 Around the Horn Thomas Hardy 120 Hanover London WA1 1DP UK
Sq.
Example
21
13 Centro comercial Francisco Chang Sierras de México 05022 Mexico
Moctezuma Granada D.F.
9993
Example
Operator Description
= Equal
<> Not equal. Note: In some versions of SQL this operator may be written as !=
22
SQL AND, OR and NOT Operators
The SQL AND, OR and NOT Operators
The WHERE clause can be combined with AND, OR, and NOT operators.
The AND and OR operators are used to filter records based on more than one condition:
The AND operator displays a record if all the conditions separated by AND are TRUE.
The OR operator displays a record if any of the conditions separated by OR is TRUE.
The NOT operator displays a record if the condition(s) is NOT TRUE.
AND Syntax
SELECT column1, column2, ...
FROM table_name
WHERE condition1 AND condition2 AND condition3 ...;
OR Syntax
SELECT column1, column2, ...
FROM table_name
WHERE condition1 OR condition2 OR condition3 ...;
NOT Syntax
SELECT column1, column2, ...
FROM table_name
WHERE NOT condition;
Demo Database
The table below shows the complete "Customers" table from the Northwind sample database:
3 Antonio Moreno Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico
Taquería
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
7 Blondel père et fils Frédérique Citeaux 24, place Kléber Strasbourg 67000 France
9 Bon app' Laurence Lebihans 12, rue des Marseille 13008 France
Bouchers
23
10 Bottom-Dollar Elizabeth Lincoln 23 Tsawassen Tsawassen T2F 8M4 Canada
Marketse Blvd.
12 Cactus Comidas Patricio Simpson Cerrito 333 Buenos Aires 1010 Argentina
para llevar
15 Comércio Mineiro Pedro Afonso Av. dos Lusíadas, São Paulo 05432-043 Brazil
23
18 Du monde entier Janine Labrune 67, rue des Nantes 44000 France
Cinquante Otages
21 Familia Arquibaldo Aria Cruz Rua Orós, 92 São Paulo 05442-030 Brazil
26 France restauration Carine Schmitt 54, rue Royale Nantes 44000 France
27 Franchi S.p.A. Paolo Accorti Via Monte Bianco Torino 10100 Italy
34
28 Furia Bacalhau e Lino Rodriguez Jardim das rosas Lisboa 1675 Portugal
Frutos do Mar n. 32
30 Godos Cocina Típica José Pedro Freyre C/ Romero, 33 Sevilla 41101 Spain
32 Great Lakes Food Howard Snyder 2732 Baker Blvd. Eugene 97403 USA
Market
24
33 GROSELLA- Manuel Pereira 5ª Ave. Los Palos Caracas 1081 Venezuela
Restaurante Grandes
36 Hungry Coyote Yoshi Latimer City Center Plaza Elgin 97827 USA
Import Store 516 Main St.
42 Laughing Bacchus Yoshi Tannamuri 1900 Oak St. Vancouver V3F 2K1 Canada
Wine Cellars
45 Let's Stop N Shop Jaime Yorres 87 Polk St. Suite San 94117 USA
5 Francisco
51 Mère Paillarde Jean Fresnière 43 rue St. Laurent Montréal H1J 1C3 Canada
25
53 North/South Simon Crowther South House 300 London SW7 1RZ UK
Queensbridge
54 Océano Atlántico Yvonne Moncada Ing. Gustavo Buenos Aires 1010 Argentina
Ltda. Moncada 8585
Piso 20-A
55 Old World Rene Phillips 2743 Bering St. Anchorage 99508 USA
Delicatessen
58 Pericles Comidas Guillermo Calle Dr. Jorge México D.F. 05033 Mexico
clásicas Fernández Cash 321
62 Queen Cozinha Lúcia Carvalho Alameda dos São Paulo 05487-020 Brazil
Canàrios, 891
64 Rancho grande Sergio Gutiérrez Av. del Libertador Buenos Aires 1010 Argentina
900
65 Rattlesnake Canyon Paula Wilson 2817 Milton Dr. Albuquerque 87110 USA
Grocery
71 Save-a-lot Markets Jose Pavarotti 187 Suffolk Ln. Boise 83720 USA
72 Seven Seas Imports Hari Kumar 90 Wadhurst Rd. London OX15 4NB UK
26
75 Split Rail Beer & Ale Art P.O. Box 555 Lander 82520 USA
Braunschweiger
77 The Big Cheese Liz Nixon 89 Jefferson Way Portland 97201 USA
Suite 2
78 The Cracker Box Liu Wong 55 Grizzly Peak Butte 59801 USA
Rd.
80 Tortuga Miguel Angel Avda. Azteca 123 México D.F. 05033 Mexico
Restaurante Paolino
82 Trail's Head Helvetius Nagy 722 DaVinci Blvd. Kirkland 98034 USA
Gourmet
Provisioners
86 Die Wandernde Kuh Rita Müller Adenauerallee 900 Stuttgart 70563 Germany
89 White Clover Karl Jablonski 305 - 14th Ave. S. Seattle 98128 USA
Markets Suite 3B
AND Example
The following SQL statement selects all fields from "Customers" where country is "Germany" AND city is
"Berlin":
Example
SELECT * FROM Customers
WHERE Country='Germany' AND City='Berlin';
27
1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
OR Example
The following SQL statement selects all fields from "Customers" where city is "Berlin" OR "München":
Example
SELECT * FROM Customers
WHERE City='Berlin' OR City='München';
The following SQL statement selects all fields from "Customers" where country is "Germany" OR
"Spain":
Example
SELECT * FROM Customers
WHERE Country='Germany' OR Country='Spain';
28
39 Königlich Essen Philip Cramer Maubelstr. 90 Brandenburg 14776 Germany
NOT Example
The following SQL statement selects all fields from "Customers" where country is NOT "Germany":
Example
SELECT * FROM Customers
WHERE NOT Country='Germany';
29
7 Blondel père et Frédérique 24, place Strasbourg 67000 France
fils Citeaux Kléber
30
20 Ernst Handel Roland Mendel Kirchgasse 6 Graz 8010 Austria
31
34 Hanari Carnes Mario Pontes Rua do Paço, Rio de 05454-876 Brazil
67 Janeiro
32
47 LINO- Felipe Izquierdo Ave. 5 de Mayo I. de 4980 Venezuela
Delicateses Porlamar Margarita
51 Mère Paillarde Jean Fresnière 43 rue St. Montréal H1J 1C3 Canada
Laurent
55 Old World Rene Phillips 2743 Bering St. Anchorage 99508 USA
Delicatessen
33
61 Que Delícia Bernardo Rua da Rio de 02389-673 Brazil
Batista Panificadora, Janeiro
12
62 Queen Cozinha Lúcia Carvalho Alameda dos São Paulo 05487-020 Brazil
Canàrios, 891
34
74 Spécialités du Dominique 25, rue Paris 75016 France
monde Perrier Lauriston
75 Split Rail Beer Art P.O. Box 555 Lander 82520 USA
& Ale Braunschweiger
35
89 White Clover Karl Jablonski 305 - 14th Ave. Seattle 98128 USA
Markets S. Suite 3B
The following SQL statement selects all fields from "Customers" where country is "Germany" AND city
must be "Berlin" OR "München" (use parenthesis to form complex expressions):
Example
SELECT * FROM Customers
WHERE Country='Germany' AND (City='Berlin' OR City='München');
The following SQL statement selects all fields from "Customers" where country is NOT "Germany" and
NOT "USA":
Example
SELECT * FROM Customers
WHERE NOT Country='Germany' AND NOT Country='USA';
Customer CustomerNa ContactNa Address City PostalCo Country
ID me me de
36
5 Berglunds Christina Berguvsväge Luleå S-958 22 Sweden
snabbköp Berglund n8
37
23 Folies Martine 184, Lille 59000 France
gourmandes Rancé chaussée de
Tournai
38
42 Laughing Yoshi 1900 Oak Vancouver V3F 2K1 Canada
Bacchus Wine Tannamuri St.
Cellars
39
64 Rancho Sergio Av. del Buenos 1010 Argentina
grande Gutiérrez Libertador Aires
900
40
90 Wilman Kala Matti Keskuskatu Helsinki 21240 Finland
Karttunen 45
EXERCISES:
1. Select all records where the City column has the value "Berlin".
SELECT * FROM Customers _____ ____ = ________;
2. Use the NOT keyword to select all records where City is NOT "Berlin".
SELECT * FROM Customers _____ ___ ____ = ________;
3. Select all records where the CustomerID column has the value 32.
SELECT * FROM Customers _____ CustomerID _ ____;
4. Select all records where the City column has the value 'Berlin' and the PostalCode column has
the value 12209.
______ * from Customers _____ City = ‘Berlin’ ___ ___________ = 12209;
5. Select all records where the City column has the value 'Berlin' or 'London'.
6. ______ * from Customers _____ City = ‘Berlin’ __ ____ = ‘London’;
ORDER BY Syntax
Demo Database
Below is a selection from the "Customers" table in the Northwind sample database:
41
2 Ana Trujillo Ana Trujillo Avda. de la México 05021 Mexico
Emparedados y Constitución D.F.
helados 2222
4 Around the Horn Thomas Hardy 120 Hanover London WA1 1DP UK
Sq.
ORDER BY Example
The following SQL statement selects all customers from the "Customers" table, sorted by the "Country"
column:
Example
SELECT * FROM Customers
ORDER BY Country;
CustomerID CustomerName ContactName Address City PostalCode Country
42
15 Comércio Pedro Afonso Av. dos São Paulo 05432-043 Brazil
Mineiro Lusíadas, 23
62 Queen Cozinha Lúcia Carvalho Alameda dos São Paulo 05487-020 Brazil
Canàrios, 891
51 Mère Paillarde Jean Fresnière 43 rue St. Montréal H1J 1C3 Canada
Laurent
43
18 Du monde entier Janine Labrune 67, rue des Nantes 44000 France
Cinquante
Otages
44
86 Die Wandernde Rita Müller Adenauerallee Stuttgart 70563 Germany
Kuh 900
58 Pericles Comidas Guillermo Calle Dr. Jorge México D.F. 05033 Mexico
clásicas Fernández Cash 321
45
69 Romero y tomillo Alejandra Gran Vía, 1 Madrid 28001 Spain
Camino
4 Around the Horn Thomas Hardy 120 Hanover London WA1 1DP UK
Sq.
46
65 Rattlesnake Paula Wilson 2817 Milton Albuquerque 87110 USA
Canyon Grocery Dr.
75 Split Rail Beer & Art P.O. Box 555 Lander 82520 USA
Ale Braunschweiger
78 The Cracker Box Liu Wong 55 Grizzly Peak Butte 59801 USA
Rd.
Example
SELECT * FROM Customers
ORDER BY Country DESC;
CustomerID CustomerName ContactName Address City PostalCode Country
47
Soublette #8-
35
75 Split Rail Beer & Art P.O. Box 555 Lander 82520 USA
Ale Braunschweiger
78 The Cracker Box Liu Wong 55 Grizzly Peak Butte 59801 USA
Rd.
4 Around the Horn Thomas Hardy 120 Hanover London WA1 1DP UK
Sq.
48
11 B's Beverages Victoria Fauntleroy London EC2 5NT UK
Ashworth Circus
49
70 Santé Gourmet Jonas Erling Skakkes Stavern 4110 Norway
Bergulfsen gate 78
58 Pericles Comidas Guillermo Calle Dr. Jorge México D.F. 05033 Mexico
clásicas Fernández Cash 321
50
63 QUICK-Stop Horst Kloss Taucherstraße Cunewalde 01307 Germany
10
18 Du monde entier Janine Labrune 67, rue des Nantes 44000 France
Cinquante
Otages
51
42 Laughing Yoshi 1900 Oak St. Vancouver V3F 2K1 Canada
Bacchus Wine Tannamuri
Cellars
51 Mère Paillarde Jean Fresnière 43 rue St. Montréal H1J 1C3 Canada
Laurent
62 Queen Cozinha Lúcia Carvalho Alameda dos São Paulo 05487-020 Brazil
Canàrios, 891
52
ORDER BY Several Columns Example
The following SQL statement selects all customers from the "Customers" table, sorted by the "Country"
and the "CustomerName" column. This means that it orders by Country, but if some rows have the same
Country, it orders them by CustomerName:
Example
SELECT * FROM Customers
ORDER BY Country, CustomerName;
CustomerID CustomerName ContactName Address City PostalCode Country
62 Queen Cozinha Lúcia Carvalho Alameda dos São Paulo 05487-020 Brazil
Canàrios, 891
53
81 Tradição Anabela Av. Inês de São Paulo 05634-030 Brazil
Hipermercados Domingues Castro, 414
51 Mère Paillarde Jean Fresnière 43 rue St. Montréal H1J 1C3 Canada
Laurent
18 Du monde entier Janine Labrune 67, rue des Nantes 44000 France
Cinquante
Otages
54
85 Vins et alcools Paul Henriot 59 rue de Reims 51100 France
Chevalier l'Abbaye
55
13 Centro comercial Francisco Sierras de México D.F. 05022 Mexico
Moctezuma Chang Granada 9993
58 Pericles Comidas Guillermo Calle Dr. Jorge México D.F. 05033 Mexico
clásicas Fernández Cash 321
4 Around the Horn Thomas Hardy 120 Hanover London WA1 1DP UK
Sq.
56
19 Eastern Ann Devon 35 King London WX3 6FW UK
Connection George
75 Split Rail Beer & Art P.O. Box 555 Lander 82520 USA
Ale Braunschweiger
78 The Cracker Box Liu Wong 55 Grizzly Peak Butte 59801 USA
Rd.
57
33 GROSELLA- Manuel Pereira 5ª Ave. Los Caracas 1081 Venezuela
Restaurante Palos Grandes
Example
SELECT * FROM Customers
ORDER BY Country ASC, CustomerName DESC;
58
67 Ricardo Janete Limeira Av. Rio de 02389-890 Brazil
Adocicados Copacabana, Janeiro
267
62 Queen Cozinha Lúcia Carvalho Alameda dos São Paulo 05487-020 Brazil
Canàrios, 891
51 Mère Paillarde Jean Fresnière 43 rue St. Montréal H1J 1C3 Canada
Laurent
59
40 La corne Daniel Tonini 67, avenue de Versailles 78000 France
d'abondance l'Europe
18 Du monde entier Janine Labrune 67, rue des Nantes 44000 France
Cinquante
Otages
60
49 Magazzini Giovanni Via Ludovico il Bergamo 24100 Italy
Alimentari Rovelli Moro 22
Riuniti
58 Pericles Comidas Guillermo Calle Dr. Jorge México D.F. 05033 Mexico
clásicas Fernández Cash 321
61
68 Richter Michael Holz Grenzacherweg Genève 1203 Switzerland
Supermarkt 237
4 Around the Horn Thomas Hardy 120 Hanover London WA1 1DP UK
Sq.
78 The Cracker Box Liu Wong 55 Grizzly Peak Butte 59801 USA
Rd.
75 Split Rail Beer & Art P.O. Box 555 Lander 82520 USA
Ale Braunschweiger
62
48 Lonesome Pine Fran Wilson 89 Chiaroscuro Portland 97219 USA
Restaurant Rd.
EXERCISES:
1. Select all records from the Customers table, sort the result alphabetically by the column City.
SELECT * FROM Customers _____ __ ____;
2. Select all records from the Customers table, sort the result reversed alphabetically by the
column City.
SELECT * FROM Customers _____ __ ____ ____;
3. Select all records from the Customers table, sort the result alphabetically, first by the column
Country, then, by the column City.
SELECT * FROM Customers _____ __ ________ ____;
63
The first way specifies both the column names and the values to be inserted:
If you are adding values for all the columns of the table, you do not need to specify the column names in
the SQL query. However, make sure the order of the values is in the same order as the columns in the
table. The INSERT INTO syntax would be as follows:
Demo Database
Below is a selection from the "Customers" table in the Northwind sample database:
Example
INSERT INTO Customers (CustomerName, ContactName, Address, City,
PostalCode, Country)
VALUES ('Cardinal', 'Tom B. Erichsen', 'Skagen
21', 'Stavanger', '4006', 'Norway');
64
CustomerID CustomerName ContactName Address City PostalCode Country
89 White Clover Karl Jablonski 305 - 14th Ave. Seattle 98128 USA
Markets S. Suite 3B
Did you notice that we did not insert any number into the CustomerID field?
The CustomerID column is an auto-increment field and will be generated automatically when a new
record is inserted into the table.
Example
INSERT INTO Customers (CustomerName, City, Country)
VALUES ('Cardinal', 'Stavanger', 'Norway');
The selection from the "Customers" table will now look like this:
65
90 Wilman Kala Matti Keskuskatu Helsinki 21240 Finland
Karttunen 45
EXERCISES:
______ ____ Customers (CustomerName, Address, City, PostalCode, Country _ ______ _'Hekkan
Burger','Gateveien 15','Sandnes','4306','Norway');
If a field in a table is optional, it is possible to insert a new record or update a record without adding a
value to this field. Then, the field will be saved with a NULL value.
Note: A NULL value is different from a zero value or a field that contains spaces. A field with a NULL
value is one that has been left blank during record creation!
We will have to use the IS NULL and IS NOT NULL operators instead.
IS NULL Syntax
SELECT column_names
FROM table_name
WHERE column_name IS NULL;
66
SELECT column_names
FROM table_name
WHERE column_name IS NOT NULL;
Demo Database
Below is a selection from the "Customers" table in the Northwind sample database:
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
The following SQL lists all customers with a NULL value in the "Address" field:
Example
SELECT CustomerName, ContactName, Address
FROM Customers
WHERE Address IS NULL;
No result.
67
The IS NOT NULL Operator
The IS NOT NULL operator is used to test for non-empty values (NOT NULL values).
The following SQL lists all customers with a value in the "Address" field:
Example
SELECT CustomerName, ContactName, Address
FROM Customers
WHERE Address IS NOT NULL;
68
Folies gourmandes Martine Rancé 184, chaussée de Tournai
Hungry Coyote Import Store Yoshi Latimer City Center Plaza 516 Main St.
LILA-Supermercado Carlos González Carrera 52 con Ave. Bolívar #65-98 Llano Largo
69
Morgenstern Gesundkost Alexander Feuer Heerstr. 22
Océano Atlántico Ltda. Yvonne Moncada Ing. Gustavo Moncada 8585 Piso 20-A
Pericles Comidas clásicas Guillermo Fernández Calle Dr. Jorge Cash 321
Split Rail Beer & Ale Art Braunschweiger P.O. Box 555
70
Tradição Hipermercados Anabela Domingues Av. Inês de Castro, 414
EXERCISES:
1. Select all records from the Customers where the PostalCode column is empty.
SELECT * FROM Customers WHERE __________ __ ____ ;
2. Select all records from the Customers where the PostalCode column is NOT empty.
SELECT * FROM Customers WHERE __________ __ ___ ____;
UPDATE Syntax
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
Note: Be careful when updating records in a table! Notice the WHERE clause in the UPDATE statement.
The WHERE clause specifies which record(s) that should be updated. If you omit the WHERE clause, all
records in the table will be updated!
Demo Database
Below is a selection from the "Customers" table in the Northwind sample database:
71
1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
UPDATE Table
The following SQL statement updates the first customer (CustomerID = 1) with a new contact person
and a new city.
Example
UPDATE Customers
SET ContactName = 'Alfred Schmidt', City= 'Frankfurt'
WHERE CustomerID = 1;
The selection from the "Customers" table will now look like this:
72
2 Ana Trujillo Ana Trujillo Avda. de la México 05021 Mexico
Emparedados y Constitución D.F.
helados 2222
4 Around the Horn Thomas Hardy 120 Hanover London WA1 1DP UK
Sq.
The following SQL statement will update the contactname to "Juan" for all records where country is
"Mexico":
Example
UPDATE Customers
SET ContactName='Juan'
WHERE Country='Mexico';
The selection from the "Customers" table will now look like this:
73
2 Ana Trujillo Juan Avda. de la México 05021 Mexico
Emparedados y Constitución D.F.
helados 2222
4 Around the Horn Thomas Hardy 120 Hanover London WA1 1DP UK
Sq.
Update Warning!
Be careful when updating records. If you omit the WHERE clause, ALL records will be updated!
Example
UPDATE Customers
SET ContactName='Juan';
The selection from the "Customers" table will now look like this:
74
3 Antonio Moreno Juan Mataderos 2312 México 05023 Mexico
Taquería D.F.
4 Around the Horn Juan 120 Hanover Sq. London WA1 1DP UK
EXERCISES:
DELETE Syntax
DELETE FROM table_name WHERE condition;
Note: Be careful when deleting records in a table! Notice the WHERE clause in the DELETE statement.
The WHERE clause specifies which record(s) should be deleted. If you omit the WHERE clause, all records
in the table will be deleted!
Demo Database
Below is a selection from the "Customers" table in the Northwind sample database:
75
2 Ana Trujillo Emparedados Ana Trujillo Avda. de la México 05021 Mexico
y helados Constitución 2222 D.F.
4 Around the Horn Thomas 120 Hanover Sq. London WA1 1DP UK
Hardy
Example
DELETE FROM Customers WHERE CustomerName='Alfreds Futterkiste';
4 Around the Horn Thomas Hardy 120 Hanover London WA1 1DP UK
Sq.
76
5 Berglunds snabbköp Christina Berguvsvägen Luleå S-958 22 Sweden
Berglund 8
The following SQL statement deletes all rows in the "Customers" table, without deleting the table:
Example
DELETE FROM Customers;
EXERCISES:
1. Delete all the records from the Customers table where the Country value is 'Norway'.
______ ____ Customers _____ Country = 'Norway';
2. Delete all the records from the Customers table.
______ ____ Customers;
The SELECT TOP clause is used to specify the number of records to return.
The SELECT TOP clause is useful on large tables with thousands of records. Returning a large number of
records can impact performance.
Note: Not all database systems support the SELECT TOP clause. MySQL supports the LIMIT clause to
select a limited number of records, while Oracle uses ROWNUM.
MySQL Syntax:
SELECT column_name(s)
FROM table_name
WHERE condition
LIMIT number;
77
Oracle Syntax:
SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number;
Demo Database
Below is a selection from the "Customers" table in the Northwind sample database:
4 Around the Horn Thomas Hardy 120 Hanover London WA1 1DP UK
Sq.
Example
SELECT TOP 3 * FROM Customers;
The following SQL statement shows the equivalent example using the LIMIT clause (for MySQL):
Example
78
SELECT * FROM Customers
LIMIT 3;
The following SQL statement shows the equivalent example using ROWNUM (for Oracle):
Example
SELECT * FROM Customers
WHERE ROWNUM <= 3;
Example
SELECT TOP 50 PERCENT * FROM Customers;
Example
SELECT TOP 3 * FROM Customers
WHERE Country='Germany';
The following SQL statement shows the equivalent example using the LIMIT clause (for MySQL):
Example
SELECT * FROM Customers
WHERE Country='Germany'
LIMIT 3;
The following SQL statement shows the equivalent example using ROWNUM (for Oracle):
Example
SELECT * FROM Customers
WHERE Country='Germany' AND ROWNUM <= 3;
The MAX() function returns the largest value of the selected column.
MIN() Syntax
79
SELECT MIN(column_name)
FROM table_name
WHERE condition;
MAX() Syntax
SELECT MAX(column_name)
FROM table_name
WHERE condition;
Demo Database
Below is a selection from the "Products" table in the Northwind sample database:
1 Chais 1 1 10 boxes x 20 18
bags
2 Chang 1 1 24 - 12 oz 19
bottles
MIN() Example
The following SQL statement finds the price of the cheapest product:
Example
SELECT MIN(Price) AS SmallestPrice
FROM Products;
Number of Records: 1
80
SmallestPrice
2.5
MAX() Example
The following SQL statement finds the price of the most expensive product:
Example
SELECT MAX(Price) AS LargestPrice
FROM Products;
Number of Records: 1
LargestPrice
263.5
COUNT() Syntax
SELECT COUNT(column_name)
FROM table_name
WHERE condition;
AVG() Syntax
SELECT AVG(column_name)
FROM table_name
WHERE condition;
SUM() Syntax
SELECT SUM(column_name)
FROM table_name
WHERE condition;
Demo Database
Below is a selection from the "Products" table in the Northwind sample database:
81
1 Chais 1 1 10 boxes x 20 18
bags
2 Chang 1 1 24 - 12 oz 19
bottles
COUNT() Example
The following SQL statement finds the number of products:
Example
SELECT COUNT(ProductID)
FROM Products;
AVG() Example
The following SQL statement finds the average price of all products:
Example
SELECT AVG(Price)
FROM Products;
Demo Database
Below is a selection from the "OrderDetails" table in the Northwind sample database:
82
1 10248 11 12
2 10248 42 10
3 10248 72 5
4 10249 14 9
5 10249 51 40
SUM() Example
The following SQL statement finds the sum of the "Quantity" fields in the "OrderDetails" table:
Example
SELECT SUM(Quantity)
FROM OrderDetails;
EXERCISES:
1. Use the MIN function to select the record with the smallest value of the Price column.
SELECT __________ FROM Products;
2. Use an SQL function to select the record with the highest value of the Price column.
SELECT __________ FROM Products;
3. Use the correct function to return the number of records that have the Price value set to 18.
SELECT _____ (*) FROM Products _____ Price = 18;
4. Use an SQL function to calculate the average price of all products.
SELECT __________ FROM Products;
5. Use an SQL function to calculate the sum of all the Price column values in the Products table.
SELECT __________ FROM Products;
83
There are two wildcards often used in conjunction with the LIKE operator:
Note: MS Access uses an asterisk (*) instead of the percent sign (%), and a question mark (?) instead of
the underscore (_).
The percent sign and the underscore can also be used in combinations!
LIKE Syntax
SELECT column1, column2, ...
FROM table_name
WHERE columnN LIKE pattern;
Tip: You can also combine any number of conditions using AND or OR operators.
Here are some examples showing different LIKE operators with '%' and '_' wildcards:
WHERE CustomerName LIKE Finds any values that start with "a"
'a%'
WHERE CustomerName LIKE Finds any values that end with "a"
'%a'
WHERE CustomerName LIKE Finds any values that have "or" in any position
'%or%'
WHERE CustomerName LIKE Finds any values that have "r" in the second position
'_r%'
WHERE CustomerName LIKE Finds any values that start with "a" and are at least 2
'a_%' characters in length
84
WHERE CustomerName LIKE Finds any values that start with "a" and are at least 3
'a__%' characters in length
WHERE ContactName LIKE Finds any values that start with "a" and ends with "o"
'a%o'
Demo Database
The table below shows the complete "Customers" table from the Northwind sample database:
85
6 Blauer See Hanna Moos Forsterstr. Mannheim 68306 Germany
Delikatessen 57
86
15 Comércio Pedro Afonso Av. dos São Paulo 05432- Brazil
Mineiro Lusíadas, 23 043
87
24 Folk och fä Maria Åkergatan Bräcke S-844 67 Sweden
HB Larsson 24
88
33 GROSELLA- Manuel 5ª Ave. Los Caracas 1081 Venezuel
Restaurante Pereira Palos a
Grandes
89
41 La maison Annette 1 rue Toulouse 31000 France
d'Asie Roulet Alsace-
Lorraine
90
49 Magazzini Giovanni Via Ludovico Bergamo 24100 Italy
Alimentari Rovelli il Moro 22
Riuniti
91
58 Pericles Guillermo Calle Dr. México 05033 Mexico
Comidas Fernández Jorge Cash D.F.
clásicas 321
92
66 Reggiani Maurizio Strada Reggio 42100 Italy
Caseifici Moroni Provinciale Emilia
124
93
75 Split Rail Beer Art P.O. Box Lander 82520 USA
& Ale Braunschwei 555
ger
94
84 Victuailles en Mary 2, rue du Lyon 69004 France
stock Saveley Commerce
Example
SELECT * FROM Customers
WHERE CustomerName LIKE 'a%';
95
The following SQL statement selects all customers with a CustomerName ending with "a":
Example
SELECT * FROM Customers
WHERE CustomerName LIKE '%a';
The following SQL statement selects all customers with a CustomerName that have "or" in any position:
Example
SELECT * FROM Customers
WHERE CustomerName LIKE '%or%';
The following SQL statement selects all customers with a CustomerName that have "r" in the second
position:
Example
SELECT * FROM Customers
WHERE CustomerName LIKE '_r%';
The following SQL statement selects all customers with a CustomerName that starts with "a" and are at
least 3 characters in length:
Example
SELECT * FROM Customers
WHERE CustomerName LIKE 'a__%';
The following SQL statement selects all customers with a ContactName that starts with "a" and ends
with "o":
Example
SELECT * FROM Customers
WHERE ContactName LIKE 'a%o';
The following SQL statement selects all customers with a CustomerName that does NOT start with "a":
Example
SELECT * FROM Customers
WHERE CustomerName NOT LIKE 'a%';
EXERCISES:
1. Select all records where the value of the City column starts with the letter "a".
SELECT * FROM Customers _____ ____ ____ ____;
2. Select all records where the value of the City column ends with the letter "a".
SELECT * FROM Customers _____ ____ ____ ____;
3. Select all records where the value of the City column contains the letter "a".
SELECT * FROM Customers _____ ____ ____ ______;
96
4. Select all records where the value of the City column starts with letter "a" and ends with the
letter "b".
SELECT * FROM Customers _____ ____ ____ ______;
5. Select all records where the value of the City column does NOT start with the letter "a".
SELECT * FROM Customers _____ ____ ____ ____;
SQL Wildcards
SQL Wildcard Characters
A wildcard character is used to substitute one or more characters in a string.
Wildcard characters are used with the SQL LIKE operator. The LIKE operator is used in a WHERE clause to
search for a specified pattern in a column.
* Represents zero or more characters bl* finds bl, black, blue, and blob
[] Represents any single character h[oa]t finds hot and hat, but not hit
within the brackets
! Represents any character not in the h[!oa]t finds hit, but not hot and hat
brackets
# Represents any single numeric 2#5 finds 205, 215, 225, 235, 245, 255, 265,
character 275, 285, and 295
97
Wildcard Characters in SQL Server
% Represents zero or more characters bl% finds bl, black, blue, and blob
[] Represents any single character within the h[oa]t finds hot and hat, but not
brackets hit
^ Represents any character not in the brackets h[^oa]t finds hit, but not hot and
hat
Here are some examples showing different LIKE operators with '%' and '_' wildcards:
WHERE CustomerName LIKE Finds any values that starts with "a"
'a%'
WHERE CustomerName LIKE Finds any values that ends with "a"
'%a'
98
WHERE CustomerName LIKE Finds any values that have "or" in any position
'%or%'
WHERE CustomerName LIKE Finds any values that have "r" in the second position
'_r%'
WHERE CustomerName LIKE Finds any values that starts with "a" and are at least 3
'a_%_%' characters in length
WHERE ContactName LIKE Finds any values that starts with "a" and ends with "o"
'a%o'
Example
SELECT * FROM Customers
WHERE City LIKE 'ber%';
The following SQL statement selects all customers with a City containing the pattern "es":
Example
SELECT * FROM Customers
WHERE City LIKE '%es%';
Example
SELECT * FROM Customers
WHERE City LIKE '_ondon';
The following SQL statement selects all customers with a City starting with "L", followed by any
character, followed by "n", followed by any character, followed by "on":
Example
SELECT * FROM Customers
WHERE City LIKE 'L_n_on';
99
Using the [charlist] Wildcard
The following SQL statement selects all customers with a City starting with "b", "s", or "p":
Example
SELECT * FROM Customers
WHERE City LIKE '[bsp]%';
The following SQL statement selects all customers with a City starting with "a", "b", or "c":
Example
SELECT * FROM Customers
WHERE City LIKE '[a-c]%';
Example
SELECT * FROM Customers
WHERE City LIKE '[!bsp]%';
Or:
Example
SELECT * FROM Customers
WHERE City NOT LIKE '[bsp]%';
EXERCISES:
1. Select all records where the second letter of the City is an "a".
SELECT * FROM Customers WHERE City LIKE ' __%';
2. Select all records where the first letter of the City is an "a" or a "c" or an "s".
SELECT * FROM Customers WHERE City LIKE ' _____%';
3. Select all records where the first letter of the City starts with anything from an "a" to an "f".
SELECT * FROM Customers WHERE City LIKE '_____%';
4. Select all records where the first letter of the City is NOT an "a" or a "c" or an "f".
5. SELECT * FROM Customers WHERE City LIKE '_____%';
SQL IN Operator
The SQL IN Operator
The IN operator allows you to specify multiple values in a WHERE clause.
IN Syntax
100
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, ...);
or:
SELECT column_name(s)
FROM table_name
WHERE column_name IN (SELECT STATEMENT);
IN Operator Examples
The following SQL statement selects all customers that are located in "Germany", "France" or "UK":
Example
SELECT * FROM Customers
WHERE Country IN ('Germany', 'France', 'UK');
The following SQL statement selects all customers that are NOT located in "Germany", "France" or "UK":
Example
SELECT * FROM Customers
WHERE Country NOT IN ('Germany', 'France', 'UK');
The following SQL statement selects all customers that are from the same countries as the suppliers:
Example
SELECT * FROM Customers
WHERE Country IN (SELECT Country FROM Suppliers);
EXERCISES:
1. Use the IN operator to select all the records where Country is either "Norway" or "France".
SELECT * FROM Customers _____ _______ __ __________ ‘France’ _;
2. Use the IN operator to select all the records where Country is NOT "Norway" and NOT "France".
SELECT * FROM Customers _____ _______ ___ __ ('Norway', 'France');
BETWEEN Syntax
SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
101
Demo Database
Below is a selection from the "Products" table in the Northwind sample database:
1 Chais 1 1 10 boxes x 20 18
bags
2 Chang 1 1 24 - 12 oz 19
bottles
BETWEEN Example
The following SQL statement selects all products with a price BETWEEN 10 and 20:
Example
SELECT * FROM Products
WHERE Price BETWEEN 10 AND 20;
Example
SELECT * FROM Products
WHERE Price NOT BETWEEN 10 AND 20;
102
BETWEEN with IN Example
The following SQL statement selects all products with a price BETWEEN 10 and 20. In addition; do not
show products with a CategoryID of 1,2, or 3:
Example
SELECT * FROM Products
WHERE Price BETWEEN 10 AND 20
AND CategoryID NOT IN (1,2,3);
Example
SELECT * FROM Products
WHERE ProductName BETWEEN 'Carnarvon Tigers' AND 'Mozzarella di Giovanni'
ORDER BY ProductName;
The following SQL statement selects all products with a ProductName BETWEEN Carnarvon Tigers and
Chef Anton's Cajun Seasoning:
Example
SELECT * FROM Products
WHERE ProductName BETWEEN "Carnarvon Tigers" AND "Chef Anton's Cajun
Seasoning"
ORDER BY ProductName;
Example
SELECT * FROM Products
WHERE ProductName NOT BETWEEN 'Carnarvon Tigers' AND 'Mozzarella di
Giovanni'
ORDER BY ProductName;
Sample Table
Below is a selection from the "Orders" table in the Northwind sample database:
103
10248 90 5 7/4/1996 3
10249 81 6 7/5/1996 1
10250 34 4 7/8/1996 2
10251 84 3 7/9/1996 1
10252 76 4 7/10/1996 2
Example
SELECT * FROM Orders
WHERE OrderDate BETWEEN #01/07/1996# AND #31/07/1996#;
OR
EXERCISES:
1. Use the BETWEEN operator to select all the records where the value of the Price column is
between 10 and 20.
SELECT * FROM Products WHERE Price _______ __ ___ __;
2. Use the BETWEEN operator to select all the records where the value of the Price column is NOT
between 10 and 20.
SELECT * FROM Products WHERE Price ___ _______ __ ___ __;
3. Use the BETWEEN operator to select all the records where the value of the ProductName
column is alphabetically between 'Geitost' and 'Pavlova'.
SELECT * FROM Products WHERE ProductName BETWEEN 'Geitost' AND 'Pavlova';
104
SQL Aliases
SQL Aliases
SQL aliases are used to give a table, or a column in a table, a temporary name.
Aliases are often used to make column names more readable.
An alias only exists for the duration of the query.
Demo Database
In this tutorial we will use the well-known Northwind sample database.
105
10354 58 8 1996-11-14 3
10355 4 6 1996-11-15 1
10356 86 6 1996-11-18 2
Example
SELECT CustomerID AS ID, CustomerName AS Customer
FROM Customers;
The following SQL statement creates two aliases, one for the CustomerName column and one for the
ContactName column. Note: It requires double quotation marks or square brackets if the alias name
contains spaces:
Example
SELECT CustomerName AS Customer, ContactName AS [Contact Person]
FROM Customers;
The following SQL statement creates an alias named "Address" that combine four columns (Address,
PostalCode, City and Country):
Example
SELECT CustomerName, Address + ', ' + PostalCode + ' ' + City + ', ' +
Country AS Address
FROM Customers;
Note: To get the SQL statement above to work in MySQL use the following:
106
Example
SELECT o.OrderID, o.OrderDate, c.CustomerName
FROM Customers AS c, Orders AS o
WHERE c.CustomerName='Around the Horn' AND c.CustomerID=o.CustomerID;
The following SQL statement is the same as above, but without aliases:
Example
SELECT Orders.OrderID, Orders.OrderDate, Customers.CustomerName
FROM Customers, Orders
WHERE Customers.CustomerName='Around the
Horn' AND Customers.CustomerID=Orders.CustomerID;
EXERCISES:
1. When displaying the Customers table, make an ALIAS of the PostalCode column, the column
should be called Pno instead.
SELECT CustomerName, Address, PostalCode __ ___ FROM Customers;
2. When displaying the Customers table, refer to the table as Consumers instead of Customers.
SELECT * FROM Customers __ __________;
SQL Joins
SQL JOIN
A JOIN clause is used to combine rows from two or more tables, based on a related column between
them.
10308 2 1996-09-18
10309 37 1996-09-19
107
10310 77 1996-09-20
Notice that the "CustomerID" column in the "Orders" table refers to the "CustomerID" in the
"Customers" table. The relationship between the two tables above is the "CustomerID" column.
Then, we can create the following SQL statement (that contains an INNER JOIN), that selects records
that have matching values in both tables:
Example
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
108
10365 Antonio Moreno Taquería 11/27/1996
(INNER) JOIN: Returns records that have matching values in both tables
LEFT (OUTER) JOIN: Returns all records from the left table, and the matched records from the
right table
RIGHT (OUTER) JOIN: Returns all records from the right table, and the matched records from
the left table
FULL (OUTER) JOIN: Returns all records when there is a match in either left or right table
109
SQL INNER JOIN Keyword
SQL INNER JOIN Keyword
The INNER JOIN keyword selects records that have matching values in both tables.
Demo Database
In this tutorial we will use the well-known Northwind sample database.
10308 2 7 1996-09-18 3
10309 37 3 1996-09-19 1
10310 77 8 1996-09-20 2
110
1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
Example
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
Note: The INNER JOIN keyword selects all rows from both tables as long as there is a match between the
columns. If there are records in the "Orders" table that do not have matches in "Customers", these
orders will not be shown!
Example
SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName
FROM ((Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID)
INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID);
111
LEFT JOIN table2
ON table1.column_name = table2.column_name;
Demo Database
In this tutorial we will use the well-known Northwind sample database.
10308 2 7 1996-09-18 3
112
10309 37 3 1996-09-19 1
10310 77 8 1996-09-20 2
Example
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerName;
Note: The LEFT JOIN keyword returns all records from the left table (Customers), even if there are no
matches in the right table (Orders).
Demo Database
In this tutorial we will use the well-known Northwind sample database.
113
OrderID CustomerID EmployeeID OrderDate ShipperID
10308 2 7 1996-09-18 3
10309 37 3 1996-09-19 1
10310 77 8 1996-09-20 2
Example
SELECT Orders.OrderID, Employees.LastName, Employees.FirstName
FROM Orders
RIGHT JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
ORDER BY Orders.OrderID;
Note: The RIGHT JOIN keyword returns all records from the right table (Employees), even if there are no
matches in the left table (Orders).
114
SQL FULL OUTER JOIN Keyword
SQL FULL OUTER JOIN Keyword
The FULL OUTER JOIN keyword returns all records when there is a match in left (table1) or right (table2)
table records.
Note: FULL OUTER JOIN can potentially return very large result-sets!
Tip: FULL OUTER JOIN and FULL JOIN are the same.
Demo Database
In this tutorial we will use the well-known Northwind sample database.
115
3 Antonio Moreno Antonio Mataderos Méxic 05023 Mexico
Taquería Moreno 2312 o D.F.
10308 2 7 1996-09-18 3
10309 37 3 1996-09-19 1
10310 77 8 1996-09-20 2
CustomerName OrderID
116
Antonio Moreno Taquería 10365
Note: The FULL OUTER JOIN keyword returns all matching records from both tables whether the other
table matches or not. So, if there are rows in "Customers" that do not have matches in "Orders", or if
there are rows in "Orders" that do not have matches in "Customers", those rows will be listed as well.
Demo Database
In this tutorial we will use the well-known Northwind sample database.
117
Example
SELECT A.CustomerName AS CustomerName1,
B.CustomerName AS CustomerName2, A.City
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID
AND A.City = B.City
ORDER BY A.City;
UNION Syntax
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
Note: The column names in the result-set are usually equal to the column names in the first SELECT
statement in the UNION.
Demo Database
In this tutorial we will use the well-known Northwind sample database.
118
And a selection from the "Suppliers" table:
2 New Orleans Cajun Shelley Burke P.O. Box New 70117 USA
Delights 78934 Orleans
Example
SELECT City FROM Customers
UNION
SELECT City FROM Suppliers
ORDER BY City;
Note: If some customers or suppliers have the same city, each city will only be listed once, because
UNION selects only distinct values. Use UNION ALL to also select duplicate values!
Example
SELECT City FROM Customers
UNION ALL
SELECT City FROM Suppliers
ORDER BY City;
Example
SELECT City, Country FROM Customers
WHERE Country='Germany'
UNION
SELECT City, Country FROM Suppliers
119
WHERE Country='Germany'
ORDER BY City;
Example
SELECT City, Country FROM Customers
WHERE Country='Germany'
UNION ALL
SELECT City, Country FROM Suppliers
WHERE Country='Germany'
ORDER BY City;
Example
SELECT 'Customer' AS Type, ContactName, City, Country
FROM Customers
UNION
SELECT 'Supplier', ContactName, City, Country
FROM Suppliers;
Notice the "AS Type" above - it is an alias. SQL Aliases are used to give a table or a column a temporary
name. An alias only exists for the duration of the query. So, here we have created a temporary column
named "Type", that list whether the contact person is a "Customer" or a "Supplier".
EXERCISES:
1. Insert the missing parts in the JOIN clause to join the two tables Orders and Customers, using
the CustomerID field in both tables as the relationship between the two tables.
SELECT * FROM Orders LEFT JOIN Customers __ _______________________________________;
2. Choose the correct JOIN clause to select all records from the two tables where there is a match
in both tables.
SELECT * FROM Orders _____ ____ ________ ON Orders.CustomerID=Customers.CustomerID;
3. Choose the correct JOIN clause to select all the records from the Customers table plus all the
matches in the Orders table.
SELECT * FROM Orders _____ ____ __________ ON
Orders.CustomerID=Customers.CustomerID;
120
SQL GROUP BY Statement
The SQL GROUP BY Statement
The GROUP BY statement groups rows that have the same values into summary rows, like "find the
number of customers in each country".
The GROUP BY statement is often used with aggregate functions (COUNT, MAX, MIN, SUM, AVG) to
group the result-set by one or more columns.
GROUP BY Syntax
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);
Demo Database
Below is a selection from the "Customers" table in the Northwind sample database:
CustomerID CustomerName ContactName Address City PostalCode Country
4 Around the Horn Thomas 120 Hanover Sq. London WA1 1DP UK
Hardy
Example
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country;
The following SQL statement lists the number of customers in each country, sorted high to low:
Example
SELECT COUNT(CustomerID), Country
FROM Customers
121
GROUP BY Country
ORDER BY COUNT(CustomerID) DESC;
Demo Database
Below is a selection from the "Orders" table in the Northwind sample database:
OrderID CustomerID EmployeeID OrderDate ShipperID
10248 90 5 1996-07-04 3
10249 81 6 1996-07-05 1
10250 34 4 1996-07-08 2
ShipperID ShipperName
1 Speedy Express
2 United Package
3 Federal Shipping
Example
SELECT Shippers.ShipperName, COUNT(Orders.OrderID) AS NumberOfOrders FROM
Orders
LEFT JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID
GROUP BY ShipperName;
EXERCISES:
1. List the number of customers in each country.
SELECT _____ (CustomerID), Country FROM Customers _____ __ _____;
2. List the number of customers in each country, ordered by the country with the most customers
first.
SELECT _____ (CustomerID), Country FROM Customers _____ __ _____ ORDER BY
______________________;
HAVING Syntax
122
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);
Demo Database
Below is a selection from the "Customers" table in the Northwind sample database:
CustomerID CustomerName ContactName Address City PostalCode Country
Example
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5;
The following SQL statement lists the number of customers in each country, sorted high to low (Only
include countries with more than 5 customers):
Example
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5
ORDER BY COUNT(CustomerID) DESC;
123
Demo Database
Below is a selection from the "Orders" table in the Northwind sample database:
OrderID CustomerID EmployeeID OrderDate ShipperID
10248 90 5 1996-07-04 3
10249 81 6 1996-07-05 1
10250 34 4 1996-07-08 2
Example
SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrders
FROM (Orders
INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID)
GROUP BY LastName
HAVING COUNT(Orders.OrderID) > 10;
The following SQL statement lists if the employees "Davolio" or "Fuller" have registered more than 25
orders:
Example
SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrders
FROM Orders
INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
WHERE LastName = 'Davolio' OR LastName = 'Fuller'
GROUP BY LastName
HAVING COUNT(Orders.OrderID) > 25;
124
The EXISTS operator returns true if the subquery returns one or more records.
EXISTS Syntax
SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);
Demo Database
Below is a selection from the "Products" table in the Northwind sample database:
2 Chang 1 1 24 - 12 oz bottles 19
2 New Orleans Cajun Shelley Burke P.O. Box 78934 New 70117 USA
Delights Orleans
3 Grandma Kelly's Regina 707 Oxford Rd. Ann Arbor 48104 USA
Homestead Murphy
Example
SELECT SupplierName
FROM Suppliers
WHERE EXISTS (SELECT ProductName FROM Products WHERE Products.SupplierID =
Suppliers.supplierID AND Price < 20);
125
The following SQL statement returns TRUE and lists the suppliers with a product price equal to 22:
Example
SELECT SupplierName
FROM Suppliers
WHERE EXISTS (SELECT ProductName FROM Products WHERE Products.SupplierID =
Suppliers.supplierID AND Price = 22);
The ANY operator returns true if any of the subquery values meet the condition.
The ALL operator returns true if all of the subquery values meet the condition.
ANY Syntax
SELECT column_name(s)
FROM table_name
WHERE column_name operator ANY
(SELECT column_name FROM table_name WHERE condition);
ALL Syntax
SELECT column_name(s)
FROM table_name
WHERE column_name operator ALL
(SELECT column_name FROM table_name WHERE condition);
Note: The operator must be a standard comparison operator (=, <>, !=, >, >=, <, or <=).
Demo Database
Below is a selection from the "Products" table in the Northwind sample database:
2 Chang 1 1 24 - 12 oz bottles 19
126
OrderDetailID OrderID ProductID Quantity
1 10248 11 12
2 10248 42 10
3 10248 72 5
4 10249 14 9
5 10249 51 40
The following SQL statement returns TRUE and lists the product names if it finds ANY records in the
OrderDetails table that quantity = 10:
Example
SELECT ProductName
FROM Products
WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE Quantity
= 10);
The following SQL statement returns TRUE and lists the product names if it finds ANY records in the
OrderDetails table that quantity > 99:
Example
SELECT ProductName
FROM Products
WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE Quantity
> 99);
The following SQL statement returns TRUE and lists the product names if ALL the records in the
OrderDetails table has quantity = 10 (so, this example will return FALSE, because not ALL records in the
OrderDetails table has quantity = 10):
Example
SELECT ProductName
FROM Products
WHERE ProductID = ALL (SELECT ProductID FROM OrderDetails WHERE Quantity
= 10);
127
SQL SELECT INTO Statement
The SQL SELECT INTO Statement
The SELECT INTO statement copies data from one table into a new table.
The new table will be created with the column-names and types as defined in the old table. You can
create new column names using the AS clause.
The following SQL statement uses the IN clause to copy the table into a new table in another database:
The following SQL statement copies only a few columns into a new table:
The following SQL statement copies only the German customers into a new table:
The following SQL statement copies data from more than one table into a new table:
128
SELECT Customers.CustomerName, Orders.OrderID
INTO CustomersOrderBackup2017
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
Tip: SELECT INTO can also be used to create a new, empty table using the schema of another. Just add a
WHERE clause that causes the query to return no data:
INSERT INTO SELECT requires that data types in source and target tables match
The existing records in the target table are unaffected
Copy only some columns from one table into another table:
Demo Database
In this tutorial we will use the well-known Northwind sample database.
129
3 Antonio Moreno Taquería Antonio Mataderos 2312 México 05023 Mexico
Moreno D.F.
2 New Orleans Cajun Delights Shelley Burke P.O. Box New 70117 USA
78934 Orleans
3 Grandma Kelly's Regina Murphy 707 Oxford Rd. Ann Arbor 48104 USA
Homestead
Example
INSERT INTO Customers (CustomerName, City, Country)
SELECT SupplierName, City, Country FROM Suppliers;
The following SQL statement copies "Suppliers" into "Customers" (fill all columns):
Example
INSERT INTO Customers (CustomerName, ContactName, Address, City,
PostalCode, Country)
SELECT SupplierName, ContactName, Address, City,
PostalCode, Country FROM Suppliers;
The following SQL statement copies only the German suppliers into "Customers":
Example
INSERT INTO Customers (CustomerName, City, Country)
SELECT SupplierName, City, Country FROM Suppliers
WHERE Country='Germany';
130
SQL CASE Statement
The SQL CASE Statement
The CASE statement goes through conditions and returns a value when the first condition is met (like an
IF-THEN-ELSE statement). So, once a condition is true, it will stop reading and return the result. If no
conditions are true, it returns the value in the ELSE clause.
CASE Syntax
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
WHEN conditionN THEN resultN
ELSE result
END;
Demo Database
Below is a selection from the "OrderDetails" table in the Northwind sample database:
1 10248 11 12
2 10248 42 10
3 10248 72 5
4 10249 14 9
5 10249 51 40
Example
SELECT OrderID, Quantity,
CASE
WHEN Quantity > 30 THEN 'The quantity is greater than 30'
WHEN Quantity = 30 THEN 'The quantity is 30'
ELSE 'The quantity is under 30'
END AS QuantityText
FROM OrderDetails;
The following SQL will order the customers by City. However, if City is NULL, then order by Country:
Example
131
SELECT CustomerName, City, Country
FROM Customers
ORDER BY
(CASE
WHEN City IS NULL THEN Country
ELSE City
END);
1 Jarlsberg 10.45 16 15
2 Mascarpone 32.56 23
3 Gorgonzola 15.67 9 20
Suppose that the "UnitsOnOrder" column is optional, and may contain NULL values.
In the example above, if any of the "UnitsOnOrder" values are NULL, the result will be NULL.
Solutions
MySQL
The MySQL IFNULL() function lets you return an alternative value if an expression is NULL:
132
SQL Server
The SQL Server ISNULL() function lets you return an alternative value when an expression is NULL:
MS Access
The MS Access IsNull() function returns TRUE (-1) if the expression is a null value, otherwise FALSE (0):
Oracle
So if you have an SQL query that you write over and over again, save it as a stored procedure, and then
just call it to execute it.
You can also pass parameters to a stored procedure, so that the stored procedure can act based on the
parameter value(s) that is passed.
EXEC procedure_name;
Demo Database
Below is a selection from the "Customers" table in the Northwind sample database:
133
CustomerID CustomerName ContactName Address City PostalCode Country
Example
CREATE PROCEDURE SelectAllCustomers
AS
SELECT * FROM Customers
GO;
Example
EXEC SelectAllCustomers;
Example
CREATE PROCEDURE SelectAllCustomers @City nvarchar(30)
AS
SELECT * FROM Customers WHERE City = @City
GO;
134
Example
EXEC SelectAllCustomers @City = 'London';
The following SQL statement creates a stored procedure that selects Customers from a particular City
with a particular PostalCode from the "Customers" table:
Example
CREATE PROCEDURE SelectAllCustomers @City nvarchar(30), @PostalCode
nvarchar(10)
AS
SELECT * FROM Customers WHERE City = @City AND PostalCode = @PostalCode
GO;
Example
EXEC SelectAllCustomers @City = 'London', @PostalCode = 'WA1 1DP';
SQL Comments
SQL Comments
Comments are used to explain sections of SQL statements, or to prevent execution of SQL statements.
Note: The examples in this chapter will not work in Firefox and Microsoft Edge!
Comments are not supported in Microsoft Access databases. Firefox and Microsoft Edge are using
Microsoft Access database in our examples.
Any text between -- and the end of the line will be ignored (will not be executed).
Example
--Select all:
SELECT * FROM Customers;
The following example uses a single-line comment to ignore the end of a line:
Example
135
SELECT * FROM Customers -- WHERE City='Berlin';
Example
--SELECT * FROM Customers;
SELECT * FROM Products;
Multi-line Comments
Multi-line comments start with /* and end with */.
Example
/*Select all the columns
of all the records
in the Customers table:*/
SELECT * FROM Customers;
Example
/*SELECT * FROM Customers;
SELECT * FROM Products;
SELECT * FROM Orders;
SELECT * FROM Categories;*/
SELECT * FROM Suppliers;
Example
SELECT CustomerName, /*City,*/ Country FROM Customers;
Example
SELECT * FROM Customers WHERE (CustomerName LIKE 'L%'
OR CustomerName LIKE 'R%' /*OR CustomerName LIKE 'S%'
OR CustomerName LIKE 'T%'*/ OR CustomerName LIKE 'W%')
AND Country='USA'
ORDER BY CustomerName;
136
SQL Operators
SQL Arithmetic Operators
Operator Description
+ Add
- Subtract
* Multiply
/ Divide
% Modulo
| Bitwise OR
^ Bitwise exclusive OR
= Equal to
+= Add equals
-= Subtract equals
137
*= Multiply equals
/= Divide equals
%= Modulo equals
138
MODULE 2: TABLE OF CONTENTS
Create DB 140
Drop DB 140
Backup DB 140
Create Table 141
Drop Table 143
Alter Table 143
Constraints 145
Not Null 146
Unique 147
Primary Key 148
Foreign Key 150
Check 152
Default 153
Index 155
Auto Increment 156
Dates 158
Views 160
Injection 162
Hosting 165
Data Types 166
References 172
139
SQL CREATE DATABASE Statement
The SQL CREATE DATABASE Statement
The CREATE DATABASE statement is used to create a new SQL database.
Syntax
CREATE DATABASE databasename;
Example
CREATE DATABASE testDB;
Tip: Make sure you have admin privilege before creating any database. Once a database is created, you
can check it in the list of databases with the following SQL command: SHOW DATABASES;
Syntax
DROP DATABASE databasename;
Note: Be careful before dropping a database. Deleting a database will result in loss of complete
information stored in the database!
Example
DROP DATABASE testDB;
Tip: Make sure you have admin privilege before dropping any database. Once a database is dropped,
you can check it in the list of databases with the following SQL command: SHOW DATABASES;
Syntax
140
BACKUP DATABASE databasename
TO DISK = 'filepath';
Syntax
BACKUP DATABASE databasename
TO DISK = 'filepath'
WITH DIFFERENTIAL;
Example
BACKUP DATABASE testDB
TO DISK = 'D:\backups\testDB.bak';
Tip: Always back up the database to a different drive than the actual database. Then, if you get a disk
crash, you will not lose your backup file along with the database.
Example
BACKUP DATABASE testDB
TO DISK = 'D:\backups\testDB.bak'
WITH DIFFERENTIAL;
Tip: A differential back up reduces the back up time (since only the changes are backed up).
Syntax
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
column3 datatype,
....
);
The column parameters specify the names of the columns of the table.
141
The datatype parameter specifies the type of data the column can hold (e.g. varchar, integer, date, etc.).
Tip: For an overview of the available data types, go to our complete Data Types Reference.
Example
CREATE TABLE Persons (
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
The LastName, FirstName, Address, and City columns are of type varchar and will hold characters, and
the maximum length for these fields is 255 characters.
Tip: The empty "Persons" table can now be filled with data with the SQL INSERT INTO statement.
A copy of an existing table can also be created using CREATE TABLE.
The new table gets the same column definitions. All columns or specific columns can be selected.
If you create a new table using an existing table, the new table will be filled with the existing values from
the old table.
Syntax
CREATE TABLE new_table_name AS
SELECT column1, column2,...
FROM existing_table_name
WHERE ....;
The following SQL creates a new table called "TestTables" (which is a copy of the "Customers" table):
Example
CREATE TABLE TestTable AS
SELECT customername, contactname
FROM customers;
142
SQL DROP TABLE Statement
The SQL DROP TABLE Statement
The DROP TABLE statement is used to drop an existing table in a database.
Syntax
DROP TABLE table_name;
Note: Be careful before dropping a table. Deleting a table will result in loss of complete information
stored in the table!
Example
DROP TABLE Shippers;
Syntax
TRUNCATE TABLE table_name;
Example
ALTER TABLE Customers
ADD Email varchar(255);
143
ALTER TABLE table_name
DROP COLUMN column_name;
The following SQL deletes the "Email" column from the "Customers" table:
Example
ALTER TABLE Customers
DROP COLUMN Email;
Notice that the new column, "DateOfBirth", is of type date and is going to hold a date. The data type
specifies what type of data the column can hold. For a complete reference of all the data types available
in MS Access, MySQL, and SQL Server, go to our complete Data Types reference.
144
1 Hansen Ola Timoteivn 10 Sandnes
Notice that the "DateOfBirth" column is now of type year and is going to hold a year in a two- or four-
digit format.
SQL Constraints
SQL constraints are used to specify rules for data in a table.
Syntax
CREATE TABLE table_name (
column1 datatype constraint,
column2 datatype constraint,
column3 datatype constraint,
145
....
);
SQL Constraints
SQL constraints are used to specify rules for the data in a table.
Constraints are used to limit the type of data that can go into a table. This ensures the accuracy and
reliability of the data in the table. If there is any violation between the constraint and the data action,
the action is aborted.
Constraints can be column level or table level. Column level constraints apply to a column, and table
level constraints apply to the whole table.
The NOT NULL constraint enforces a column to NOT accept NULL values.
This enforces a field to always contain a value, which means that you cannot insert a new record, or
update a record without adding a value to this field.
Example
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255) NOT NULL,
Age int
);
146
SQL NOT NULL on ALTER TABLE
To create a NOT NULL constraint on the "Age" column when the "Persons" table is already created, use
the following SQL:
MySQL:
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
UNIQUE (ID)
);
To name a UNIQUE constraint, and to define a UNIQUE constraint on multiple columns, use the
following SQL syntax:
147
CONSTRAINT UC_Person UNIQUE (ID,LastName)
);
To name a UNIQUE constraint, and to define a UNIQUE constraint on multiple columns, use the
following SQL syntax:
MySQL:
ALTER TABLE Persons
DROP INDEX UC_Person;
Primary keys must contain UNIQUE values, and cannot contain NULL values.
A table can have only ONE primary key; and in the table, this primary key can consist of single or
multiple columns (fields).
MySQL:
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
148
FirstName varchar(255),
Age int,
PRIMARY KEY (ID)
);
To allow naming of a PRIMARY KEY constraint, and for defining a PRIMARY KEY constraint on multiple
columns, use the following SQL syntax:
Note: In the example above there is only ONE PRIMARY KEY (PK_Person). However, the VALUE of the
primary key is made up of TWO COLUMNS (ID + LastName).
To allow naming of a PRIMARY KEY constraint, and for defining a PRIMARY KEY constraint on multiple
columns, use the following SQL syntax:
Note: If you use the ALTER TABLE statement to add a primary key, the primary key column(s) must
already have been declared to not contain NULL values (when the table was first created).
149
DROP a PRIMARY KEY Constraint
To drop a PRIMARY KEY constraint, use the following SQL:
MySQL:
ALTER TABLE Persons
DROP PRIMARY KEY;
"Persons" table:
PersonID LastName FirstName Age
1 Hansen Ola 30
2 Svendson Tove 23
3 Pettersen Kari 20
"Orders" table:
OrderID OrderNumber PersonID
1 77895 3
2 44678 3
3 22456 2
4 24562 1
Notice that the "PersonID" column in the "Orders" table points to the "PersonID" column in the
"Persons" table.
The "PersonID" column in the "Persons" table is the PRIMARY KEY in the "Persons" table.
The "PersonID" column in the "Orders" table is a FOREIGN KEY in the "Orders" table.
The FOREIGN KEY constraint is used to prevent actions that would destroy links between tables.
150
The FOREIGN KEY constraint also prevents invalid data from being inserted into the foreign key column,
because it has to be one of the values contained in the table it points to.
MySQL:
CREATE TABLE Orders (
OrderID int NOT NULL,
OrderNumber int NOT NULL,
PersonID int,
PRIMARY KEY (OrderID),
FOREIGN KEY (PersonID) REFERENCES Persons(PersonID)
);
To allow naming of a FOREIGN KEY constraint, and for defining a FOREIGN KEY constraint on multiple
columns, use the following SQL syntax:
To allow naming of a FOREIGN KEY constraint, and for defining a FOREIGN KEY constraint on multiple
columns, use the following SQL syntax:
151
ALTER TABLE Orders
ADD CONSTRAINT FK_PersonOrder
FOREIGN KEY (PersonID) REFERENCES Persons(PersonID);
MySQL:
ALTER TABLE Orders
DROP FOREIGN KEY FK_PersonOrder;
MySQL:
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
CHECK (Age>=18)
);
To allow naming of a CHECK constraint, and for defining a CHECK constraint on multiple columns, use
the following SQL syntax:
152
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
City varchar(255),
CONSTRAINT CHK_Person CHECK (Age>=18 AND City='Sandnes')
);
To allow naming of a CHECK constraint, and for defining a CHECK constraint on multiple columns, use
the following SQL syntax:
MySQL:
ALTER TABLE Persons
DROP CHECK CHK_PersonAge;
The default value will be added to all new records IF no other value is specified.
153
SQL DEFAULT on CREATE TABLE
The following SQL sets a DEFAULT value for the "City" column when the "Persons" table is created:
The DEFAULT constraint can also be used to insert system values, by using functions like GETDATE():
MySQL:
ALTER TABLE Persons
ALTER City SET DEFAULT 'Sandnes';
SQL Server:
ALTER TABLE Persons
ADD CONSTRAINT df_City
DEFAULT 'Sandnes' FOR City;
MS Access:
ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'Sandnes';
Oracle:
ALTER TABLE Persons
MODIFY City DEFAULT 'Sandnes';
MySQL:
ALTER TABLE Persons
ALTER City DROP DEFAULT;
154
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT;
Indexes are used to retrieve data from the database more quickly than otherwise. The users cannot see
the indexes, they are just used to speed up searches/queries.
Note: Updating a table with indexes takes more time than updating a table without (because the
indexes also need an update). So, only create indexes on columns that will be frequently searched
against.
Note: The syntax for creating indexes varies among different databases. Therefore: Check the syntax for
creating indexes in your database.
If you want to create an index on a combination of columns, you can list the column names within the
parentheses, separated by commas:
SQL Server:
DROP INDEX table_name.index_name;
DB2/Oracle:
DROP INDEX index_name;
MySQL:
ALTER TABLE table_name
DROP INDEX index_name;
Often this is the primary key field that we would like to be created automatically every time a new
record is inserted.
To insert a new record into the "Persons" table, we will NOT have to specify a value for the "Personid"
column (a unique value will be added automatically):
156
The SQL statement above would insert a new record into the "Persons" table. The "Personid" column
would be assigned a unique value. The "FirstName" column would be set to "Lars" and the "LastName"
column would be set to "Monsen".
The MS SQL Server uses the IDENTITY keyword to perform an auto-increment feature.
In the example above, the starting value for IDENTITY is 1, and it will increment by 1 for each new
record.
Tip: To specify that the "Personid" column should start at value 10 and increment by 5, change it to
IDENTITY(10,5).
To insert a new record into the "Persons" table, we will NOT have to specify a value for the "Personid"
column (a unique value will be added automatically):
The SQL statement above would insert a new record into the "Persons" table. The "Personid" column
would be assigned a unique value. The "FirstName" column would be set to "Lars" and the "LastName"
column would be set to "Monsen".
157
To insert a new record into the "Persons" table, we will NOT have to specify a value for the "Personid"
column (a unique value will be added automatically):
The SQL statement above would insert a new record into the "Persons" table. The "Personid" column
would be assigned a unique value. The "FirstName" column would be set to "Lars" and the "LastName"
column would be set to "Monsen".
You will have to create an auto-increment field with the sequence object (this object generates a
number sequence).
The code above creates a sequence object called seq_person, that starts with 1 and will increment by 1.
It will also cache up to 10 values for performance. The cache option specifies how many sequence values
will be stored in memory for faster access.
To insert a new record into the "Persons" table, we will have to use the nextval function (this function
retrieves the next value from seq_person sequence):
The SQL statement above would insert a new record into the "Persons" table. The "Personid" column
would be assigned the next number from the seq_person sequence. The "FirstName" column would be
set to "Lars" and the "LastName" column would be set to "Monsen".
As long as your data contains only the date portion, your queries will work as expected. However, if a
time portion is involved, it gets more complicated.
158
SQL Date Data Types
MySQL comes with the following data types for storing a date or a date/time value in the database:
SQL Server comes with the following data types for storing a date or a date/time value in the database:
Note: The date types are chosen for a column when you create a new table in your database!
1 Geitost 2008-11-11
Now we want to select the records with an OrderDate of "2008-11-11" from the table above.
1 Geitost 2008-11-11
Now, assume that the "Orders" table looks like this (notice the time component in the "OrderDate"
column):
159
OrderId ProductName OrderDate
we will get no result! This is because the query is looking only for dates with no time portion.
Tip: To keep your queries simple and easy to maintain, do not allow time components in your dates!
SQL Views
SQL CREATE VIEW Statement
In SQL, a view is a virtual table based on the result-set of an SQL statement.
A view contains rows and columns, just like a real table. The fields in a view are fields from one or more
real tables in the database.
You can add SQL functions, WHERE, and JOIN statements to a view and present the data as if the data
were coming from one single table.
Note: A view always shows up-to-date data! The database engine recreates the data, using the view's
SQL statement, every time a user queries a view.
Example
CREATE VIEW [Brazil Customers] AS
SELECT CustomerName, ContactName
FROM Customers
WHERE Country = 'Brazil';
160
We can query the view above as follows:
Example
SELECT * FROM [Brazil Customers];
The following SQL creates a view that selects every product in the "Products" table with a price higher
than the average price:
Example
CREATE VIEW [Products Above Average Price] AS
SELECT ProductName, Price
FROM Products
WHERE Price > (SELECT AVG(Price) FROM Products);
Example
SELECT * FROM [Products Above Average Price];
The following SQL adds the "City" column to the "Brazil Customers" view:
Example
CREATE OR REPLACE VIEW [Brazil Customers] AS
SELECT CustomerName, ContactName, City
FROM Customers
WHERE Country = 'Brazil';
Example
DROP VIEW [Brazil Customers];
161
SQL Injection
SQL Injection
SQL injection is a code injection technique that might destroy your database.
SQL injection is one of the most common web hacking techniques.
SQL injection is the placement of malicious code in SQL statements, via web page input.
Look at the following example which creates a SELECT statement by adding a variable (txtUserId) to a
select string. The variable is fetched from user input (getRequestString):
Example
txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;
The rest of this chapter describes the potential dangers of using user input in SQL statements.
If there is nothing to prevent a user from entering "wrong" input, the user can enter some "smart" input
like this:
UserId:
The SQL above is valid and will return ALL rows from the "Users" table, since OR 1=1 is always TRUE.
Does the example above look dangerous? What if the "Users" table contains names and passwords?
SELECT UserId, Name, Password FROM Users WHERE UserId = 105 or 1=1;
A hacker might get access to all the user names and passwords in a database, by simply inserting 105 OR
1=1 into the input field.
162
Username:
Password:
Example
uName = getRequestString("username");
uPass = getRequestString("userpassword");
sql = 'SELECT * FROM Users WHERE Name ="' + uName + '" AND Pass ="' +
uPass + '"'
Result
SELECT * FROM Users WHERE Name ="John Doe" AND Pass ="myPass"
A hacker might get access to user names and passwords in a database by simply inserting " OR ""=" into
the user name or password text box:
User Name:
Password:
The code at the server will create a valid SQL statement like this:
Result
SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""
The SQL above is valid and will return all rows from the "Users" table, since OR ""="" is always TRUE.
Example
SELECT * FROM Users; DROP TABLE Suppliers
Example
163
txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;
Result
SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers;
The SQL engine checks each parameter to ensure that it is correct for its column and are treated
literally, and not as part of the SQL to be executed.
Another Example
txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City)
Values(@0,@1,@2)";
db.Execute(txtSQL,txtNam,txtAdd,txtCit);
Examples
The following examples shows how to build parameterized queries in some common web languages.
SELECT STATEMENT IN ASP.NET:
txtUserId = getRequestString("UserId");
sql = "SELECT * FROM Customers WHERE CustomerId = @0";
command = new SqlCommand(sql);
command.Parameters.AddWithValue("@0",txtUserId);
command.ExecuteReader();
164
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City)
Values(@0,@1,@2)";
command = new SqlCommand(txtSQL);
command.Parameters.AddWithValue("@0",txtNam);
command.Parameters.AddWithValue("@1",txtAdd);
command.Parameters.AddWithValue("@2",txtCit);
command.ExecuteNonQuery();
SQL Hosting
SQL Hosting
If you want your web site to be able to store and retrieve data from a database, your web server should
have access to a database-system that uses the SQL language.
If your web server is hosted by an Internet Service Provider (ISP), you will have to look for SQL hosting
plans.
The most common SQL hosting databases are MS SQL Server, Oracle, MySQL, and MS Access.
MS SQL Server
Microsoft's SQL Server is a popular database software for database-driven web sites with high traffic.
SQL Server is a very powerful, robust and full featured SQL database system.
Oracle
Oracle is also a popular database software for database-driven web sites with high traffic.
Oracle is a very powerful, robust and full featured SQL database system.
MySQL
MySQL is also a popular database software for web sites.
MySQL is a very powerful, robust and full featured SQL database system.
MySQL is an inexpensive alternative to the expensive Microsoft and Oracle solutions.
Access
When a web site requires only a simple database, Microsoft Access can be a solution.
Access is not well suited for very high-traffic, and not as powerful as MySQL, SQL Server, or Oracle.
165
SQL Data Types for MySQL, SQL Server, and MS Access
The data type of a column defines what value the column can hold: integer, character, money, date and
time, binary, and so on.
An SQL developer must decide what type of data that will be stored inside each column when creating a
table. The data type is a guideline for SQL to understand what type of data is expected inside of each
column, and it also identifies how SQL will interact with the stored data.
Note: Data types might have different names in different database. And even if the name is the same,
the size and other details may be different! Always check the documentation!
CHAR(size) A FIXED length string (can contain letters, numbers, and special
characters). The size parameter specifies the column length in
characters - can be from 0 to 255. Default is 1
VARCHAR(size) A VARIABLE length string (can contain letters, numbers, and special
characters). The size parameter specifies the maximum column length
in characters - can be from 0 to 65535
BINARY(size) Equal to CHAR(), but stores binary byte strings. The size parameter
specifies the column length in bytes. Default is 1
TINYBLOB For BLOBs (Binary Large OBjects). Max length: 255 bytes
BLOB(size) For BLOBs (Binary Large OBjects). Holds up to 65,535 bytes of data
166
LONGTEXT Holds a string with a maximum length of 4,294,967,295 characters
ENUM(val1, val2, val3, ...) A string object that can have only one value, chosen from a list of
possible values. You can list up to 65535 values in an ENUM list. If a
value is inserted that is not in the list, a blank value will be inserted.
The values are sorted in the order you enter them
SET(val1, val2, val3, ...) A string object that can have 0 or more values, chosen from a list of
possible values. You can list up to 64 values in a SET list
BIT(size) A bit-value type. The number of bits per value is specified in size.
The size parameter can hold a value from 1 to 64. The default value
for size is 1.
TINYINT(size) A very small integer. Signed range is from -128 to 127. Unsigned range
is from 0 to 255. The size parameter specifies the maximum display
width (which is 255)
SMALLINT(size) A small integer. Signed range is from -32768 to 32767. Unsigned range
is from 0 to 65535. The size parameter specifies the maximum display
width (which is 255)
167
FLOAT(size, d) A floating point number. The total number of digits is specified in size.
The number of digits after the decimal point is specified in
the d parameter. This syntax is deprecated in MySQL 8.0.17, and it will
be removed in future MySQL versions
DOUBLE PRECISION(size, d)
Note: All the numeric data types may have an extra option: UNSIGNED or ZEROFILL. If you add the
UNSIGNED option, MySQL disallows negative values for the column. If you add the ZEROFILL option,
MySQL automatically also adds the UNSIGNED attribute to the column.
168
TIME(fsp) A time. Format: hh:mm:ss. The supported range is from '-838:59:59'
to '838:59:59'
169
Numeric data types:
Data type Description Storage
float(n) Floating precision number data from -1.79E + 308 to 1.79E + 308. 4 or 8
The n parameter indicates whether the field should hold 4 or 8 bytes. bytes
float(24) holds a 4-byte field and float(53) holds an 8-byte field.
Default value of n is 53.
170
datetime From January 1, 1753 to December 31, 9999 with an accuracy of 3.33 8 bytes
milliseconds
datetime2 From January 1, 0001 to December 31, 9999 with an accuracy of 100 6-8
nanoseconds bytes
smalldatetime From January 1, 1900 to June 6, 2079 with an accuracy of 1 minute 4 bytes
date Store a date only. From January 1, 0001 to December 31, 9999 3 bytes
datetimeoffset The same as datetime2 with the addition of a time zone offset 8-10
bytes
timestamp Stores a unique number that gets updated every time a row gets
created or modified. The timestamp value is based upon an internal
clock and does not correspond to real time. Each table may have only
one timestamp variable
sql_variant Stores up to 8,000 bytes of data of various data types, except text, ntext, and
timestamp
Text Use for text or combinations of text and numbers. 255 characters
maximum
171
Integer Allows whole numbers between -32,768 and 32,767 2 bytes
Currency Use for currency. Holds up to 15 digits of whole dollars, plus 4 decimal 8 bytes
places. Tip: You can choose which country's currency to use
AutoNumber AutoNumber fields automatically give each record its own number, 4 bytes
usually starting at 1
Ole Object Can store pictures, audio, video, or other BLOBs (Binary Large OBjects) up to
1GB
Lookup Wizard Let you type a list of options, which can then be chosen from a drop- 4 bytes
down list
REFERENCES
https://www.w3schools.com/sql/default.asp
172