Select: SQL Statement
Select: SQL Statement
Select: SQL Statement
This is correct:
SELECT * FROM Persons WHERE Year=1965
This is wrong:
SELECT * FROM Persons WHERE Year='1965'
Description
Equal
<>
Not equal
>
Greater than
<
Less than
>=
<=
BETWEEN
LIKE
IN
LastName
FirstName
Address
City
Hansen
Ola
Timoteivn 10
Sandnes
Svendson
Tove
Borgvn 23
Sandnes
Pettersen
Kari
Storgt 20
Stavanger
Now we want to select only the persons with the first name equal to "Tove" AND the last name equal
to "Svendson":
We use the following SELECT statement:
P_Id
LastName
FirstName
Address
City
Svendson
Tove
Borgvn 23
Sandnes
OR Operator Example
Now we want to select only the persons with the first name equal to "Tove" OR the first name equal to
"Ola":
We use the following SELECT statement:
LastName
FirstName
Address
City
Hansen
Ola
Timoteivn 10
Sandnes
Svendson
Tove
Borgvn 23
Sandnes
LastName
FirstName
Address
City
Svendson
Tove
Borgvn 23
Sandnes
If you want to sort the records in a descending order, you can use the DESC keyword.
Be careful when updating records. If we had omitted the WHERE clause in the example above, like
this:
SQL Wildcards
SQL wildcards can be used when searching for data in a database.
SQL Wildcards
SQL wildcards can substitute for one or more characters when searching for data in a database.
SQL wildcards must be used with the SQL LIKE operator.
With SQL, the following wildcards can be used:
Wildcard
Description
[charlist]
[^charlist]
or
[!charlist]
SQL IN Operator
The IN Operator
SQL IN Syntax
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)
Now we want to select the persons with a last name equal to "Hansen" or "Pettersen" from the table
above.
We use the following SELECT statement:
SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Hansen' AND 'Pettersen'
SQL Alias
With SQL, an alias name can be given to a table or to a column.
SQL Alias
You can give a table or a column another name by using an alias. This can be a good thing to do if you
have very long or complex table names or column names.
An alias name could be anything, but usually it is short.
Alias Example
Assume we have a table called "Persons" and another table called "Product_Orders". We will give the
table aliases of "p" and "po" respectively.
Now we want to list all the orders that "Ola Hansen" is responsible for.
We use the following SELECT statement:
Alias Example
Assume we have a table called "Persons" and another table called "Product_Orders". We will give the
table aliases of "p" and "po" respectively.
Now we want to list all the orders that "Ola Hansen" is responsible for.
We use the following SELECT statement:
SQL joins are used to query data from two or more tables, based on a relationship
between certain columns in these tables.
SQL JOIN
The JOIN keyword is used in an SQL statement to query data from two or more tables, based on a
relationship between certain columns in these tables.
Tables in a database are often related to each other with keys.
A primary key is a column (or a combination of columns) with a unique value for each row. Each
primary key value must be unique within the table. The purpose is to bind data together, across
tables, without repeating all of the data in every table.
JOIN: Return rows when there is at least one match in both tables
LEFT JOIN: Return all rows from the left table, even if there are no matches in the right table
RIGHT JOIN: Return all rows from the right table, even if there are no matches in the left
table
FULL JOIN: Return rows when there is a match in one of the tables
The FULL JOIN keyword return rows when there is a match in one of the tables.
SELECT *
INTO new_table_name [IN externaldatabase]
FROM old_tablename
Or we can select only the columns we want into the new table:
SELECT column_name(s)
INTO new_table_name [IN externaldatabase]
FROM old_tablename
SELECT *
INTO Persons_Backup
FROM Persons
We can also use the IN clause to copy the table into another database:
SELECT *
INTO Persons_Backup IN 'Backup.mdb'
FROM Persons
We can also copy only a few fields into the new table:
SELECT LastName,FirstName
INTO Persons_Backup
FROM Persons
SELECT LastName,Firstname
INTO Persons_Backup
FROM Persons
WHERE City='Sandnes'
SELECT Persons.LastName,Orders.OrderNo
INTO Persons_Order_Backup
FROM Persons
INNER JOIN Orders
ON Persons.P_Id=Orders.P_Id
table_name
data_type,
data_type,
data_type,
....
)
The data type specifies what type of data the column can hold. For a complete reference of all the
data types available in MS Access, MySQL, and SQL Server, go to our complete Data Types reference.
SQL Constraints
Constraints are used to limit the type of data that can go into a table.
Constraints can be specified when a table is created (with the CREATE TABLE statement) or after the
table is created (with the ALTER TABLE statement).
We will focus on the following constraints:
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
DEFAULT
The NOT NULL constraint enforces a field to always contain a value. This means that you cannot insert
a new record, or update a record without adding a value to this field.
The following SQL enforces the "P_Id" column and the "LastName" column to not accept NULL values:
To allow naming of a PRIMARY KEY constraint, and for defining a PRIMARY KEY constraint on multiple
columns, use the following SQL syntax:
MySQL / SQL Server / Oracle / MS Access:
LastName
FirstName
Address
City
Hansen
Ola
Timoteivn 10
Sandnes
Svendson
Tove
Borgvn 23
Sandnes
Pettersen
Kari
Storgt 20
Stavanger
OrderNo
P_Id
77895
44678
22456
24562
Note that the "P_Id" column in the "Orders" table points to the "P_Id" column in the "Persons" table.
The "P_Id" column in the "Persons" table is the PRIMARY KEY in the "Persons" table.
The "P_Id" column in the "Orders" table is a FOREIGN KEY in the "Orders" table.
The FOREIGN KEY constraint is used to prevent actions that would destroy links between tables.
The FOREIGN KEY constraint also prevents that invalid data form being inserted into the foreign key
column, because it has to be one of the values contained in the table it points to.
To create a FOREIGN KEY constraint on the "P_Id" column when the "Orders" table is already created,
use the following SQL:
MySQL / SQL Server / Oracle / MS Access:
Indexes
An index can be created in a table to find data more quickly and efficiently.
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 you should only create indexes on columns (and tables) that will be
frequently searched against.
LastName
FirstName
Address
City
Hansen
Ola
Timoteivn 10
Sandnes
Svendson
Tove
Borgvn 23
Sandnes
Pettersen
Kari
Storgt 20
Stavanger
LastName
FirstName
Address
City
Hansen
Ola
Timoteivn 10
Sandnes
Svendson
Tove
Borgvn 23
Sandnes
Pettersen
Kari
Storgt 20
Stavanger
DateOfBirth
LastName
FirstName
Address
City
Hansen
Ola
Timoteivn 10
Sandnes
Svendson
Tove
Borgvn 23
Sandnes
Pettersen
Kari
Storgt 20
Stavanger
To insert a new record into the "Persons" table, we will not have to specify a value for the "P_Id"
column (a unique value will be added automatically):
SQL Views
A view is a virtual table.
This chapter shows how to create, update, and delete a view.
Description
NOW()
CURDATE()
CURTIME()
DATE()
EXTRACT()
DATE_ADD()
DATE_SUB()
DATEDIFF()
DATE_FORMAT()
Description
GETDATE()
DATEPART()
DATEADD()
DATEDIFF()
CONVERT()
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!
For an overview of all data types available, go to our complete Data Types reference.
ProductName
OrderDate
Geitost
2008-11-11
Camembert Pierrot
2008-11-09
Mozzarella di Giovanni
2008-11-11
Mascarpone Fabioli
2008-10-29
Now we want to select the records with an OrderDate of "2008-11-11" from the table above.
We use the following SELECT statement:
ProductName
OrderDate
Geitost
2008-11-11
Mozzarella di Giovanni
2008-11-11
Now, assume that the "Orders" table looks like this (notice the time component in the "OrderDate"
column):
OrderId
ProductName
OrderDate
Geitost
2008-11-11 13:23:44
Camembert Pierrot
2008-11-09 15:45:21
Mozzarella di Giovanni
2008-11-11 11:12:01
Mascarpone Fabioli
2008-10-29 14:56:59
LastName
FirstName
Hansen
Ola
Svendson
Tove
Pettersen
Kari
Address
City
Sandnes
Borgvn 23
Sandnes
Stavanger
Suppose that the "Address" column in the "Persons" table is optional. This means that if we insert a
record with no value for the "Address" column, the "Address" column will be saved with a NULL value.
How can we test for NULL values?
It is not possible to test for NULL values with comparison operators, such as =, <, or <>.
We will have to use the IS NULL and IS NOT NULL operators instead.
SQL IS NULL
How do we select only the records with NULL values in the "Address" column?
We will have to use the IS NULL operator:
FirstName
Hansen
Ola
Pettersen
Kari
Address
FirstName
Address
Svendson
Tove
Borgvn 23
In the next chapter we will look at the ISNULL(), NVL(), IFNULL() and COALESCE() functions.
ProductName
UnitPrice
UnitsInStock
UnitsOnOrder
Jarlsberg
10.45
16
15
Mascarpone
32.56
23
Gorgonzola
15.67
20
Suppose that the "UnitsOnOrder" column is optional, and may contain NULL values.
We have the following SELECT statement:
SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder)
FROM Products
In the example above, if any of the "UnitsOnOrder" values are NULL, the result is NULL.
Microsoft's ISNULL() function is used to specify how we want to treat NULL values.
The NVL(), IFNULL(), and COALESCE() functions can also be used to achieve the same result.
In this case we want NULL values to be zero.
Below, if "UnitsOnOrder" is NULL it will not harm the calculation, because ISNULL() returns a zero if
the value is NULL:
SQL Server / MS Access
SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))
FROM Products
Oracle
Oracle does not have an ISNULL() function. However, we can use the NVL() function to achieve the
same result:
SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))
FROM Products
MySQL
MySQL does have an ISNULL() function. However, it works a little bit different from Microsoft's
ISNULL() function.
In MySQL we can use the IFNULL() function, like this:
SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products
or we can use the COALESCE() function, like this:
SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))
FROM Products
Description
Text
Use for text or combinations of text and numbers. 255 characters maximum
Storage
Memo
Byte
1 byte
Integer
2 bytes
Long
4 bytes
Single
4 bytes
Double
8 bytes
Currency
8 bytes
AutoNumber
AutoNumber fields automatically give each record its own number, usually
starting at 1
4 bytes
Date/Time
8 bytes
Yes/No
A logical field can be displayed as Yes/No, True/False, or On/Off. In code, use the
constants True and False (equivalent to -1 and 0). Note: Null values are not
allowed in Yes/No fields
1 bit
Ole Object
Can store pictures, audio, video, or other BLOBs (Binary Large OBjects)
up to 1GB
Hyperlink
Lookup Wizard
Let you type a list of options, which can then be chosen from a drop-down list
4 bytes
Description
CHAR(size)
Holds a fixed length string (can contain letters, numbers, and special characters). The fixed
size is specified in parenthesis. Can store up to 255 characters
VARCHAR(size)
Holds a variable length string (can contain letters, numbers, and special characters). The
maximum size is specified in parenthesis. Can store up to 255 characters. Note: If you put a
greater value than 255 it will be converted to a TEXT type
TINYTEXT
TEXT
BLOB
MEDIUMTEXT
MEDIUMBLOB
LONGTEXT
LONGBLOB
ENUM(x,y,z,etc.)
Let you enter 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.
Note: The values are sorted in the order you enter them.
You enter the possible values in this format: ENUM('X','Y','Z')
SET
Similar to ENUM except that SET may contain up to 64 list items and can store more than
one choice
Number types:
Data type
Description
TINYINT(size)
-128 to 127 normal. 0 to 255 UNSIGNED*. The maximum number of digits may be specified
in parenthesis
SMALLINT(size)
-32768 to 32767 normal. 0 to 65535 UNSIGNED*. The maximum number of digits may be
specified in parenthesis
MEDIUMINT(size)
INT(size)
BIGINT(size)
FLOAT(size,d)
A small number with a floating decimal point. The maximum number of digits may be
specified in the size parameter. The maximum number of digits to the right of the decimal
point is specified in the d parameter
DOUBLE(size,d)
A large number with a floating decimal point. The maximum number of digits may be
specified in the size parameter. The maximum number of digits to the right of the decimal
point is specified in the d parameter
DECIMAL(size,d)
A DOUBLE stored as a string , allowing for a fixed decimal point. The maximum number of
digits may be specified in the size parameter. The maximum number of digits to the right of
the decimal point is specified in the d parameter
*The integer types have an extra option called UNSIGNED. Normally, the integer goes from an
negative to positive value. Adding the UNSIGNED attribute will move that range up so it starts at zero
instead of a negative number.
Date types:
Data type
Description
DATE()
DATETIME()
TIMESTAMP()
*A timestamp. TIMESTAMP values are stored as the number of seconds since the Unix epoch
('1970-01-01 00:00:00' UTC). Format: YYYY-MM-DD HH:MM:SS
Note: The supported range is from '1970-01-01 00:00:01' UTC to '2038-01-09 03:14:07'
UTC
TIME()
YEAR()
*Even if DATETIME and TIMESTAMP return the same format, they work very differently. In an INSERT
or UPDATE query, the TIMESTAMP automatically set itself to the current date and time. TIMESTAMP
also accepts various formats, like YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD, or YYMMDD.
Description
Storage
char(n)
varchar(n)
varchar(max)
text
Unicode strings:
Data type
Description
nchar(n)
nvarchar(n)
nvarchar(max)
ntext
Binary types:
Storage
Data type
Description
bit
Allows 0, 1, or NULL
binary(n)
varbinary(n)
varbinary(max)
image
Storage
Number types:
Data type
Description
Storage
tinyint
1 byte
smallint
2 bytes
int
4 bytes
bigint
8 bytes
decimal(p,s)
5-17
bytes
numeric(p,s)
5-17
bytes
smallmoney
4 bytes
money
8 bytes
float(n)
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.
real
4 bytes
Data type
Description
Storage
datetime
8 bytes
datetime2
6-8 bytes
smalldatetime
4 bytes
date
3 bytes
time
3-5 bytes
datetimeoffset
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
Date types:
Description
sql_variant
Stores up to 8,000 bytes of data of various data types, except text, ntext, and timestamp
uniqueidentifier
xml
cursor
table
SQL Functions
SQL Aggregate Functions
SQL aggregate functions return a single value, calculated from values in a column.
Useful aggregate functions:
OrderDate
OrderPrice
Customer
2008/11/12
1000
Hansen
2008/10/23
1600
Nilsen
2008/09/02
700
Hansen
2008/09/03
300
Hansen
2008/08/30
2000
Jensen
2008/10/04
100
Nilsen
Note: COUNT(DISTINCT) works with ORACLE and Microsoft SQL Server, but not with Microsoft Access.
OrderDate
OrderPrice
Customer
2008/11/12
1000
Hansen
2008/10/23
1600
Nilsen
2008/09/02
700
Hansen
2008/09/03
300
Hansen
2008/08/30
2000
Jensen
2008/10/04
100
Nilsen
Now we want to count the number of unique customers in the "Orders" table.
We use the following SQL statement:
OrderDate
OrderPrice
Customer
2008/11/12
1000
Hansen
2008/10/23
1600
Nilsen
2008/09/02
700
Hansen
2008/09/03
300
Hansen
2008/08/30
2000
Jensen
2008/10/04
100
Nilsen
FirstOrderPrice
1000
OrderDate
OrderPrice
Customer
2008/11/12
1000
Hansen
2008/10/23
1600
Nilsen
2008/09/02
700
Hansen
2008/09/03
300
Hansen
2008/08/30
2000
Jensen
2008/10/04
100
Nilsen
OrderDate
OrderPrice
Customer
2008/11/12
1000
Hansen
2008/10/23
1600
Nilsen
2008/09/02
700
Hansen
2008/09/03
300
Hansen
2008/08/30
2000
Jensen
2008/10/04
100
Nilsen
OrderDate
OrderPrice
Customer
2008/11/12
1000
Hansen
2008/10/23
1600
Nilsen
2008/09/02
700
Hansen
2008/09/03
300
Hansen
2008/08/30
2000
Jensen
2008/10/04
100
Nilsen
OrderDate
OrderPrice
Customer
2008/11/12
1000
Hansen
2008/10/23
1600
Nilsen
2008/09/02
700
Hansen
2008/09/03
300
Hansen
2008/08/30
2000
Jensen
2008/10/04
100
Nilsen
OrderDate
OrderPrice
Customer
2008/11/12
1000
Hansen
2008/10/23
1600
Nilsen
2008/09/02
700
Hansen
2008/09/03
300
Hansen
2008/08/30
2000
Jensen
2008/10/04
100
Nilsen
Now we want to find the total sum (total order) of each customer.
We will have to use the GROUP BY statement to group the customers.
We use the following SQL statement:
SUM(OrderPrice)
Hansen
2000
Nilsen
1700
Jensen
2000
SUM(OrderPrice)
Hansen
5700
Nilsen
5700
Hansen
5700
Hansen
5700
Jensen
5700
Nilsen
5700
OrderDate
OrderPrice
Customer
2008/11/12
1000
Hansen
2008/10/23
1600
Nilsen
2008/09/02
700
Hansen
2008/09/03
300
Hansen
2008/08/30
2000
Jensen
2008/10/04
100
Nilsen
Now we want to find if any of the customers have a total order of less than 2000.
We use the following SQL statement:
SUM(OrderPrice)
Nilsen
1700
Now we want to find if the customers "Hansen" or "Jensen" have a total order of more than 1500.
We add an ordinary WHERE clause to the SQL statement:
SUM(OrderPrice)
Hansen
2000
Jensen
2000
LastName
FirstName
Address
City
Hansen
Ola
Timoteivn 10
Sandnes
Svendson
Tove
Borgvn 23
Sandnes
Pettersen
Kari
Storgt 20
Stavanger
Now we want to select the content of the "LastName" and "FirstName" columns above, and convert
the "LastName" column to uppercase.
We use the following SELECT statement:
FirstName
HANSEN
Ola
SVENDSON
Tove
PETTERSEN
Kari
LastName
FirstName
Address
City
Hansen
Ola
Timoteivn 10
Sandnes
Svendson
Tove
Borgvn 23
Sandnes
Pettersen
Kari
Storgt 20
Stavanger
Now we want to select the content of the "LastName" and "FirstName" columns above, and convert
the "LastName" column to lowercase.
We use the following SELECT statement:
FirstName
hansen
Ola
svendson
Tove
pettersen
Kari
Description
column_name
start
length
Optional. The number of characters to return. If omitted, the MID() function returns the rest
of the text
LastName
FirstName
Address
City
Hansen
Ola
Timoteivn 10
Sandnes
Svendson
Tove
Borgvn 23
Sandnes
Pettersen
Kari
Storgt 20
Stavanger
Now we want to extract the first four characters of the "City" column above.
We use the following SELECT statement:
P_Id
LastName
FirstName
Address
City
Hansen
Ola
Timoteivn 10
Sandnes
Svendson
Tove
Borgvn 23
Sandnes
Pettersen
Kari
Storgt 20
Stavanger
Now we want to select the length of the values in the "Address" column above.
We use the following SELECT statement:
Description
column_name
decimals
ProductName
Unit
UnitPrice
Jarlsberg
1000 g
10.45
Mascarpone
1000 g
32.56
Gorgonzola
1000 g
15.67
Now we want to display the product name and the price rounded to the nearest integer.
We use the following SELECT statement:
UnitPrice
Jarlsberg
10
Mascarpone
33
Gorgonzola
16
ProductName
Unit
UnitPrice
Jarlsberg
1000 g
10.45
Mascarpone
1000 g
32.56
Gorgonzola
1000 g
15.67
Now we want to display the products and prices per today's date.
We use the following SELECT statement:
UnitPrice
PerDate
Jarlsberg
10.45
10/7/2008 11:25:02 AM
Mascarpone
32.56
10/7/2008 11:25:02 AM
Gorgonzola
15.67
10/7/2008 11:25:02 AM
Description
column_name
format
ProductName
Unit
UnitPrice
Jarlsberg
1000 g
10.45
Mascarpone
1000 g
32.56
Gorgonzola
1000 g
15.67
Now we want to display the products and prices per today's date (with today's date displayed in the
following format "YYYY-MM-DD").
We use the following SELECT statement:
UnitPrice
PerDate
Jarlsberg
10.45
2008-10-07
Mascarpone
32.56
2008-10-07
Gorgonzola
15.67
2008-10-07
SQL Statement
Syntax
AND / OR
SELECT column_name(s)
FROM table_name
WHERE condition
AND|OR condition
ALTER TABLE
AS (alias)
BETWEEN
SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2
CREATE DATABASE
CREATE TABLE
CREATE INDEX
CREATE VIEW
DELETE
DROP DATABASE
DROP INDEX
GROUP BY
HAVING
IN
SELECT column_name(s)
FROM table_name
WHERE column_name
IN (value1,value2,..)
INSERT INTO
INNER JOIN
SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name
LEFT JOIN
SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
RIGHT JOIN
SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
FULL JOIN
SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name=table_name2.column_name
LIKE
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern
ORDER BY
SELECT column_name(s)
FROM table_name
ORDER BY column_name [ASC|DESC]
SELECT
SELECT column_name(s)
FROM table_name
SELECT *
SELECT *
FROM table_name
SELECT DISTINCT
SELECT INTO
SELECT *
INTO new_table_name [IN externaldatabase]
FROM old_table_name
or
SELECT column_name(s)
INTO new_table_name [IN externaldatabase]
FROM old_table_name
SELECT TOP
TRUNCATE TABLE
UNION
UNION ALL
UPDATE
UPDATE table_name
SET column1=value, column2=value,...
WHERE some_column=some_value
WHERE
SELECT column_name(s)
FROM table_name
WHERE column_name operator value