Introduction To SQL
Introduction To SQL
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
SELECT * FROM Customers;
Try it Yourself »
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 tutorial we will use the well-known Northwind sample database (included in MS
Access and MS SQL Server).
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
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
SELECT * FROM Customers;
Try it Yourself »
In this tutorial we will teach you all about the different SQL statements.
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 tutorial, we will use semicolon at the end of each SQL statement.
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
SELECT column1, column2, ...
FROM table_name;
Here, column1, column2, ... are the field names of the table you want to select data from. If
you want to select all the fields available in the table, use the following syntax:
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 Hardy 120 Hanover Sq. London WA1 1DP UK
Example
SELECT CustomerName, City FROM Customers;
Try it Yourself »
SELECT * Example
The following SQL statement selects all the columns from the "Customers" table:
Example
SELECT * FROM Customers;
Try it Yourself »
Exercise:
Insert the missing statement to get all the columns from the Customers table.
* FROM Customers;
Submit Answer »
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
Try it Yourself »
Now, let us use the SELECT DISTINCT statement and see the result.
Example
SELECT DISTINCT Country FROM Customers;
Try it Yourself »
The following SQL statement lists the number of different (distinct) customer countries:
Example
SELECT COUNT(DISTINCT Country) FROM Customers;
Try it Yourself »
Example
SELECT Count(*) AS DistinctCountries
FROM (SELECT DISTINCT Country FROM Customers);
Try it Yourself »
Exercises
Exercise:
Select all the different values from the Country column in the Customers table.
Submit Answer »
WHERE Syntax
SELECT column1, column2, ...
FROM table_name
WHERE condition;
Note: The WHERE clause is not only used in SELECT statements, it is also used
in UPDATE, DELETE, etc.!
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 Hardy 120 Hanover Sq. London WA1 1DP UK
Example
SELECT * FROM Customers
WHERE Country='Mexico';
Try it Yourself »
Text Fields vs. Numeric Fields
SQL requires single quotes around text values (most database systems will also allow
double quotes).
Example
SELECT * FROM Customers
WHERE CustomerID=1;
Try it Yourself »
= Equal Try it
<> Not equal. Note: In some versions of SQL this operator may be Try it
written as !=
Submit Answer »
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.
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:
2 Ana Trujillo Ana Trujillo Avda. de la Constitución México D.F. 05021 Mex
Emparedados y helados 2222
3 Antonio Moreno Antonio Moreno Mataderos 2312 México D.F. 05023 Mex
Taquería
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
7 Blondel père et fils Frédérique 24, place Kléber Strasbourg 67000 Fran
Citeaux
9 Bon app' Laurence 12, rue des Bouchers Marseille 13008 Fran
Lebihans
12 Cactus Comidas para Patricio Simpson Cerrito 333 Buenos Aires 1010 Arge
llevar
13 Centro comercial Francisco Chang Sierras de Granada 9993 México D.F. 05022 Mex
Moctezuma
15 Comércio Mineiro Pedro Afonso Av. dos Lusíadas, 23 São Paulo 05432-043 Braz
18 Du monde entier Janine Labrune 67, rue des Cinquante Nantes 44000 Fran
Otages
21 Familia Arquibaldo Aria Cruz Rua Orós, 92 São Paulo 05442-030 Braz
23 Folies gourmandes Martine Rancé 184, chaussée de Tournai Lille 59000 Fran
26 France restauration Carine Schmitt 54, rue Royale Nantes 44000 Fran
27 Franchi S.p.A. Paolo Accorti Via Monte Bianco 34 Torino 10100 Italy
28 Furia Bacalhau e Frutos Lino Rodriguez Jardim das rosas n. 32 Lisboa 1675 Port
do Mar
30 Godos Cocina Típica José Pedro Freyre C/ Romero, 33 Sevilla 41101 Spai
31 Gourmet Lanchonetes André Fonseca Av. Brasil, 442 Campinas 04876-786 Braz
32 Great Lakes Food Howard Snyder 2732 Baker Blvd. Eugene 97403 USA
Market
33 GROSELLA-Restaurante Manuel Pereira 5ª Ave. Los Palos Grandes Caracas 1081 Vene
35 HILARIÓN-Abastos Carlos Hernández Carrera 22 con Ave. Carlos San Cristóbal 5022 Vene
Soublette #8-35
36 Hungry Coyote Import Yoshi Latimer City Center Plaza 516 Main Elgin 97827 USA
Store St.
38 Island Trading Helen Bennett Garden House Crowther Cowes PO31 7PJ UK
Way
40 La corne d'abondance Daniel Tonini 67, avenue de l'Europe Versailles 78000 Fran
41 La maison d'Asie Annette Roulet 1 rue Alsace-Lorraine Toulouse 31000 Fran
42 Laughing Bacchus Wine Yoshi Tannamuri 1900 Oak St. Vancouver V3F 2K1 Cana
Cellars
43 Lazy K Kountry Store John Steel 12 Orchestra Terrace Walla Walla 99362 USA
45 Let's Stop N Shop Jaime Yorres 87 Polk St. Suite 5 San Francisco 94117 USA
46 LILA-Supermercado Carlos González Carrera 52 con Ave. Bolívar Barquisimeto 3508 Vene
#65-98 Llano Largo
49 Magazzini Alimentari Giovanni Rovelli Via Ludovico il Moro 22 Bergamo 24100 Italy
Riuniti
50 Maison Dewey Catherine Dewey Rue Joseph-Bens 532 Bruxelles B-1180 Belg
51 Mère Paillarde Jean Fresnière 43 rue St. Laurent Montréal H1J 1C3 Cana
54 Océano Atlántico Ltda. Yvonne Moncada Ing. Gustavo Moncada 8585 Buenos Aires 1010 Arge
Piso 20-A
55 Old World Delicatessen Rene Phillips 2743 Bering St. Anchorage 99508 USA
57 Paris spécialités Marie Bertrand 265, boulevard Charonne Paris 75012 Fran
58 Pericles Comidas Guillermo Calle Dr. Jorge Cash 321 México D.F. 05033 Mex
clásicas Fernández
60 Princesa Isabel Vinhoss Isabel de Castro Estrada da saúde n. 58 Lisboa 1756 Port
61 Que Delícia Bernardo Batista Rua da Panificadora, 12 Rio de 02389-673 Braz
Janeiro
62 Queen Cozinha Lúcia Carvalho Alameda dos Canàrios, 891 São Paulo 05487-020 Braz
64 Rancho grande Sergio Gutiérrez Av. del Libertador 900 Buenos Aires 1010 Arge
65 Rattlesnake Canyon Paula Wilson 2817 Milton Dr. Albuquerque 87110 USA
Grocery
66 Reggiani Caseifici Maurizio Moroni Strada Provinciale 124 Reggio Emilia 42100 Italy
67 Ricardo Adocicados Janete Limeira Av. Copacabana, 267 Rio de 02389-890 Braz
Janeiro
70 Santé Gourmet Jonas Bergulfsen Erling Skakkes gate 78 Stavern 4110 Norw
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
76 Suprêmes délices Pascale Cartrain Boulevard Tirou, 255 Charleroi B-6000 Belg
77 The Big Cheese Liz Nixon 89 Jefferson Way Suite 2 Portland 97201 USA
78 The Cracker Box Liu Wong 55 Grizzly Peak Rd. Butte 59801 USA
80 Tortuga Restaurante Miguel Angel Avda. Azteca 123 México D.F. 05033 Mex
Paolino
81 Tradição Anabela Av. Inês de Castro, 414 São Paulo 05634-030 Braz
Hipermercados Domingues
82 Trail's Head Gourmet Helvetius Nagy 722 DaVinci Blvd. Kirkland 98034 USA
Provisioners
86 Die Wandernde Kuh Rita Müller Adenauerallee 900 Stuttgart 70563 Germ
89 White Clover Markets Karl Jablonski 305 - 14th Ave. S. Suite 3B Seattle 98128 USA
ADVERTISEMENT
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';
Try it Yourself »
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';
Try it Yourself »
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';
Try it Yourself »
NOT Example
The following SQL statement selects all fields from "Customers" where country is NOT
"Germany":
Example
SELECT * FROM Customers
WHERE NOT Country='Germany';
Try it Yourself »
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');
Try it Yourself »
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';
Try it Yourself »
Exercise:
Select all records where the City column has the value 'Berlin' and the PostalCode column has
the value 12209.
* FROM Customers
City = 'Berlin'
= 12209;
Submit Answer »
The ORDER BY keyword sorts the records in ascending order by default. To sort the records
in descending order, use the DESC keyword.
ORDER BY Syntax
SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ... ASC|DESC;
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 Hardy 120 Hanover Sq. London WA1 1DP UK
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;
Try it Yourself »
ORDER BY DESC Example
The following SQL statement selects all customers from the "Customers" table, sorted
DESCENDING by the "Country" column:
Example
SELECT * FROM Customers
ORDER BY Country DESC;
Try it Yourself »
Example
SELECT * FROM Customers
ORDER BY Country, CustomerName;
Try it Yourself »
Example
SELECT * FROM Customers
ORDER BY Country ASC, CustomerName DESC;
Try it Yourself »
Test
Exercise:
Select all records from the Customers table, sort the result alphabetically by the column City.
Submit Answer »
2. 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. Here, the INSERT INTO syntax would be as follows:
INSERT INTO table_name
VALUES (value1, value2, value3, ...);
Demo Database
Below is a selection from the "Customers" table in the Northwind sample database:
89 White Clover Markets Karl Jablonski 305 - 14th Ave. S. Suite 3B Seattle 98128 USA
Example
INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
VALUES ('Cardinal', 'Tom B. Erichsen', 'Skagen 21', 'Stavanger', '4006', 'Norway');
Try it Yourself »
The selection from the "Customers" table will now look like this:
89 White Clover Markets Karl Jablonski 305 - 14th Ave. S. Suite 3B Seattle 98128 USA
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.
The following SQL statement will insert a new record, but only insert data in the
"CustomerName", "City", and "Country" columns (CustomerID will be updated
automatically):
Example
INSERT INTO Customers (CustomerName, City, Country)
VALUES ('Cardinal', 'Stavanger', 'Norway');
Try it Yourself »
The selection from the "Customers" table will now look like this:
89 White Clover Markets Karl Jablonski 305 - 14th Ave. S. Suite 3B Seattle 98128 USA
Customers
CustomerName,
Address,
City,
PostalCode,
Country
'Hekkan Burger',
'Gateveien 15',
'Sandnes',
'4306',
'Norway' ;
Submit Answer »
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;
IS NOT NULL Syntax
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;
Try it Yourself »
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;
Try it Yourself »
Submit Answer »
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:
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;
Try it Yourself »
The selection from the "Customers" table will now look like this:
CustomerID CustomerName ContactName Address City PostalCode Country
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
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';
Try it Yourself »
The selection from the "Customers" table will now look like this:
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
Example
UPDATE Customers
SET ContactName='Juan';
Try it Yourself »
The selection from the "Customers" table will now look like this:
4 Around the Horn Juan 120 Hanover Sq. London WA1 1DP UK
Customers
City = 'Oslo';
Submit Answer »
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:
CustomerID CustomerName ContactName Address City PostalCode Country
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
Example
DELETE FROM Customers WHERE CustomerName='Alfreds Futterkiste';
Try it Yourself »
The "Customers" table will now look like this:
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
The following SQL statement deletes all rows in the "Customers" table, without deleting the
table:
Example
DELETE FROM Customers;
Try it Yourself »
Test Yourself With Exercises
Exercise:
Delete all the records from the Customers table where the Country value is 'Norway'.
Customers
Country = 'Norway';
Submit Answer »
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 FETCH
FIRST n ROWS ONLY and ROWNUM.
MySQL Syntax:
SELECT column_name(s)
FROM table_name
WHERE condition
LIMIT number;
Oracle 12 Syntax:
SELECT column_name(s)
FROM table_name
ORDER BY column_name(s)
FETCH FIRST number ROWS ONLY;
SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number;
SELECT *
FROM (SELECT column_name(s) FROM table_name ORDER BY column_name(s))
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 Sq. London WA1 1DP UK
Example
SELECT TOP 3 * FROM Customers;
Try it Yourself »
The following SQL statement shows the equivalent example for MySQL:
Example
SELECT * FROM Customers
LIMIT 3;
Try it Yourself »
The following SQL statement shows the equivalent example for Oracle:
Example
SELECT * FROM Customers
FETCH FIRST 3 ROWS ONLY;
Example
SELECT TOP 50 PERCENT * FROM Customers;
Try it Yourself »
The following SQL statement shows the equivalent example for Oracle:
Example
SELECT * FROM Customers
FETCH FIRST 50 PERCENT ROWS ONLY;
Try it Yourself »
The following SQL statement shows the equivalent example for MySQL:
Example
SELECT * FROM Customers
WHERE Country='Germany'
LIMIT 3;
Try it Yourself »
The following SQL statement shows the equivalent example for Oracle:
Example
SELECT * FROM Customers
WHERE Country='Germany'
FETCH FIRST 3 ROWS ONLY;
The MAX() function returns the largest value of the selected column.
MIN() Syntax
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:
2 Chang 1 1 24 - 12 oz bottles 19
Example
SELECT MIN(Price) AS SmallestPrice
FROM Products;
Try it Yourself »
MAX() Example
The following SQL statement finds the price of the most expensive product:
Example
SELECT MAX(Price) AS LargestPrice
FROM Products;
Try it Yourself »
Test
Exercise:
Use the MIN function to select the record with the smallest value of the Price column.
SELECT
FROM Products;
Submit Answer »
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:
2 Chang 1 1 24 - 12 oz bottles 19
COUNT() Example
The following SQL statement finds the number of products:
Example
SELECT COUNT(ProductID)
FROM Products;
Try it Yourself »
Note: NULL values are not counted.
AVG() Example
The following SQL statement finds the average price of all products:
Example
SELECT AVG(Price)
FROM Products;
Try it Yourself »
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
SUM() Example
The following SQL statement finds the sum of the "Quantity" fields in the "OrderDetails"
table:
Example
SELECT SUM(Quantity)
FROM OrderDetails;
Try it Yourself »
Test Yourself
Exercise:
Use the correct function to return the number of records that have the Price value set to 18.
SELECT (*)
FROM Products
Price = 18;
Submit Answer »
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 characters
'a_%' in length
WHERE CustomerName LIKE Finds any values that start with "a" and are at least 3 characters
'a__%' in length
WHERE ContactName LIKE 'a%o' Finds any values that start with "a" and ends with "o"
Demo Database
The table below shows the complete "Customers" table from the Northwind sample
database:
2 Ana Trujillo Ana Trujillo Avda. de la Constitución México D.F. 05021 Mex
Emparedados y helados 2222
3 Antonio Moreno Antonio Moreno Mataderos 2312 México D.F. 05023 Mex
Taquería
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
7 Blondel père et fils Frédérique 24, place Kléber Strasbourg 67000 Fran
Citeaux
9 Bon app' Laurence 12, rue des Bouchers Marseille 13008 Fran
Lebihans
12 Cactus Comidas para Patricio Simpson Cerrito 333 Buenos Aires 1010 Arge
llevar
13 Centro comercial Francisco Chang Sierras de Granada 9993 México D.F. 05022 Mex
Moctezuma
15 Comércio Mineiro Pedro Afonso Av. dos Lusíadas, 23 São Paulo 05432-043 Braz
18 Du monde entier Janine Labrune 67, rue des Cinquante Nantes 44000 Fran
Otages
21 Familia Arquibaldo Aria Cruz Rua Orós, 92 São Paulo 05442-030 Braz
23 Folies gourmandes Martine Rancé 184, chaussée de Tournai Lille 59000 Fran
26 France restauration Carine Schmitt 54, rue Royale Nantes 44000 Fran
27 Franchi S.p.A. Paolo Accorti Via Monte Bianco 34 Torino 10100 Italy
28 Furia Bacalhau e Frutos Lino Rodriguez Jardim das rosas n. 32 Lisboa 1675 Port
do Mar
30 Godos Cocina Típica José Pedro Freyre C/ Romero, 33 Sevilla 41101 Spai
31 Gourmet Lanchonetes André Fonseca Av. Brasil, 442 Campinas 04876-786 Braz
32 Great Lakes Food Howard Snyder 2732 Baker Blvd. Eugene 97403 USA
Market
33 GROSELLA-Restaurante Manuel Pereira 5ª Ave. Los Palos Grandes Caracas 1081 Vene
35 HILARIÓN-Abastos Carlos Hernández Carrera 22 con Ave. Carlos San Cristóbal 5022 Vene
Soublette #8-35
36 Hungry Coyote Import Yoshi Latimer City Center Plaza 516 Main Elgin 97827 USA
Store St.
38 Island Trading Helen Bennett Garden House Crowther Cowes PO31 7PJ UK
Way
40 La corne d'abondance Daniel Tonini 67, avenue de l'Europe Versailles 78000 Fran
42 Laughing Bacchus Wine Yoshi Tannamuri 1900 Oak St. Vancouver V3F 2K1 Cana
Cellars
43 Lazy K Kountry Store John Steel 12 Orchestra Terrace Walla Walla 99362 USA
45 Let's Stop N Shop Jaime Yorres 87 Polk St. Suite 5 San Francisco 94117 USA
46 LILA-Supermercado Carlos González Carrera 52 con Ave. Bolívar Barquisimeto 3508 Vene
#65-98 Llano Largo
49 Magazzini Alimentari Giovanni Rovelli Via Ludovico il Moro 22 Bergamo 24100 Italy
Riuniti
50 Maison Dewey Catherine Dewey Rue Joseph-Bens 532 Bruxelles B-1180 Belg
51 Mère Paillarde Jean Fresnière 43 rue St. Laurent Montréal H1J 1C3 Cana
54 Océano Atlántico Ltda. Yvonne Moncada Ing. Gustavo Moncada 8585 Buenos Aires 1010 Arge
Piso 20-A
55 Old World Delicatessen Rene Phillips 2743 Bering St. Anchorage 99508 USA
57 Paris spécialités Marie Bertrand 265, boulevard Charonne Paris 75012 Fran
58 Pericles Comidas Guillermo Calle Dr. Jorge Cash 321 México D.F. 05033 Mex
clásicas Fernández
60 Princesa Isabel Vinhoss Isabel de Castro Estrada da saúde n. 58 Lisboa 1756 Port
62 Queen Cozinha Lúcia Carvalho Alameda dos Canàrios, 891 São Paulo 05487-020 Braz
63 QUICK-Stop Horst Kloss Taucherstraße 10 Cunewalde 01307 Germ
64 Rancho grande Sergio Gutiérrez Av. del Libertador 900 Buenos Aires 1010 Arge
65 Rattlesnake Canyon Paula Wilson 2817 Milton Dr. Albuquerque 87110 USA
Grocery
66 Reggiani Caseifici Maurizio Moroni Strada Provinciale 124 Reggio Emilia 42100 Italy
67 Ricardo Adocicados Janete Limeira Av. Copacabana, 267 Rio de 02389-890 Braz
Janeiro
70 Santé Gourmet Jonas Bergulfsen Erling Skakkes gate 78 Stavern 4110 Norw
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
76 Suprêmes délices Pascale Cartrain Boulevard Tirou, 255 Charleroi B-6000 Belg
77 The Big Cheese Liz Nixon 89 Jefferson Way Suite 2 Portland 97201 USA
78 The Cracker Box Liu Wong 55 Grizzly Peak Rd. Butte 59801 USA
80 Tortuga Restaurante Miguel Angel Avda. Azteca 123 México D.F. 05033 Mex
Paolino
81 Tradição Anabela Av. Inês de Castro, 414 São Paulo 05634-030 Braz
Hipermercados Domingues
82 Trail's Head Gourmet Helvetius Nagy 722 DaVinci Blvd. Kirkland 98034 USA
Provisioners
86 Die Wandernde Kuh Rita Müller Adenauerallee 900 Stuttgart 70563 Germ
89 White Clover Markets Karl Jablonski 305 - 14th Ave. S. Suite 3B Seattle 98128 USA
Try it Yourself »
The following SQL statement selects all customers with a CustomerName ending with "a":
Example
SELECT * FROM Customers
WHERE CustomerName LIKE '%a';
Try it Yourself »
The following SQL statement selects all customers with a CustomerName that have "or" in
any position:
Example
SELECT * FROM Customers
WHERE CustomerName LIKE '%or%';
Try it Yourself »
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%';
Try it Yourself »
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__%';
Try it Yourself »
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';
Try it Yourself »
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%';
Try it Yourself »
Exercise:
Select all records where the value of the City column starts with the letter "a".
Submit Answer »
Wildcard characters are used with the 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 within the h[oa]t finds hot and hat, but not hit
brackets
! Represents any character not in the h[!oa]t finds hit, but not hot and hat
brackets
- Represents any single character within the c[a-b]t finds cat and cbt
specified range
# Represents any single numeric character 2#5 finds 205, 215, 225, 235, 245, 255, 265,
275, 285, and 295
Wildcard Characters in SQL Server
% Represents zero or more characters bl% finds bl, black, blue, and blob
[] Represents any single character within the brackets h[oa]t finds hot and hat, but not
hit
^ Represents any character not in the brackets h[^oa]t finds hit, but not hot and
hat
- Represents any single character within the specified c[a-b]t finds cat and cbt
range
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'
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 'a%o' Finds any values that starts with "a" and ends with "o"
Demo Database
The table below shows the complete "Customers" table from the Northwind sample
database:
2 Ana Trujillo Ana Trujillo Avda. de la Constitución México D.F. 05021 Mex
Emparedados y helados 2222
3 Antonio Moreno Antonio Moreno Mataderos 2312 México D.F. 05023 Mex
Taquería
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
7 Blondel père et fils Frédérique 24, place Kléber Strasbourg 67000 Fran
Citeaux
9 Bon app' Laurence 12, rue des Bouchers Marseille 13008 Fran
Lebihans
12 Cactus Comidas para Patricio Simpson Cerrito 333 Buenos Aires 1010 Arge
llevar
13 Centro comercial Francisco Chang Sierras de Granada 9993 México D.F. 05022 Mex
Moctezuma
15 Comércio Mineiro Pedro Afonso Av. dos Lusíadas, 23 São Paulo 05432-043 Braz
18 Du monde entier Janine Labrune 67, rue des Cinquante Nantes 44000 Fran
Otages
21 Familia Arquibaldo Aria Cruz Rua Orós, 92 São Paulo 05442-030 Braz
23 Folies gourmandes Martine Rancé 184, chaussée de Tournai Lille 59000 Fran
24 Folk och fä HB Maria Larsson Åkergatan 24 Bräcke S-844 67 Swe
26 France restauration Carine Schmitt 54, rue Royale Nantes 44000 Fran
27 Franchi S.p.A. Paolo Accorti Via Monte Bianco 34 Torino 10100 Italy
28 Furia Bacalhau e Frutos Lino Rodriguez Jardim das rosas n. 32 Lisboa 1675 Port
do Mar
30 Godos Cocina Típica José Pedro Freyre C/ Romero, 33 Sevilla 41101 Spai
31 Gourmet Lanchonetes André Fonseca Av. Brasil, 442 Campinas 04876-786 Braz
32 Great Lakes Food Howard Snyder 2732 Baker Blvd. Eugene 97403 USA
Market
33 GROSELLA-Restaurante Manuel Pereira 5ª Ave. Los Palos Grandes Caracas 1081 Vene
35 HILARIÓN-Abastos Carlos Hernández Carrera 22 con Ave. Carlos San Cristóbal 5022 Vene
Soublette #8-35
36 Hungry Coyote Import Yoshi Latimer City Center Plaza 516 Main Elgin 97827 USA
Store St.
38 Island Trading Helen Bennett Garden House Crowther Cowes PO31 7PJ UK
Way
40 La corne d'abondance Daniel Tonini 67, avenue de l'Europe Versailles 78000 Fran
42 Laughing Bacchus Wine Yoshi Tannamuri 1900 Oak St. Vancouver V3F 2K1 Cana
Cellars
43 Lazy K Kountry Store John Steel 12 Orchestra Terrace Walla Walla 99362 USA
44 Lehmanns Marktstand Renate Messner Magazinweg 7 Frankfurt 60528 Germ
a.M.
45 Let's Stop N Shop Jaime Yorres 87 Polk St. Suite 5 San Francisco 94117 USA
46 LILA-Supermercado Carlos González Carrera 52 con Ave. Bolívar Barquisimeto 3508 Vene
#65-98 Llano Largo
49 Magazzini Alimentari Giovanni Rovelli Via Ludovico il Moro 22 Bergamo 24100 Italy
Riuniti
50 Maison Dewey Catherine Dewey Rue Joseph-Bens 532 Bruxelles B-1180 Belg
51 Mère Paillarde Jean Fresnière 43 rue St. Laurent Montréal H1J 1C3 Cana
55 Old World Delicatessen Rene Phillips 2743 Bering St. Anchorage 99508 USA
57 Paris spécialités Marie Bertrand 265, boulevard Charonne Paris 75012 Fran
58 Pericles Comidas Guillermo Calle Dr. Jorge Cash 321 México D.F. 05033 Mex
clásicas Fernández
60 Princesa Isabel Vinhoss Isabel de Castro Estrada da saúde n. 58 Lisboa 1756 Port
62 Queen Cozinha Lúcia Carvalho Alameda dos Canàrios, 891 São Paulo 05487-020 Braz
65 Rattlesnake Canyon Paula Wilson 2817 Milton Dr. Albuquerque 87110 USA
Grocery
66 Reggiani Caseifici Maurizio Moroni Strada Provinciale 124 Reggio Emilia 42100 Italy
67 Ricardo Adocicados Janete Limeira Av. Copacabana, 267 Rio de 02389-890 Braz
Janeiro
70 Santé Gourmet Jonas Bergulfsen Erling Skakkes gate 78 Stavern 4110 Norw
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
76 Suprêmes délices Pascale Cartrain Boulevard Tirou, 255 Charleroi B-6000 Belg
77 The Big Cheese Liz Nixon 89 Jefferson Way Suite 2 Portland 97201 USA
78 The Cracker Box Liu Wong 55 Grizzly Peak Rd. Butte 59801 USA
80 Tortuga Restaurante Miguel Angel Avda. Azteca 123 México D.F. 05033 Mex
Paolino
81 Tradição Anabela Av. Inês de Castro, 414 São Paulo 05634-030 Braz
Hipermercados Domingues
82 Trail's Head Gourmet Helvetius Nagy 722 DaVinci Blvd. Kirkland 98034 USA
Provisioners
86 Die Wandernde Kuh Rita Müller Adenauerallee 900 Stuttgart 70563 Germ
89 White Clover Markets Karl Jablonski 305 - 14th Ave. S. Suite 3B Seattle 98128 USA
Example
SELECT * FROM Customers
WHERE City LIKE 'ber%';
Try it Yourself »
The following SQL statement selects all customers with a City containing the pattern "es":
Example
SELECT * FROM Customers
WHERE City LIKE '%es%';
Try it Yourself »
Example
SELECT * FROM Customers
WHERE City LIKE '_ondon';
Try it Yourself »
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';
Try it Yourself »
Example
SELECT * FROM Customers
WHERE City LIKE '[bsp]%';
Try it Yourself »
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]%';
Try it Yourself »
Example
SELECT * FROM Customers
WHERE City LIKE '[!bsp]%';
Try it Yourself »
Or:
Example
SELECT * FROM Customers
WHERE City NOT LIKE '[bsp]%';
Try it Yourself »
Submit Answer »
SQL IN Operator
The SQL IN Operator
The IN operator allows you to specify multiple values in a WHERE clause.
IN Syntax
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);
Demo Database
The table below shows the complete "Customers" table from the Northwind sample
database:
2 Ana Trujillo Ana Trujillo Avda. de la Constitución México D.F. 05021 Mex
Emparedados y helados 2222
3 Antonio Moreno Antonio Moreno Mataderos 2312 México D.F. 05023 Mex
Taquería
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
7 Blondel père et fils Frédérique 24, place Kléber Strasbourg 67000 Fran
Citeaux
9 Bon app' Laurence 12, rue des Bouchers Marseille 13008 Fran
Lebihans
12 Cactus Comidas para Patricio Simpson Cerrito 333 Buenos Aires 1010 Arge
llevar
13 Centro comercial Francisco Chang Sierras de Granada 9993 México D.F. 05022 Mex
Moctezuma
15 Comércio Mineiro Pedro Afonso Av. dos Lusíadas, 23 São Paulo 05432-043 Braz
18 Du monde entier Janine Labrune 67, rue des Cinquante Nantes 44000 Fran
Otages
21 Familia Arquibaldo Aria Cruz Rua Orós, 92 São Paulo 05442-030 Braz
23 Folies gourmandes Martine Rancé 184, chaussée de Tournai Lille 59000 Fran
26 France restauration Carine Schmitt 54, rue Royale Nantes 44000 Fran
27 Franchi S.p.A. Paolo Accorti Via Monte Bianco 34 Torino 10100 Italy
28 Furia Bacalhau e Frutos Lino Rodriguez Jardim das rosas n. 32 Lisboa 1675 Port
do Mar
30 Godos Cocina Típica José Pedro Freyre C/ Romero, 33 Sevilla 41101 Spai
31 Gourmet Lanchonetes André Fonseca Av. Brasil, 442 Campinas 04876-786 Braz
32 Great Lakes Food Howard Snyder 2732 Baker Blvd. Eugene 97403 USA
Market
33 GROSELLA-Restaurante Manuel Pereira 5ª Ave. Los Palos Grandes Caracas 1081 Vene
35 HILARIÓN-Abastos Carlos Hernández Carrera 22 con Ave. Carlos San Cristóbal 5022 Vene
Soublette #8-35
36 Hungry Coyote Import Yoshi Latimer City Center Plaza 516 Main Elgin 97827 USA
Store St.
38 Island Trading Helen Bennett Garden House Crowther Cowes PO31 7PJ UK
Way
40 La corne d'abondance Daniel Tonini 67, avenue de l'Europe Versailles 78000 Fran
41 La maison d'Asie Annette Roulet 1 rue Alsace-Lorraine Toulouse 31000 Fran
42 Laughing Bacchus Wine Yoshi Tannamuri 1900 Oak St. Vancouver V3F 2K1 Cana
Cellars
43 Lazy K Kountry Store John Steel 12 Orchestra Terrace Walla Walla 99362 USA
45 Let's Stop N Shop Jaime Yorres 87 Polk St. Suite 5 San Francisco 94117 USA
46 LILA-Supermercado Carlos González Carrera 52 con Ave. Bolívar Barquisimeto 3508 Vene
#65-98 Llano Largo
49 Magazzini Alimentari Giovanni Rovelli Via Ludovico il Moro 22 Bergamo 24100 Italy
Riuniti
50 Maison Dewey Catherine Dewey Rue Joseph-Bens 532 Bruxelles B-1180 Belg
51 Mère Paillarde Jean Fresnière 43 rue St. Laurent Montréal H1J 1C3 Cana
54 Océano Atlántico Ltda. Yvonne Moncada Ing. Gustavo Moncada 8585 Buenos Aires 1010 Arge
Piso 20-A
55 Old World Delicatessen Rene Phillips 2743 Bering St. Anchorage 99508 USA
57 Paris spécialités Marie Bertrand 265, boulevard Charonne Paris 75012 Fran
58 Pericles Comidas Guillermo Calle Dr. Jorge Cash 321 México D.F. 05033 Mex
clásicas Fernández
60 Princesa Isabel Vinhoss Isabel de Castro Estrada da saúde n. 58 Lisboa 1756 Port
61 Que Delícia Bernardo Batista Rua da Panificadora, 12 Rio de 02389-673 Braz
Janeiro
62 Queen Cozinha Lúcia Carvalho Alameda dos Canàrios, 891 São Paulo 05487-020 Braz
64 Rancho grande Sergio Gutiérrez Av. del Libertador 900 Buenos Aires 1010 Arge
65 Rattlesnake Canyon Paula Wilson 2817 Milton Dr. Albuquerque 87110 USA
Grocery
66 Reggiani Caseifici Maurizio Moroni Strada Provinciale 124 Reggio Emilia 42100 Italy
67 Ricardo Adocicados Janete Limeira Av. Copacabana, 267 Rio de 02389-890 Braz
Janeiro
70 Santé Gourmet Jonas Bergulfsen Erling Skakkes gate 78 Stavern 4110 Norw
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
76 Suprêmes délices Pascale Cartrain Boulevard Tirou, 255 Charleroi B-6000 Belg
77 The Big Cheese Liz Nixon 89 Jefferson Way Suite 2 Portland 97201 USA
78 The Cracker Box Liu Wong 55 Grizzly Peak Rd. Butte 59801 USA
80 Tortuga Restaurante Miguel Angel Avda. Azteca 123 México D.F. 05033 Mex
Paolino
81 Tradição Anabela Av. Inês de Castro, 414 São Paulo 05634-030 Braz
Hipermercados Domingues
82 Trail's Head Gourmet Helvetius Nagy 722 DaVinci Blvd. Kirkland 98034 USA
Provisioners
86 Die Wandernde Kuh Rita Müller Adenauerallee 900 Stuttgart 70563 Germ
89 White Clover Markets Karl Jablonski 305 - 14th Ave. S. Suite 3B Seattle 98128 USA
Example
SELECT * FROM Customers
WHERE Country IN ('Germany', 'France', 'UK');
Try it Yourself »
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');
Try it Yourself »
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);
Try it Yourself »
T
Exercise:
Use the IN operator to select all the records where Country is either "Norway" or "France".
The BETWEEN operator is inclusive: begin and end values are included.
BETWEEN Syntax
SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
Demo Database
Below is a selection from the "Products" table in the Northwind sample database:
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;
Try it Yourself »
Example
SELECT * FROM Products
WHERE Price NOT BETWEEN 10 AND 20;
Try it Yourself »
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);
Try it Yourself »
Example
SELECT * FROM Products
WHERE ProductName BETWEEN 'Carnarvon Tigers' AND 'Mozzarella di Giovanni'
ORDER BY ProductName;
Try it Yourself »
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;
Try it Yourself »
NOT BETWEEN Text Values Example
The following SQL statement selects all products with a ProductName not between
Carnarvon Tigers and Mozzarella di Giovanni:
Example
SELECT * FROM Products
WHERE ProductName NOT BETWEEN 'Carnarvon Tigers' AND 'Mozzarella di Giovanni'
ORDER BY ProductName;
Try it Yourself »
Sample Table
Below is a selection from the "Orders" table in the Northwind sample database:
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
BETWEEN Dates Example
The following SQL statement selects all orders with an OrderDate between '01-July-1996'
and '31-July-1996':
Example
SELECT * FROM Orders
WHERE OrderDate BETWEEN #07/01/1996# AND #07/31/1996#;
Try it Yourself »
OR:
Example
SELECT * FROM Orders
WHERE OrderDate BETWEEN '1996-07-01' AND '1996-07-31';
Try it Yourself »
Test
Exercise:
Use the BETWEEN operator to select all the records where the value of the Price column is
between 10 and 20.
Submit Answer »
Demo Database
In this tutorial we will use the well-known Northwind sample database.
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
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;
Try it Yourself »
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;
Try it Yourself »
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;
Try it Yourself »
Note: To get the SQL statement above to work in MySQL use the following:
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;
Try it Yourself »
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;
Try it Yourself »
SELECT CustomerName,
Address,
PostalCode
FROM Customers;
Submit Answer »
10308 2 1996-09-18
10309 37 1996-09-19
10310 77 1996-09-20
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;
Try it Yourself »
(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
SELECT *
FROM Orders
LEFT JOIN Customers
= ;
Submit Answer »
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
Example
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
Try it Yourself »
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);
Try it Yourself »
Test Exercises
Exercise:
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;
Submit Answer »
10308 2 7 1996-09-18 3
10309 37 3 1996-09-19 1
10310 77 8 1996-09-20 2
SQL LEFT JOIN Example
The following SQL statement will select all customers, and any orders they might have:
Example
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerName;
Try it Yourself »
Note: The LEFT JOIN keyword returns all records from the left table (Customers), even if
there are no matches in the right table (Orders).
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;
Try it Yourself »
Note: The RIGHT JOIN keyword returns all records from the right table (Employees), even if
there are no matches in the left table (Orders).
SELECT *
FROM Orders
ON Orders.CustomerID=Customers.CustomerID;
Submit Answer »
Start the Exercise
Tip: FULL OUTER JOIN and FULL JOIN are the same.
Note: FULL OUTER JOIN can potentially return very large result-sets!
Demo Database
In this tutorial we will use the well-known Northwind sample database.
Below is a selection from the "Customers" table:
10308 2 7 1996-09-18 3
10309 37 3 1996-09-19 1
10310 77 8 1996-09-20 2
SQL FULL OUTER JOIN Example
The following SQL statement selects all customers, and all orders:
CustomerName OrderID
Null 10309
Null 10310
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.
SQL Self Join
❮ PreviousNext ❯
Demo Database
In this tutorial we will use the well-known Northwind sample database.
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;
Try it Yourself »
Every SELECT statement within UNION must have the same number of columns
The columns must also have similar data types
The columns in every SELECT statement must also be in the same order
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.
Demo Database
In this tutorial we will use the well-known Northwind sample database.
2 New Orleans Cajun Shelley Burke P.O. Box New 70117 USA
Delights 78934 Orleans
3 Grandma Kelly's Regina Murphy 707 Oxford Ann Arbor 48104 USA
Homestead Rd.
Example
SELECT City FROM Customers
UNION
SELECT City FROM Suppliers
ORDER BY City;
Try it Yourself »
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;
Try it Yourself »
Example
SELECT City, Country FROM Customers
WHERE Country='Germany'
UNION
SELECT City, Country FROM Suppliers
WHERE Country='Germany'
ORDER BY City;
Try it Yourself »
SQL UNION ALL With WHERE
The following SQL statement returns the German cities (duplicate values also) from both the
"Customers" and the "Suppliers" table:
Example
SELECT City, Country FROM Customers
WHERE Country='Germany'
UNION ALL
SELECT City, Country FROM Suppliers
WHERE Country='Germany'
ORDER BY City;
Try it Yourself »
Example
SELECT 'Customer' AS Type, ContactName, City, Country
FROM Customers
UNION
SELECT 'Supplier', ContactName, City, Country
FROM Suppliers;
Try it Yourself »
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".
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:
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
Example
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country;
Try it Yourself »
The following SQL statement lists the number of customers in each country, sorted high to
low:
Example
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
ORDER BY COUNT(CustomerID) DESC;
Try it Yourself »
Demo Database
Below is a selection from the "Orders" table in the Northwind sample database:
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
GROUP BY With JOIN Example
The following SQL statement lists the number of orders sent by each shipper:
Example
SELECT Shippers.ShipperName, COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders
LEFT JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID
GROUP BY ShipperName;
Try it Yourself »
Exercise:
List the number of customers in each country.
SELECT (CustomerID),
Country
FROM Customers
;
Submit Answer »
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
Example
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5;
Try it Yourself »
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;
Try it Yourself »
Demo Database
Below is a selection from the "Orders" table in the Northwind sample database:
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;
Try it Yourself »
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;
Try it Yourself »
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 Murphy 707 Oxford Rd. Ann Arbor 48104 USA
Homestead
Example
SELECT SupplierName
FROM Suppliers
WHERE EXISTS (SELECT ProductName FROM Products WHERE Products.SupplierID =
Suppliers.supplierID AND Price < 20);
Try it Yourself »
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);
Try it Yourself »
SQL ANY and ALL Operators
ANY means that the condition will be true if the operation is true for any of the values in the
range.
ANY Syntax
SELECT column_name(s)
FROM table_name
WHERE column_name operator ANY
(SELECT column_name
FROM table_name
WHERE condition);
Note: The operator must be a standard comparison operator (=, <>, !=, >, >=, <, or <=).
ALL means that the condition will be true only if the operation is true for all values in the
range.
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
1 10248 11 12
2 10248 42 10
3 10248 72 5
4 10249 14 9
5 10249 51 40
6 10250 41 10
7 10250 51 35
8 10250 65 15
9 10251 22 6
10 10251 57 15
Example
SELECT ProductName
FROM Products
WHERE ProductID = ANY
(SELECT ProductID
FROM OrderDetails
WHERE Quantity = 10);
Try it Yourself »
The following SQL statement lists the ProductName if it finds ANY records in the
OrderDetails table has Quantity larger than 99 (this will return TRUE because the Quantity
column has some values larger than 99):
Example
SELECT ProductName
FROM Products
WHERE ProductID = ANY
(SELECT ProductID
FROM OrderDetails
WHERE Quantity > 99);
Try it Yourself »
The following SQL statement lists the ProductName if it finds ANY records in the
OrderDetails table has Quantity larger than 1000 (this will return FALSE because the
Quantity column has no values larger than 1000):
Example
SELECT ProductName
FROM Products
WHERE ProductID = ANY
(SELECT ProductID
FROM OrderDetails
WHERE Quantity > 1000);
Try it Yourself »
Example
SELECT ALL ProductName
FROM Products
WHERE TRUE;
Try it Yourself »
The following SQL statement lists the ProductName if ALL the records in the OrderDetails
table has Quantity equal to 10. This will of course return FALSE because the Quantity
column has many different values (not only the value of 10):
Example
SELECT ProductName
FROM Products
WHERE ProductID = ALL
(SELECT ProductID
FROM OrderDetails
WHERE Quantity = 10);
SELECT *
INTO newtable [IN externaldb]
FROM oldtable
WHERE condition;
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:
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:
The INSERT INTO SELECT statement requires that the data types in source and target tables
matches.
Copy only some columns from one table into another table:
Demo Database
In this tutorial we will use the well-known Northwind sample database.
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
SQL INSERT INTO SELECT Examples
The following SQL statement copies "Suppliers" into "Customers" (the columns that are not
filled with data, will contain NULL):
Example
INSERT INTO Customers (CustomerName, City, Country)
SELECT SupplierName, City, Country FROM Suppliers;
Try it Yourself »
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;
Try it Yourself »
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';
Try it Yourself »
SQL CASE Statement
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;
Try it Yourself »
The following SQL will order the customers by City. However, if City is NULL, then order by
Country:
Example
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:
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.
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
Example
CREATE PROCEDURE SelectAllCustomers
AS
SELECT * FROM Customers
GO;
Example
CREATE PROCEDURE SelectAllCustomers @City nvarchar(30)
AS
SELECT * FROM Customers WHERE City = @City
GO;
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;
Execute the stored procedure above as follows:
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;
Try it Yourself »
The following example uses a single-line comment to ignore the end of a line:
Example
SELECT * FROM Customers -- WHERE City='Berlin';
Try it Yourself »
Example
--SELECT * FROM Customers;
SELECT * FROM Products;
Try it Yourself »
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;
Try it Yourself »
Example
/*SELECT * FROM Customers;
SELECT * FROM Products;
SELECT * FROM Orders;
SELECT * FROM Categories;*/
SELECT * FROM Suppliers;
Try it Yourself »
To ignore just a part of a statement, also use the /* */ comment.
Example
SELECT CustomerName, /*City,*/ Country FROM Customers;
Try it Yourself »
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;
SQL Operators
+ Add Try it
- Subtract Try it
* Multiply Try it
/ Divide Try it
% Modulo Try it
Operator Description
| Bitwise OR
^ Bitwise exclusive OR
= Equal to Try it
> Greater than Try it
Operator Description
+= Add equals
-= Subtract equals
*= Multiply equals
/= Divide equals
%= Modulo equals
ALL TRUE if all of the subquery values meet the condition Try it
ANY TRUE if any of the subquery values meet the condition Try it
SOME TRUE if any of the subquery values meet the condition Try it
SQL Database
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;
Test
Exercise:
Write the correct SQL statement to create a new database called testDB.
Submit Answer »
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;
Exercise:
Write the correct SQL statement to delete a database named testDB.
Submit Answer »
Syntax
BACKUP DATABASE databasename
TO DISK = 'filepath';
Syntax
BACKUP DATABASE databasename
TO DISK = 'filepath'
WITH DIFFERENTIAL;
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.
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)
);
Try it Yourself »
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.
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;
Try it Yourself »
Exercise:
Write the correct SQL statement to create a new table called Persons.
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
Submit Answer »
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;
Try it Yourself »
SQL TRUNCATE TABLE
The TRUNCATE TABLE statement is used to delete the data inside a table, but not the table
itself.
Syntax
TRUNCATE TABLE table_name;
Persons;
Submit Answer »
❮ PreviousNext ❯
The ALTER TABLE statement is also used to add and drop various constraints on an existing
table.
ALTER TABLE - ADD Column
To add a column in a table, use the following syntax:
Example
ALTER TABLE Customers
ADD Email varchar(255);
Try it Yourself »
The following SQL deletes the "Email" column from the "Customers" table:
Example
ALTER TABLE Customers
DROP COLUMN Email;
Try it Yourself »
Notice that the "DateOfBirth" column is now of type year and is going to hold a year in a
two- or four-digit format.
Exercise:
Add a column of type DATE called Birthday.
Persons
;
Submit Answer »
SQL Constraints
SQL constraints are used to specify rules for data in a table.
SQL Create Constraints
Constraints can be specified when the table is created with the CREATE TABLE statement, or
after the table is created with the ALTER TABLE statement.
Syntax
CREATE TABLE table_name (
column1 datatype constraint,
column2 datatype constraint,
column3 datatype constraint,
....
);
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
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255) NOT NULL,
Age int
);
Try it Yourself »
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:
Both the UNIQUE and PRIMARY KEY constraints provide a guarantee for uniqueness for a
column or set of columns.
However, you can have many UNIQUE constraints per table, but only one PRIMARY
KEY constraint per table.
MySQL:
To name a UNIQUE constraint, and to define a UNIQUE constraint on multiple columns, use
the following SQL syntax:
To name a UNIQUE constraint, and to define a UNIQUE constraint on multiple columns, use
the following SQL syntax:
MySQL:
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,
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).
Note: If you use ALTER TABLE to add a primary key, the primary key column(s) must have
been declared to not contain NULL values (when the table was first created).
MySQL:
A FOREIGN KEY is a field (or collection of fields) in one table, that refers to the PRIMARY
KEY in another table.
The table with the foreign key is called the child table, and the table with the primary key is
called the referenced or parent table.
Persons Table
1 Hansen Ola 30
2 Svendson Tove 23
3 Pettersen Kari 20
Orders Table
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 prevents invalid data from being inserted into the foreign key
column, because it has to be one of the values contained in the parent table.
MySQL:
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:
MySQL:
If you define a CHECK constraint on a column it will allow only certain values for this column.
If you define a CHECK constraint on a table it can limit the values in certain columns based
on values in other columns in the row.
MySQL:
To allow naming of a CHECK constraint, and for defining a CHECK constraint on multiple
columns, use the following SQL syntax:
The default value will be added to all new records, if no other value is specified.
The DEFAULT constraint can also be used to insert system values, by using functions
like GETDATE():
MySQL:
SQL Server:
MS Access:
Oracle:
MySQL:
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.
MS Access:
SQL Server:
DB2/Oracle:
MySQL:
Often this is the primary key field that we would like to be created automatically every time
a new record is inserted.
Syntax for MySQL
The following SQL statement defines the "Personid" column to be an auto-increment
primary key field in the "Persons" table:
By default, the starting value for AUTO_INCREMENT is 1, and it will increment by 1 for each
new record.
To let the AUTO_INCREMENT sequence start with another value, use the following SQL
statement:
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".
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".
By default, the starting value for AUTOINCREMENT 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 the autoincrement to AUTOINCREMENT(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".
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".
SQL Working With Dates
SQL Dates
The most difficult part when working with dates is to be sure that the format of the date you
are trying to insert, matches the format of the date column in the database.
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.
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
Note: Two dates can easily be compared if there is no time component involved!
Now, assume that the "Orders" table looks like this (notice the added time-component in
the "OrderDate" column):
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 use time-components in your
dates, unless you have to!
SQL Views
You can add SQL statements and functions 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 view, every
time a user queries it.
Example
CREATE VIEW [Brazil Customers] AS
SELECT CustomerName, ContactName
FROM Customers
WHERE Country = 'Brazil';
Try it Yourself »
Example
SELECT * FROM [Brazil Customers];
Try it Yourself »
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);
Try it Yourself »
Example
SELECT * FROM [Products Above Average Price];
Try it Yourself »
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';
Try it Yourself »
SQL Dropping a View
A view is deleted with the DROP VIEW statement.
Example
DROP VIEW [Brazil Customers];
Try it Yourself »
SQL Injection
❮ PreviousNext ❯
SQL Injection
SQL injection is a code injection technique that might destroy your database.
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:
105 OR 1=
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.
SQL Injection Based on ""="" is Always True
Here is an example of a user login on a web site:
Username:
John Doe
Password:
myPass
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.
SQL Injection Based on Batched SQL
Statements
Most databases support batched SQL statement.
The SQL statement below will return all rows from the "Users" table, then delete the
"Suppliers" table.
Example
SELECT * FROM Users; DROP TABLE Suppliers
Example
txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;
105; DROP
User id:
Result
SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers;
SQL parameters are values that are added to an SQL query at execution time, in a
controlled manner.
ASP.NET Razor Example
txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = @0";
db.Execute(txtSQL,txtUserId);
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.
txtUserId = getRequestString("UserId");
sql = "SELECT * FROM Customers WHERE CustomerId = @0";
command = new SqlCommand(sql);
command.Parameters.AddWithValue("@0",txtUserId);
command.ExecuteReader();
txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
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();
INSERT INTO STATEMENT IN PHP:
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.
MS Access
When a web site requires only a simple database, Microsoft Access can be a solution.
MS Access is not well suited for very high-traffic, and not as powerful as MySQL, SQL
Server, or Oracle.
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
VARBINARY(size) Equal to VARCHAR(), but stores binary byte strings. The size parameter
specifies the maximum column length in bytes.
TINYBLOB For BLOBs (Binary Large Objects). Max length: 255 bytes
TINYTEXT Holds a string with a maximum length of 255 characters
BLOB(size) For BLOBs (Binary Large Objects). Holds up to 65,535 bytes of data
MEDIUMBLOB For BLOBs (Binary Large Objects). Holds up to 16,777,215 bytes of data
LONGBLOB For BLOBs (Binary Large Objects). Holds up to 4,294,967,295 bytes of data
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
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)
MEDIUMINT(size) A medium integer. Signed range is from -8388608 to 8388607. Unsigned range
is from 0 to 16777215. The size parameter specifies the maximum display
width (which is 255)
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
FLOAT(p) A floating point number. MySQL uses the p value to determine whether to use
FLOAT or DOUBLE for the resulting data type. If p is from 0 to 24, the data type
becomes FLOAT(). If p is from 25 to 53, the data type becomes DOUBLE()
DOUBLE(size, d) A normal-size 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
DOUBLE PRECISION(size, d)
DECIMAL(size, d) An exact fixed-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. The
maximum number for size is 65. The maximum number for d is 30. The default
value for size is 10. The default value for d is 0.
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.
Date and Time Data Types
The p parameter indicates the maximum total number of digits that can be stored (both
to the left and to the right of the decimal point). p must be a value from 1 to 38.
Default is 18.
The s parameter indicates the maximum number of digits stored to the right of the
decimal point. s must be a value from 0 to p. Default value is 0
The p parameter indicates the maximum total number of digits that can be stored (both
to the left and to the right of the decimal point). p must be a value from 1 to 38.
Default is 18.
The s parameter indicates the maximum number of digits stored to the right of the
decimal point. s must be a value from 0 to p. Default value is 0
float(n) Floating precision number data from -1.79E + 308 to 1.79E + 308. 4 or 8 bytes
The n parameter indicates whether the field should hold 4 or 8 bytes. float(24) holds a
4-byte field and float(53) holds an 8-byte field. Default value of n is 53.
datetime2 From January 1, 0001 to December 31, 9999 with an accuracy of 100 6-8 bytes
nanoseconds
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
uniqueidentifier Stores a globally unique identifier (GUID)
Text Use for text or combinations of text and numbers. 255 characters maximum
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, usually 4 bytes
starting at 1
Yes/No A logical field can be displayed as Yes/No, True/False, or On/Off. In code, use 1 bit
the constants True and False (equivalent to -1 and 0). Note: Null values are
not allowed in Yes/No fields
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-down list 4 bytes
SQL References
SQL Keywords
Keyword Description
ALL Returns true if all of the subquery values meet the condition
AND Only includes rows where both conditions is true
ANY Returns true if any of the subquery values meet the condition
CHECK A constraint that limits the value that can be placed in a column
CREATE UNIQUE INDEX Creates a unique index on a table (no duplicate values)
CREATE VIEW Creates a view based on the result set of a SELECT statement
DROP CONSTRAINT Deletes a UNIQUE, PRIMARY KEY, FOREIGN KEY, or CHECK constraint
FOREIGN KEY A constraint that is a key used to link two tables together
FULL OUTER JOIN Returns all rows when there is a match in either left table or right
table
GROUP BY Groups the result set (used with aggregate functions: COUNT, MAX,
MIN, SUM, AVG)
INNER JOIN Returns rows that have matching values in both tables
INSERT INTO SELECT Copies data from one table into another table
LEFT JOIN Returns all rows from the left table, and the matching rows from the
right table
LIKE Searches for a specified pattern in a column
NOT NULL A constraint that enforces a column to not accept NULL values
OUTER JOIN Returns all rows when there is a match in either left table or right
table
PRIMARY KEY A constraint that uniquely identifies each record in a database table
RIGHT JOIN Returns all rows from the right table, and the matching rows from the
left table
SELECT INTO Copies data from one table into a new table
SELECT TOP Specifies the number of records to return in the result set
SET Specifies which columns and values that should be updated in a table
TRUNCATE TABLE Deletes the data inside a table, but not the table itself
UNION Combines the result set of two or more SELECT statements (only
distinct values)
UNION ALL Combines the result set of two or more SELECT statements (allows
duplicate values)
UNIQUE A constraint that ensures that all values in a column are unique
UPDATE Updates existing rows in a table
WHERE Filters a result set to include only records that fulfill a specified
condition
MySQL Functions
This reference contains string, numeric, date, and some advanced functions in
MySQL.
Function Description
INSERT Inserts a string within a string at the specified position and for a certain
number of characters
INSTR Returns the position of the first occurrence of a string in another string
Function Description
ABS Returns the absolute value of a number
POW Returns the value of a number raised to the power of another number
POWER Returns the value of a number raised to the power of another number
Function Description
ADDDATE Adds a time/date interval to a date and then returns the date
DATE_SUB Subtracts a time/date interval from a date and then returns the date
LAST_DAY Extracts the last day of the month for a given date
LOCALTIME Returns the current date and time
MAKEDATE Creates and returns a date based on a year and a number of days value
MAKETIME Creates and returns a time based on an hour, minute, and second value
QUARTER Returns the quarter of the year for a given date value
SECOND Returns the seconds part of a time/datetime
SUBDATE Subtracts a time/date interval from a date and then returns the date
SUBTIME Subtracts a time interval from a datetime and then returns the
time/datetime
TO_DAYS Returns the number of days between a date and date "0000-00-00"
WEEK Returns the week number for a given date
YEARWEEK Returns the year and week number for a given date
Function Description
CASE Goes through conditions and return a value when the first condition is met
CURRENT_USER Returns the user name and host name for the MySQL account that the
server used to authenticate the current client
IFNULL Return a specified value if the expression is NULL, otherwise return the
expression
LAST_INSERT_ID Returns the AUTO_INCREMENT id of the last row that has been inserted or
updated in a table
NULLIF Compares two expressions and returns NULL if they are equal. Otherwise,
the first expression is returned
SESSION_USER Returns the current MySQL user name and host name
SYSTEM_USER Returns the current MySQL user name and host name
USER Returns the current MySQL user name and host name
This reference contains string, numeric, date, conversion, and some advanced
functions in SQL Server.
Function Description
QUOTENAME Returns a Unicode string with delimiters added to make the string a valid
SQL Server delimited identifier
STUFF Deletes a part of a string and then inserts another part into the string,
starting at a specified position
SUBSTRING Extracts some characters from a string
TRANSLATE Returns the string from the first argument after the characters specified in
the second argument are translated into the characters specified in the
third argument.
TRIM Removes leading and trailing spaces (or other specified characters) from a
string
UNICODE Returns the Unicode value for the first character of the input expression
Function Description
POWER Returns the value of a number raised to the power of another number
Function Description
DATEADD Adds a time/date interval to a date and then returns the date
DATEFROMPARTS Returns a date from the specified parts (year, month, and day values)
MONTH Returns the month part for a specified date (a number from 1 to 12)
Function Description
CURRENT_USER Returns the name of the current user in the SQL Server database
IIF Returns a value if a condition is TRUE, or another value if a condition is
FALSE
ISNULL Return a specified value if the expression is NULL, otherwise return the
expression
SESSION_USER Returns the name of the current user in the SQL Server database
MS Access Functions
This reference contains the string, numeric, and date functions in MS Access.
MS Access String Functions
Function Description
Chr Returns the character for the specified ASCII number code
InstrRev Gets the position of the first occurrence of a string in another, from the
end of string
Function Description
Randomize Initializes the random number generator (used by Rnd()) with a seed
Val Reads a string and returns the numbers found in the string
MS Access Date Functions
Function Description
DateAdd Adds a time/date interval to a date and then returns the date
DateSerial Returns a date from the specified parts (year, month, and day values)
Now Returns the current date and time based on the computer's system date
and time
TimeSerial Returns a time from the specified parts (hour, minute, and second value)
Function Description
or
or
SELECT column_name
FROM table_name AS table_alias
or
or
IN SELECT column_name(s)
FROM table_name
WHERE column_name
IN (value1,value2,..)
or
SELECT * SELECT *
FROM table_name
or
SELECT column_name(s)
INTO new_table_name [IN externaldatabase]
FROM old_table_name
Source : https://www.w3schools.com/sql/sql_quickref.asp