SlideShare a Scribd company logo
1 of 165
Download to read offline
Introduction to
SQL
Phil Spector
Introduction to SQL
Phil Spector
Statistical Computing Facility
University of California, Berkeley
Introduction to
SQL
Introduction to
SQL What is SQL?
Introduction to
SQL What is SQL?
I Structured Query Language
Introduction to
SQL What is SQL?
I Structured Query Language
I Usually “talk” to a database server
Introduction to
SQL What is SQL?
I Structured Query Language
I Usually “talk” to a database server
I Used as front end to many databases (mysql,
postgresql, oracle, sybase)
Introduction to
SQL What is SQL?
I Structured Query Language
I Usually “talk” to a database server
I Used as front end to many databases (mysql,
postgresql, oracle, sybase)
I Three Subsystems: data description, data access and
privileges
Introduction to
SQL What is SQL?
I Structured Query Language
I Usually “talk” to a database server
I Used as front end to many databases (mysql,
postgresql, oracle, sybase)
I Three Subsystems: data description, data access and
privileges
I Optimized for certain data arrangements
Introduction to
SQL What is SQL?
I Structured Query Language
I Usually “talk” to a database server
I Used as front end to many databases (mysql,
postgresql, oracle, sybase)
I Three Subsystems: data description, data access and
privileges
I Optimized for certain data arrangements
I The language is case-sensitive, but I use upper case
for keywords.
Introduction to
SQL When do you need a Database?
Introduction to
SQL When do you need a Database?
I Multiple simultaneous changes to data (concurrency)
Introduction to
SQL When do you need a Database?
I Multiple simultaneous changes to data (concurrency)
I Data changes on a regular basis
Introduction to
SQL When do you need a Database?
I Multiple simultaneous changes to data (concurrency)
I Data changes on a regular basis
I Large data sets where you only need some
observations/variables
Introduction to
SQL When do you need a Database?
I Multiple simultaneous changes to data (concurrency)
I Data changes on a regular basis
I Large data sets where you only need some
observations/variables
I Share huge data set among many people
Introduction to
SQL When do you need a Database?
I Multiple simultaneous changes to data (concurrency)
I Data changes on a regular basis
I Large data sets where you only need some
observations/variables
I Share huge data set among many people
I Rapid queries with no analysis
Introduction to
SQL When do you need a Database?
I Multiple simultaneous changes to data (concurrency)
I Data changes on a regular basis
I Large data sets where you only need some
observations/variables
I Share huge data set among many people
I Rapid queries with no analysis
I Web interfaces to data, especially dynamic data
Introduction to
SQL Uses of Databases
Traditional Uses:
Introduction to
SQL Uses of Databases
Traditional Uses:
I Live Queries
Introduction to
SQL Uses of Databases
Traditional Uses:
I Live Queries
I Report Generation
Introduction to
SQL Uses of Databases
Traditional Uses:
I Live Queries
I Report Generation
I Normalization, foreign keys, joins, etc.
Introduction to
SQL Uses of Databases
Traditional Uses:
I Live Queries
I Report Generation
I Normalization, foreign keys, joins, etc.
Newer uses:
Introduction to
SQL Uses of Databases
Traditional Uses:
I Live Queries
I Report Generation
I Normalization, foreign keys, joins, etc.
Newer uses:
I Storage - data is extracted and analyzed in another
application
Introduction to
SQL Uses of Databases
Traditional Uses:
I Live Queries
I Report Generation
I Normalization, foreign keys, joins, etc.
Newer uses:
I Storage - data is extracted and analyzed in another
application
I Backends to web sites
Introduction to
SQL Uses of Databases
Traditional Uses:
I Live Queries
I Report Generation
I Normalization, foreign keys, joins, etc.
Newer uses:
I Storage - data is extracted and analyzed in another
application
I Backends to web sites
I Traditional rules may not be as important
Introduction to
SQL Ways to Use SQL
Introduction to
SQL Ways to Use SQL
I console command (mysql -u user -p dbname)
Introduction to
SQL Ways to Use SQL
I console command (mysql -u user -p dbname)
I GUI interfaces are often available
Introduction to
SQL Ways to Use SQL
I console command (mysql -u user -p dbname)
I GUI interfaces are often available
I Interfaces to many programming languages: R,
python, perl, PHP, etc.
Introduction to
SQL Ways to Use SQL
I console command (mysql -u user -p dbname)
I GUI interfaces are often available
I Interfaces to many programming languages: R,
python, perl, PHP, etc.
I SQLite - use SQL without a database server
Introduction to
SQL Ways to Use SQL
I console command (mysql -u user -p dbname)
I GUI interfaces are often available
I Interfaces to many programming languages: R,
python, perl, PHP, etc.
I SQLite - use SQL without a database server
I PROC SQL in SAS
Introduction to
SQL Some Relational Database Concepts
Introduction to
SQL Some Relational Database Concepts
I A database server can contain many databases
Introduction to
SQL Some Relational Database Concepts
I A database server can contain many databases
I Databases are collections of tables
Introduction to
SQL Some Relational Database Concepts
I A database server can contain many databases
I Databases are collections of tables
I Tables are two-dimensional with rows (observations)
and columns (variables)
Introduction to
SQL Some Relational Database Concepts
I A database server can contain many databases
I Databases are collections of tables
I Tables are two-dimensional with rows (observations)
and columns (variables)
I Limited mathematical and summary operations
available
Introduction to
SQL Some Relational Database Concepts
I A database server can contain many databases
I Databases are collections of tables
I Tables are two-dimensional with rows (observations)
and columns (variables)
I Limited mathematical and summary operations
available
I Very good at combining information from several
tables
Introduction to
SQL Finding Your Way Around the Server
Since a single server can support many databases, each
containing many tables, with each table having a variety
of columns, it’s easy to get lost when you’re working with
databases. These commands will help figure out what’s
available:
Introduction to
SQL Finding Your Way Around the Server
Since a single server can support many databases, each
containing many tables, with each table having a variety
of columns, it’s easy to get lost when you’re working with
databases. These commands will help figure out what’s
available:
I SHOW DATABASES;
Introduction to
SQL Finding Your Way Around the Server
Since a single server can support many databases, each
containing many tables, with each table having a variety
of columns, it’s easy to get lost when you’re working with
databases. These commands will help figure out what’s
available:
I SHOW DATABASES;
I SHOW TABLES IN database;
Introduction to
SQL Finding Your Way Around the Server
Since a single server can support many databases, each
containing many tables, with each table having a variety
of columns, it’s easy to get lost when you’re working with
databases. These commands will help figure out what’s
available:
I SHOW DATABASES;
I SHOW TABLES IN database;
I SHOW COLUMNS IN table;
Introduction to
SQL Finding Your Way Around the Server
Since a single server can support many databases, each
containing many tables, with each table having a variety
of columns, it’s easy to get lost when you’re working with
databases. These commands will help figure out what’s
available:
I SHOW DATABASES;
I SHOW TABLES IN database;
I SHOW COLUMNS IN table;
I DESCRIBE table; - shows the columns and their
types
Introduction to
SQL Variable Types
SQL supports a very large number of different formats for
internal storage of information.
Introduction to
SQL Variable Types
SQL supports a very large number of different formats for
internal storage of information.
Numeric
Introduction to
SQL Variable Types
SQL supports a very large number of different formats for
internal storage of information.
Numeric
I INTEGER, SMALLINT, BIGINT
Introduction to
SQL Variable Types
SQL supports a very large number of different formats for
internal storage of information.
Numeric
I INTEGER, SMALLINT, BIGINT
I NUMERIC(w,d), DECIMAL(w,d) - numbers with width
w and d decimal places
Introduction to
SQL Variable Types
SQL supports a very large number of different formats for
internal storage of information.
Numeric
I INTEGER, SMALLINT, BIGINT
I NUMERIC(w,d), DECIMAL(w,d) - numbers with width
w and d decimal places
I REAL, DOUBLE PRECISION - machine and database
dependent
Introduction to
SQL Variable Types
SQL supports a very large number of different formats for
internal storage of information.
Numeric
I INTEGER, SMALLINT, BIGINT
I NUMERIC(w,d), DECIMAL(w,d) - numbers with width
w and d decimal places
I REAL, DOUBLE PRECISION - machine and database
dependent
I FLOAT(p) - floating point number with p binary
digits of precision
Introduction to
SQL Variable Types (cont’d)
Character
Introduction to
SQL Variable Types (cont’d)
Character
I CHARACTER(L) - a fixed-length character of length L
Introduction to
SQL Variable Types (cont’d)
Character
I CHARACTER(L) - a fixed-length character of length L
I CHARACTER VARYING(L) or VARCHAR(L) - supports
maximum length of L
Introduction to
SQL Variable Types (cont’d)
Character
I CHARACTER(L) - a fixed-length character of length L
I CHARACTER VARYING(L) or VARCHAR(L) - supports
maximum length of L
Binary
Introduction to
SQL Variable Types (cont’d)
Character
I CHARACTER(L) - a fixed-length character of length L
I CHARACTER VARYING(L) or VARCHAR(L) - supports
maximum length of L
Binary
I BIT(L), BIT VARYING(L) - like corresponding
characters
Introduction to
SQL Variable Types (cont’d)
Character
I CHARACTER(L) - a fixed-length character of length L
I CHARACTER VARYING(L) or VARCHAR(L) - supports
maximum length of L
Binary
I BIT(L), BIT VARYING(L) - like corresponding
characters
I BINARY LARGE OBJECT(L) or BLOB(L)
Introduction to
SQL Variable Types (cont’d)
Character
I CHARACTER(L) - a fixed-length character of length L
I CHARACTER VARYING(L) or VARCHAR(L) - supports
maximum length of L
Binary
I BIT(L), BIT VARYING(L) - like corresponding
characters
I BINARY LARGE OBJECT(L) or BLOB(L)
Temporal
Introduction to
SQL Variable Types (cont’d)
Character
I CHARACTER(L) - a fixed-length character of length L
I CHARACTER VARYING(L) or VARCHAR(L) - supports
maximum length of L
Binary
I BIT(L), BIT VARYING(L) - like corresponding
characters
I BINARY LARGE OBJECT(L) or BLOB(L)
Temporal
I DATE
Introduction to
SQL Variable Types (cont’d)
Character
I CHARACTER(L) - a fixed-length character of length L
I CHARACTER VARYING(L) or VARCHAR(L) - supports
maximum length of L
Binary
I BIT(L), BIT VARYING(L) - like corresponding
characters
I BINARY LARGE OBJECT(L) or BLOB(L)
Temporal
I DATE
I TIME
Introduction to
SQL Variable Types (cont’d)
Character
I CHARACTER(L) - a fixed-length character of length L
I CHARACTER VARYING(L) or VARCHAR(L) - supports
maximum length of L
Binary
I BIT(L), BIT VARYING(L) - like corresponding
characters
I BINARY LARGE OBJECT(L) or BLOB(L)
Temporal
I DATE
I TIME
I TIMESTAMP
Introduction to
SQL
CREATE TABLE statement
Suppose we have data measured on the height and weight
of children over a range of ages. The first step is deciding
on the appropriate variable types, and creating the table
with the CREATE TABLE command.
Introduction to
SQL
CREATE TABLE statement
Suppose we have data measured on the height and weight
of children over a range of ages. The first step is deciding
on the appropriate variable types, and creating the table
with the CREATE TABLE command.
CREATE TABLE kids(id CHAR(6),
race SMALLINT,
age DECIMAL(6,3),
height DECIMAL(7,3),
weight DECIMAL(7,3),
sex SMALLINT);
Introduction to
SQL Entering observations into a table
We could now enter individual items with the INSERT
command:
INSERT INTO kids VALUES(100011,2,10.346,
148.5,38.95,1);
This quickly gets tedious. We can automate the process
using the LOAD DATA command:
Introduction to
SQL Entering observations into a table
We could now enter individual items with the INSERT
command:
INSERT INTO kids VALUES(100011,2,10.346,
148.5,38.95,1);
This quickly gets tedious. We can automate the process
using the LOAD DATA command:
LOAD DATA INFILE ’kids.tab’
INTO TABLE kids
FIELDS TERMINATED BY ’t’;
Introduction to
SQL Entering observations into a table
We could now enter individual items with the INSERT
command:
INSERT INTO kids VALUES(100011,2,10.346,
148.5,38.95,1);
This quickly gets tedious. We can automate the process
using the LOAD DATA command:
LOAD DATA INFILE ’kids.tab’
INTO TABLE kids
FIELDS TERMINATED BY ’t’;
This will read an entire tab-separated file into the
database in one command.
Introduction to
SQL Comparison Operators
In SQL, the WHERE clause allows you to operate on subsets
of a table. The following comparison operators are
avaiable:
Introduction to
SQL Comparison Operators
In SQL, the WHERE clause allows you to operate on subsets
of a table. The following comparison operators are
avaiable:
I Usual logical operators: < > <= >= = <>
Introduction to
SQL Comparison Operators
In SQL, the WHERE clause allows you to operate on subsets
of a table. The following comparison operators are
avaiable:
I Usual logical operators: < > <= >= = <>
I BETWEEN used to test for a range
Introduction to
SQL Comparison Operators
In SQL, the WHERE clause allows you to operate on subsets
of a table. The following comparison operators are
avaiable:
I Usual logical operators: < > <= >= = <>
I BETWEEN used to test for a range
I IN used to test group membership
I Keyword NOT used for negation
Introduction to
SQL Comparison Operators
In SQL, the WHERE clause allows you to operate on subsets
of a table. The following comparison operators are
avaiable:
I Usual logical operators: < > <= >= = <>
I BETWEEN used to test for a range
I IN used to test group membership
I Keyword NOT used for negation
I LIKE operator allows wildcards
Introduction to
SQL Comparison Operators
In SQL, the WHERE clause allows you to operate on subsets
of a table. The following comparison operators are
avaiable:
I Usual logical operators: < > <= >= = <>
I BETWEEN used to test for a range
I IN used to test group membership
I Keyword NOT used for negation
I LIKE operator allows wildcards
I _ means single character, % means anything
Introduction to
SQL Comparison Operators
In SQL, the WHERE clause allows you to operate on subsets
of a table. The following comparison operators are
avaiable:
I Usual logical operators: < > <= >= = <>
I BETWEEN used to test for a range
I IN used to test group membership
I Keyword NOT used for negation
I LIKE operator allows wildcards
I _ means single character, % means anything
I SELECT salary WHERE name LIKE ’Fred %’;
Introduction to
SQL Comparison Operators
In SQL, the WHERE clause allows you to operate on subsets
of a table. The following comparison operators are
avaiable:
I Usual logical operators: < > <= >= = <>
I BETWEEN used to test for a range
I IN used to test group membership
I Keyword NOT used for negation
I LIKE operator allows wildcards
I _ means single character, % means anything
I SELECT salary WHERE name LIKE ’Fred %’;
I RLIKE operator allows regular expressions
Introduction to
SQL Comparison Operators
In SQL, the WHERE clause allows you to operate on subsets
of a table. The following comparison operators are
avaiable:
I Usual logical operators: < > <= >= = <>
I BETWEEN used to test for a range
I IN used to test group membership
I Keyword NOT used for negation
I LIKE operator allows wildcards
I _ means single character, % means anything
I SELECT salary WHERE name LIKE ’Fred %’;
I RLIKE operator allows regular expressions
I Use AND(&&) and OR(||) to combine conditions
Introduction to
SQL Updating a Table
To change some of the values of columns of a table, you
can use the UPDATE command. Changes are provided as a
comma-separated list of column/value pairs.
Introduction to
SQL Updating a Table
To change some of the values of columns of a table, you
can use the UPDATE command. Changes are provided as a
comma-separated list of column/value pairs.
For example, to add one to the weight of an observation
in the kids table where id is 101311 and age is between 9
and 10, we could use:
Introduction to
SQL Updating a Table
To change some of the values of columns of a table, you
can use the UPDATE command. Changes are provided as a
comma-separated list of column/value pairs.
For example, to add one to the weight of an observation
in the kids table where id is 101311 and age is between 9
and 10, we could use:
UPDATE kids SET weight=weight + 1
WHERE id=’101311’ AND
age BETWEEN 9 and 10;
Introduction to
SQL Updating a Table
To change some of the values of columns of a table, you
can use the UPDATE command. Changes are provided as a
comma-separated list of column/value pairs.
For example, to add one to the weight of an observation
in the kids table where id is 101311 and age is between 9
and 10, we could use:
UPDATE kids SET weight=weight + 1
WHERE id=’101311’ AND
age BETWEEN 9 and 10;
Be careful with UPDATE, because if you don’t provide a
WHERE clause, all the rows of the table will be changed.
Introduction to
SQL The SELECT statement
For many of the modern uses of databases, all you’ll need
to do with the database is to select some subset of the
variables and/or observations from a table, and let some
other program manipulate them. In SQL the SELECT
statement is the workhorse for these operations.
Introduction to
SQL The SELECT statement
For many of the modern uses of databases, all you’ll need
to do with the database is to select some subset of the
variables and/or observations from a table, and let some
other program manipulate them. In SQL the SELECT
statement is the workhorse for these operations.
SELECT columns or computations
FROM table
WHERE condition
GROUP BY columns
HAVING condition
ORDER BY column [ASC | DESC]
LIMIT offset,count;
Introduction to
SQL Examples of SELECT queries
Suppose we wish to simply see all of the data:
Introduction to
SQL Examples of SELECT queries
Suppose we wish to simply see all of the data:
SELECT * FROM kids; View
Introduction to
SQL Examples of SELECT queries
Suppose we wish to simply see all of the data:
SELECT * FROM kids; View
Find the age, race, height and weight for any observations
with weight greater than 80kg and height less than 150cm:
Introduction to
SQL Examples of SELECT queries
Suppose we wish to simply see all of the data:
SELECT * FROM kids; View
Find the age, race, height and weight for any observations
with weight greater than 80kg and height less than 150cm:
SELECT age,race,height,weight FROM kids View
WHERE weight > 80 AND height < 150;
Introduction to
SQL Examples of SELECT queries
Suppose we wish to simply see all of the data:
SELECT * FROM kids; View
Find the age, race, height and weight for any observations
with weight greater than 80kg and height less than 150cm:
SELECT age,race,height,weight FROM kids View
WHERE weight > 80 AND height < 150;
Find all information about the 10 tallest observations:
Introduction to
SQL Examples of SELECT queries
Suppose we wish to simply see all of the data:
SELECT * FROM kids; View
Find the age, race, height and weight for any observations
with weight greater than 80kg and height less than 150cm:
SELECT age,race,height,weight FROM kids View
WHERE weight > 80 AND height < 150;
Find all information about the 10 tallest observations:
SELECT * FROM kids View
ORDER BY height DESC limit 1,10;
Introduction to
SQL Examples of SELECT queries
Suppose we wish to simply see all of the data:
SELECT * FROM kids; View
Find the age, race, height and weight for any observations
with weight greater than 80kg and height less than 150cm:
SELECT age,race,height,weight FROM kids View
WHERE weight > 80 AND height < 150;
Find all information about the 10 tallest observations:
SELECT * FROM kids View
ORDER BY height DESC limit 1,10;
Find all information about observations where age is from
17 to 18 and weight is from 180 to 185:
Introduction to
SQL Examples of SELECT queries
Suppose we wish to simply see all of the data:
SELECT * FROM kids; View
Find the age, race, height and weight for any observations
with weight greater than 80kg and height less than 150cm:
SELECT age,race,height,weight FROM kids View
WHERE weight > 80 AND height < 150;
Find all information about the 10 tallest observations:
SELECT * FROM kids View
ORDER BY height DESC limit 1,10;
Find all information about observations where age is from
17 to 18 and weight is from 180 to 185:
SELECT * FROM kids WHERE age BETWEEN 17 AND 18
AND weight BETWEEN 180 AND 185; View
Introduction to
SQL Summaries and Computations
SQL supports basic arithmetic operations to create new
columns, as well as some summarization functions which
include
Introduction to
SQL Summaries and Computations
SQL supports basic arithmetic operations to create new
columns, as well as some summarization functions which
include
I COUNT()
Introduction to
SQL Summaries and Computations
SQL supports basic arithmetic operations to create new
columns, as well as some summarization functions which
include
I COUNT()
I AVG() (mean)
Introduction to
SQL Summaries and Computations
SQL supports basic arithmetic operations to create new
columns, as well as some summarization functions which
include
I COUNT()
I AVG() (mean)
I SUM()
Introduction to
SQL Summaries and Computations
SQL supports basic arithmetic operations to create new
columns, as well as some summarization functions which
include
I COUNT()
I AVG() (mean)
I SUM()
I MIN()
Introduction to
SQL Summaries and Computations
SQL supports basic arithmetic operations to create new
columns, as well as some summarization functions which
include
I COUNT()
I AVG() (mean)
I SUM()
I MIN()
I MAX()
Introduction to
SQL Summaries and Computations
SQL supports basic arithmetic operations to create new
columns, as well as some summarization functions which
include
I COUNT()
I AVG() (mean)
I SUM()
I MIN()
I MAX()
Since the COUNT for all columns is the same, the form
COUNT(*) is often used.
Introduction to
SQL Summaries and Computations
SQL supports basic arithmetic operations to create new
columns, as well as some summarization functions which
include
I COUNT()
I AVG() (mean)
I SUM()
I MIN()
I MAX()
Since the COUNT for all columns is the same, the form
COUNT(*) is often used.
Other functions (ABS(), FLOOR(), ROUND(), SQRT(), etc.)
may also be available.
Introduction to
SQL Summary and Computation examples
Introduction to
SQL Summary and Computation examples
Find max. height for age between 10 and 11 and race=1:
Introduction to
SQL Summary and Computation examples
Find max. height for age between 10 and 11 and race=1:
SELECT MAX(height) FROM kids View
WHERE age BETWEEN 10 AND 11 AND race = 1 ;
Introduction to
SQL Summary and Computation examples
Find max. height for age between 10 and 11 and race=1:
SELECT MAX(height) FROM kids View
WHERE age BETWEEN 10 AND 11 AND race = 1 ;
By combining with the GROUP BY command, useful
summaries can be obtained.
Introduction to
SQL Summary and Computation examples
Find max. height for age between 10 and 11 and race=1:
SELECT MAX(height) FROM kids View
WHERE age BETWEEN 10 AND 11 AND race = 1 ;
By combining with the GROUP BY command, useful
summaries can be obtained.
Find the average BMI (weight/height2
∗ 10000) by sex
and race:
Introduction to
SQL Summary and Computation examples
Find max. height for age between 10 and 11 and race=1:
SELECT MAX(height) FROM kids View
WHERE age BETWEEN 10 AND 11 AND race = 1 ;
By combining with the GROUP BY command, useful
summaries can be obtained.
Find the average BMI (weight/height2
∗ 10000) by sex
and race:
SELECT sex,race,count(*) AS n, View
AVG(weight/(height*height)*10000) AS bmi
FROM kids GROUP BY sex,race;
Introduction to
SQL Summary and Computation examples
Find max. height for age between 10 and 11 and race=1:
SELECT MAX(height) FROM kids View
WHERE age BETWEEN 10 AND 11 AND race = 1 ;
By combining with the GROUP BY command, useful
summaries can be obtained.
Find the average BMI (weight/height2
∗ 10000) by sex
and race:
SELECT sex,race,count(*) AS n, View
AVG(weight/(height*height)*10000) AS bmi
FROM kids GROUP BY sex,race;
The SUM function can count logical expressions:
Introduction to
SQL Summary and Computation examples
Find max. height for age between 10 and 11 and race=1:
SELECT MAX(height) FROM kids View
WHERE age BETWEEN 10 AND 11 AND race = 1 ;
By combining with the GROUP BY command, useful
summaries can be obtained.
Find the average BMI (weight/height2
∗ 10000) by sex
and race:
SELECT sex,race,count(*) AS n, View
AVG(weight/(height*height)*10000) AS bmi
FROM kids GROUP BY sex,race;
The SUM function can count logical expressions:
SELECT race,SUM(height > 150)/COUNT(*) View
FROM kids GROUP BY race;
Introduction to
SQL Selecting based on Summaries
Summaries can’t be used in the WHERE clause, but they
can be used in the HAVING clause. For example, suppose
we wanted to find all the IDs in the kids database for
which there were less than 2 observations:
Introduction to
SQL Selecting based on Summaries
Summaries can’t be used in the WHERE clause, but they
can be used in the HAVING clause. For example, suppose
we wanted to find all the IDs in the kids database for
which there were less than 2 observations:
SELECT id FROM kids View
GROUP BY id HAVING COUNT(*) < 2;
Introduction to
SQL Selecting based on Summaries
Summaries can’t be used in the WHERE clause, but they
can be used in the HAVING clause. For example, suppose
we wanted to find all the IDs in the kids database for
which there were less than 2 observations:
SELECT id FROM kids View
GROUP BY id HAVING COUNT(*) < 2;
Get all information about ids that have exactly ten
observations:
Introduction to
SQL Selecting based on Summaries
Summaries can’t be used in the WHERE clause, but they
can be used in the HAVING clause. For example, suppose
we wanted to find all the IDs in the kids database for
which there were less than 2 observations:
SELECT id FROM kids View
GROUP BY id HAVING COUNT(*) < 2;
Get all information about ids that have exactly ten
observations:
SELECT * FROM kids View
GROUP BY id HAVING COUNT(*) = 10;
Introduction to
SQL Selecting based on Summaries
Summaries can’t be used in the WHERE clause, but they
can be used in the HAVING clause. For example, suppose
we wanted to find all the IDs in the kids database for
which there were less than 2 observations:
SELECT id FROM kids View
GROUP BY id HAVING COUNT(*) < 2;
Get all information about ids that have exactly ten
observations:
SELECT * FROM kids View
GROUP BY id HAVING COUNT(*) = 10;
This doesn’t work - it only gives the first observation for
each id.
Introduction to
SQL Subqueries
By putting a SELECT statement in parentheses, you can
use it in other SELECT statements as if it were another
table.
Introduction to
SQL Subqueries
By putting a SELECT statement in parentheses, you can
use it in other SELECT statements as if it were another
table.
SELECT * FROM kids View
WHERE id IN
(SELECT id FROM kids
GROUP BY id
HAVING COUNT(*) = 10);
Introduction to
SQL Subqueries
By putting a SELECT statement in parentheses, you can
use it in other SELECT statements as if it were another
table.
SELECT * FROM kids View
WHERE id IN
(SELECT id FROM kids
GROUP BY id
HAVING COUNT(*) = 10);
This may be slow if the number of ids is large.
Introduction to
SQL Subqueries
By putting a SELECT statement in parentheses, you can
use it in other SELECT statements as if it were another
table.
SELECT * FROM kids View
WHERE id IN
(SELECT id FROM kids
GROUP BY id
HAVING COUNT(*) = 10);
This may be slow if the number of ids is large.
A more efficient way is to use the subquery in an inner
join (discussed later):
Introduction to
SQL Subqueries
By putting a SELECT statement in parentheses, you can
use it in other SELECT statements as if it were another
table.
SELECT * FROM kids View
WHERE id IN
(SELECT id FROM kids
GROUP BY id
HAVING COUNT(*) = 10);
This may be slow if the number of ids is large.
A more efficient way is to use the subquery in an inner
join (discussed later):
SELECT * FROM kids View
INNER JOIN
(SELECT id FROM kids
GROUP BY id
HAVING COUNT(*) = 10) AS t USING(id);
Introduction to
SQL Subqueries
By putting a SELECT statement in parentheses, you can
use it in other SELECT statements as if it were another
table.
SELECT * FROM kids View
WHERE id IN
(SELECT id FROM kids
GROUP BY id
HAVING COUNT(*) = 10);
This may be slow if the number of ids is large.
A more efficient way is to use the subquery in an inner
join (discussed later):
SELECT * FROM kids View
INNER JOIN
(SELECT id FROM kids
GROUP BY id
HAVING COUNT(*) = 10) AS t USING(id);
This is considerably faster than the previous query.
Introduction to
SQL Subqueries (cont’d)
Suppose we want to find all information about the
observation with maximum weight:
Introduction to
SQL Subqueries (cont’d)
Suppose we want to find all information about the
observation with maximum weight:
SELECT * FROM kids View
HAVING weight = MAX(weight);
Introduction to
SQL Subqueries (cont’d)
Suppose we want to find all information about the
observation with maximum weight:
SELECT * FROM kids View
HAVING weight = MAX(weight);
It returns an empty set!
Introduction to
SQL Subqueries (cont’d)
Suppose we want to find all information about the
observation with maximum weight:
SELECT * FROM kids View
HAVING weight = MAX(weight);
It returns an empty set!
Subqueries can be used to find the correct information:
Introduction to
SQL Subqueries (cont’d)
Suppose we want to find all information about the
observation with maximum weight:
SELECT * FROM kids View
HAVING weight = MAX(weight);
It returns an empty set!
Subqueries can be used to find the correct information:
SELECT * FROM kids View
WHERE weight =
(SELECT MAX(weight) FROM kids);
Introduction to
SQL Subqueries (cont’d)
Suppose we want to find all information about the
observation with maximum weight:
SELECT * FROM kids View
HAVING weight = MAX(weight);
It returns an empty set!
Subqueries can be used to find the correct information:
SELECT * FROM kids View
WHERE weight =
(SELECT MAX(weight) FROM kids);
A similar thing can be done when there are grouping
variables:
Introduction to
SQL Subqueries (cont’d)
Suppose we want to find all information about the
observation with maximum weight:
SELECT * FROM kids View
HAVING weight = MAX(weight);
It returns an empty set!
Subqueries can be used to find the correct information:
SELECT * FROM kids View
WHERE weight =
(SELECT MAX(weight) FROM kids);
A similar thing can be done when there are grouping
variables:
SELECT k.id,k.sex,k.race,k.age, View
k.weight,k.height FROM kids AS k,
(SELECT sex,race,max(weight) AS weight from
kids) AS m WHERE k.sex=m.sex AND
k.race=m.race AND k.weight=m.weight;
Introduction to
SQL Making Tables from Queries
Sometimes it is useful to store a table which results from
a query.
Introduction to
SQL Making Tables from Queries
Sometimes it is useful to store a table which results from
a query.
Suppose we want to create a table with only observations
with age less than 15.
Introduction to
SQL Making Tables from Queries
Sometimes it is useful to store a table which results from
a query.
Suppose we want to create a table with only observations
with age less than 15.
CREATE TABLE young LIKE kids;
INSERT INTO young SELECT * FROM kids
WHERE age < 15;
Introduction to
SQL Making Tables from Queries
Sometimes it is useful to store a table which results from
a query.
Suppose we want to create a table with only observations
with age less than 15.
CREATE TABLE young LIKE kids;
INSERT INTO young SELECT * FROM kids
WHERE age < 15;
Such a table will stay on the database – to create a
temporary one:
Introduction to
SQL Making Tables from Queries
Sometimes it is useful to store a table which results from
a query.
Suppose we want to create a table with only observations
with age less than 15.
CREATE TABLE young LIKE kids;
INSERT INTO young SELECT * FROM kids
WHERE age < 15;
Such a table will stay on the database – to create a
temporary one:
CREATE TEMPORARY TABLE young LIKE kids;
Introduction to
SQL Making Tables from Queries
Sometimes it is useful to store a table which results from
a query.
Suppose we want to create a table with only observations
with age less than 15.
CREATE TABLE young LIKE kids;
INSERT INTO young SELECT * FROM kids
WHERE age < 15;
Such a table will stay on the database – to create a
temporary one:
CREATE TEMPORARY TABLE young LIKE kids;
Alternatively, you can DROP the table when you’re done:
Introduction to
SQL Making Tables from Queries
Sometimes it is useful to store a table which results from
a query.
Suppose we want to create a table with only observations
with age less than 15.
CREATE TABLE young LIKE kids;
INSERT INTO young SELECT * FROM kids
WHERE age < 15;
Such a table will stay on the database – to create a
temporary one:
CREATE TEMPORARY TABLE young LIKE kids;
Alternatively, you can DROP the table when you’re done:
DROP TABLE young;
Introduction to
SQL Music Collection Example
Traditionally, redundancy is the enemy of database
design, because it wastes storage space and increase data
entry errors. For this reason, may traditional databases
have a separate table for each attribute of importance.
For example, suppose we have a collection of songs,
organized into albums. Rather than store each song as a
row with the album title and artist, we would create three
tables: one for songs(tracks), one for albums, and one for
artists.
Introduction to
SQL Music Collection Example
Traditionally, redundancy is the enemy of database
design, because it wastes storage space and increase data
entry errors. For this reason, may traditional databases
have a separate table for each attribute of importance.
For example, suppose we have a collection of songs,
organized into albums. Rather than store each song as a
row with the album title and artist, we would create three
tables: one for songs(tracks), one for albums, and one for
artists.
Album Artist Track
alid INT aid INT tid INT
aid INT name VARCHAR(40) alid INT
title VARCHAR(60) time INT
title VARCHAR(40)
filename VARCHAR(14)
Introduction to
SQL A Look at the Tables
mysql> select * from album limit 1,5;
+------+------+------------------------+
| alid | aid | title |
+------+------+------------------------+
| 140 | 102 | Ugetsu |
| 150 | 109 | Born To Be Blue |
| 151 | 109 | Connecticut Jazz Party |
| 152 | 109 | Easy Does It |
| 153 | 109 | In Person |
+------+------+------------------------+
5 rows in set (0.03 sec)
mysql> select * from artist limit 1,5;
+------+-----------------+
| aid | name |
+------+-----------------+
| 109 | Bobby Timmons |
| 134 | Dizzy Gillespie |
| 140 | Elmo Hope |
| 146 | Erroll Garner |
| 159 | Horace Silver |
+------+-----------------+
5 rows in set (0.03 sec)
mysql> select * from track limit 1,5;
+------+------+------+----------------------------------+----------------+
| tid | alid | time | title | filename |
+------+------+------+----------------------------------+----------------+
| 1713 | 139 | 413 | Sincerely Diane (alternate take) | 1077698286.mp3 |
| 1714 | 139 | 384 | Yama | 1077698288.mp3 |
| 1715 | 139 | 404 | When your lover has gone | 1077698290.mp3 |
| 2276 | 139 | 398 | So tired | 1077699502.mp3 |
| 3669 | 139 | 408 | Sincerely Diana | 1077702347.mp3 |
+------+------+------+----------------------------------+----------------+
5 rows in set (0.03 sec)
Introduction to
SQL SELECT with multiple tables
Produce a list of album titles along with artist:
Introduction to
SQL SELECT with multiple tables
Produce a list of album titles along with artist:
SELECT a.title,r.name View
FROM album AS a, artist AS r
WHERE a.aid = r.aid;
Introduction to
SQL SELECT with multiple tables
Produce a list of album titles along with artist:
SELECT a.title,r.name View
FROM album AS a, artist AS r
WHERE a.aid = r.aid;
This is a common operation, known as an inner join:
Introduction to
SQL SELECT with multiple tables
Produce a list of album titles along with artist:
SELECT a.title,r.name View
FROM album AS a, artist AS r
WHERE a.aid = r.aid;
This is a common operation, known as an inner join:
SELECT a.title,r.name FROM album AS a
INNER JOIN artist AS r USING(aid);
Introduction to
SQL SELECT with multiple tables
Produce a list of album titles along with artist:
SELECT a.title,r.name View
FROM album AS a, artist AS r
WHERE a.aid = r.aid;
This is a common operation, known as an inner join:
SELECT a.title,r.name FROM album AS a
INNER JOIN artist AS r USING(aid);
This produces the same result as the previous query.
Introduction to
SQL SELECT with multiple tables
Produce a list of album titles along with artist:
SELECT a.title,r.name View
FROM album AS a, artist AS r
WHERE a.aid = r.aid;
This is a common operation, known as an inner join:
SELECT a.title,r.name FROM album AS a
INNER JOIN artist AS r USING(aid);
This produces the same result as the previous query.
Find the sum of the times on each album:
SELECT SUM(time) as duration View
FROM track GROUP BY alid
ORDER BY duration DESC;
Introduction to
SQL SELECT with multiple tables
Produce a list of album titles along with artist:
SELECT a.title,r.name View
FROM album AS a, artist AS r
WHERE a.aid = r.aid;
This is a common operation, known as an inner join:
SELECT a.title,r.name FROM album AS a
INNER JOIN artist AS r USING(aid);
This produces the same result as the previous query.
Find the sum of the times on each album:
SELECT SUM(time) as duration View
FROM track GROUP BY alid
ORDER BY duration DESC;
Unfortunately, all we have are the album ids, not the
names
Introduction to
SQL SELECT with multiple tables(cont’d)
To improve our previous example, we need to combine the
track information with album and artist information.
Suppose we want to find the 10 longest albums in the
collection:
Introduction to
SQL SELECT with multiple tables(cont’d)
To improve our previous example, we need to combine the
track information with album and artist information.
Suppose we want to find the 10 longest albums in the
collection:
SELECT a.title,r.name, View
SUM(time) AS duration
FROM track AS t, album as a, artist as r
WHERE t.alid = a.alid AND a.aid = r.aid
GROUP BY t.alid ORDER BY duration DESC
LIMIT 1,10;
Introduction to
SQL SELECT with multiple tables(cont’d)
To improve our previous example, we need to combine the
track information with album and artist information.
Suppose we want to find the 10 longest albums in the
collection:
SELECT a.title,r.name, View
SUM(time) AS duration
FROM track AS t, album as a, artist as r
WHERE t.alid = a.alid AND a.aid = r.aid
GROUP BY t.alid ORDER BY duration DESC
LIMIT 1,10;
Introduction to
SQL The Rules Have Changed
As powerful as SQL is, we can use it as a data store
without having to use all of the SQL features.
Introduction to
SQL The Rules Have Changed
As powerful as SQL is, we can use it as a data store
without having to use all of the SQL features.
I Don’t hesitate to use familiar programs to do the
hard work
Introduction to
SQL The Rules Have Changed
As powerful as SQL is, we can use it as a data store
without having to use all of the SQL features.
I Don’t hesitate to use familiar programs to do the
hard work
I Repeated SELECT queries in loops can do wonders
Introduction to
SQL The Rules Have Changed
As powerful as SQL is, we can use it as a data store
without having to use all of the SQL features.
I Don’t hesitate to use familiar programs to do the
hard work
I Repeated SELECT queries in loops can do wonders
I Load up data structures with entire tables
Introduction to
SQL The Rules Have Changed
As powerful as SQL is, we can use it as a data store
without having to use all of the SQL features.
I Don’t hesitate to use familiar programs to do the
hard work
I Repeated SELECT queries in loops can do wonders
I Load up data structures with entire tables
I Use as little or as much pure SQL as you like
Introduction to
SQL The Rules Have Changed
As powerful as SQL is, we can use it as a data store
without having to use all of the SQL features.
I Don’t hesitate to use familiar programs to do the
hard work
I Repeated SELECT queries in loops can do wonders
I Load up data structures with entire tables
I Use as little or as much pure SQL as you like
These ideas are illustrated using the music collection
data, R, python, and perl
Introduction to
SQL Using SQL in R
library(RMySQL)
drv = dbDriver("MySQL")
con = dbConnect(drv,dbname="dbname",user="user",pass="pass")
rs = dbSendQuery(con,statement="select * from album")
album = fetch(rs,n=-1)
rs = dbSendQuery(con,statement="select * from track")
track = fetch(rs,n=-1)
rs = dbSendQuery(con,statement="select * from artist")
artist = fetch(rs,n=-1)
tracks = data.frame(
album = factor(track$alid,levels=album$alid,
labels=album$title),
artist = factor(merge(track[,"alid",drop=FALSE],
album[,c("alid","aid")],by="alid")$aid,
levels=artist$aid,
labels=artist$name),
time = track$time)
res = aggregate(tracks$time,
list(album=tracks$album,artist=tracks$artist),sum)
res = res[order(res$x,decreasing=TRUE),]
print(res[1:10,])
Introduction to
SQL Using SQL in python
#!/usr/bin/python
from MySQLdb import *
con = connect(user=’user’,passwd=’pass’,db=’dbname’)
cursor = con.cursor()
cursor.execute(’select * from track’)
tracks = cursor.fetchall()
durations = {}
for t in tracks:
durations[t[1]] = durations.get(t[1],0) + t[2]
alids = durations.keys()
alids.sort(lambda x,y:cmp(durations[y],durations[x]))
for i in range(10):
cursor.execute(
’select title,aid from album where alid = %d’ % alids[i])
title,aid = cursor.fetchall()[0]
cursor.execute(’select name from artist where aid = %d’ % aid)
name = cursor.fetchall()[0][0]
print ’%st%st%d’ % (title,name,durations[alids[i]])
Introduction to
SQL Using SQL in perl
#!/usr/bin/perl
use DBI;
$dbh = DBI->connect(’DBI:mysql:dbname:localhost’,’user’,’pass’);
$sth = $dbh->prepare(’select * from album’);
$sth->execute();
while((@row) = $sth->fetchrow()){
$album{$row[0]} = $row[2];
$aartist{$row[0]} = $row[1];
}
$sth = $dbh->prepare(’select * from artist’);
$sth->execute();
$artist{$row[0]} = $row[1] while((@row) = $sth->fetchrow());
$sth = $dbh->prepare(’select * from track’);
$sth->execute();
$duration{$row[1]} += $row[2] while((@row) = $sth->fetchrow());
@salbum = sort({$duration{$b} <=> $duration{$a}} keys(%duration));
foreach $i (0..9){
print
"$album{$salbum[$i]}t$artist{$aartist{$salbum[$i]}}t",
"$duration{$salbum[$i]}n"
}
Introduction to
SQL
mysql> select * from kids;
+--------+------+--------+---------+---------+------+
| id | race | age | height | weight | sex |
+--------+------+--------+---------+---------+------+
| 100011 | 2 | 10.346 | 148.500 | 38.950 | 1 |
| 100011 | 2 | 11.282 | 157.100 | 44.100 | 1 |
| 100011 | 2 | 14.428 | 165.950 | 57.800 | 1 |
| 100011 | 2 | 15.321 | 167.050 | 59.650 | 1 |
| 100031 | 1 | 10.920 | 158.000 | 63.700 | 1 |
| 100031 | 1 | 11.917 | 161.000 | 68.500 | 1 |
| 100031 | 1 | 13.007 | 162.750 | 85.950 | 1 |
. . . . . . .
| 308091 | 1 | 9.460 | 138.000 | 39.000 | 1 |
| 308091 | 1 | 10.740 | 147.500 | 53.100 | 1 |
| 308091 | 1 | 11.359 | 151.750 | 57.050 | 1 |
| 308101 | 1 | 9.800 | 152.350 | 38.500 | 2 |
| 308101 | 1 | 10.781 | 159.335 | 48.235 | 2 |
| 308101 | 1 | 11.701 | 164.285 | 51.700 | 2 |
+--------+------+--------+---------+---------+------+
20704 rows in set (0.18 sec)
Return
Introduction to
SQL
mysql> select age,race,height,weight from kids
-> where weight > 80 and height < 150;
+--------+------+---------+--------+
| age | race | height | weight |
+--------+------+---------+--------+
| 12.429 | 2 | 147.800 | 83.000 |
| 11.674 | 2 | 149.350 | 82.950 |
| 14.414 | 2 | 149.300 | 86.750 |
+--------+------+---------+--------+
3 rows in set (0.06 sec)
Return
Introduction to
SQL
mysql> select * from kids order by height desc;
+--------+------+--------+---------+---------+------+
| id | race | age | height | weight | sex |
+--------+------+--------+---------+---------+------+
| 302941 | 2 | 19.657 | 201.905 | 83.820 | 2 |
| 300861 | 2 | 17.804 | 201.850 | 126.610 | 2 |
| 302941 | 2 | 16.572 | 201.795 | 76.670 | 2 |
| 300861 | 2 | 14.833 | 201.520 | 124.245 | 2 |
| 300861 | 2 | 18.781 | 201.520 | 123.310 | 2 |
| 302941 | 2 | 18.611 | 201.410 | 83.710 | 2 |
| 107061 | 2 | 17.626 | 201.300 | 82.005 | 2 |
| 302941 | 2 | 15.537 | 201.190 | 72.820 | 2 |
| 304441 | 1 | 17.946 | 201.190 | 67.430 | 2 |
| 116741 | 1 | 17.338 | 201.025 | 72.710 | 2 |
+--------+------+--------+---------+---------+------+
10 rows in set (0.10 sec)
Return
Introduction to
SQL
mysql> select * from kids
-> where age between 17 and 18
-> and weight between 180 and 185;
+--------+------+--------+---------+---------+------+
| id | race | age | height | weight | sex |
+--------+------+--------+---------+---------+------+
| 304741 | 1 | 17.875 | 194.150 | 184.250 | 2 |
+--------+------+--------+---------+---------+------+
1 row in set (0.03 sec)
Return
Introduction to
SQL
mysql> select max(height) from kids
-> where age between 10 and 11 and race = 1;
+-------------+
| max(height) |
+-------------+
| 178.750 |
+-------------+
1 row in set (0.06 sec)
Return
Introduction to
SQL
mysql> select sex,race,count(*) as n,
-> avg(weight/(height*height)*10000) as bmi
-> from kids group by sex,race;
+------+------+------+--------------+
| sex | race | n | bmi |
+------+------+------+--------------+
| 1 | 1 | 4977 | 21.312670406 |
| 1 | 2 | 5532 | 23.489962065 |
| 2 | 1 | 4973 | 19.153469602 |
| 2 | 2 | 5222 | 21.040500147 |
+------+------+------+--------------+
4 rows in set (0.12 sec)
Return
Introduction to
SQL
mysql> select race,sum(height > 150)/count(*)
-> from kids group by race;
+------+----------------------------+
| race | sum(height > 150)/count(*) |
+------+----------------------------+
| 1 | 0.85 |
| 2 | 0.89 |
+------+----------------------------+
2 rows in set (0.05 sec)
Return
Introduction to
SQL
mysql> select id from kids
-> group by id having count(*) < 2;
+--------+
| id |
+--------+
| 101051 |
| 103181 |
| 103191 |
| 107231 |
| 109001 |
. . .
| 207291 |
| 207961 |
| 302241 |
| 304561 |
| 307081 |
+--------+
22 rows in set (0.10 sec)
Return
Introduction to
SQL
mysql> select * from kids group by id having count(*)=10;
+--------+------+--------+---------+--------+------+
| id | race | age | height | weight | sex |
+--------+------+--------+---------+--------+------+
| 100031 | 1 | 10.920 | 158.000 | 63.700 | 1 |
| 100041 | 1 | 10.070 | 159.500 | 51.700 | 2 |
| 100071 | 2 | 10.630 | 139.700 | 37.500 | 1 |
| 100081 | 2 | 9.110 | 152.130 | 36.795 | 2 |
| 100091 | 2 | 9.200 | 148.250 | 54.150 | 1 |
. . . . . .
| 308021 | 1 | 9.330 | 157.850 | 41.470 | 2 |
| 308041 | 1 | 10.810 | 157.025 | 38.060 | 2 |
| 308061 | 1 | 10.120 | 156.200 | 32.780 | 2 |
| 308071 | 1 | 10.990 | 138.500 | 29.450 | 1 |
| 308081 | 1 | 9.920 | 152.900 | 31.130 | 2 |
+--------+------+--------+---------+--------+------+
1303 rows in set (0.11 sec)
Return
Introduction to
SQL
mysql> select * from kids where id in
-> (select id from kids group by id
-> having count(*)=10);
+--------+------+--------+---------+---------+------+
| id | race | age | height | weight | sex |
+--------+------+--------+---------+---------+------+
| 100011 | 2 | 10.346 | 148.500 | 38.950 | 1 |
| 100011 | 2 | 11.282 | 157.100 | 44.100 | 1 |
| 100011 | 2 | 12.336 | 163.900 | 51.150 | 1 |
| 100011 | 2 | 13.388 | 166.450 | 57.400 | 1 |
| 100011 | 2 | 14.428 | 165.950 | 57.800 | 1 |
. . . . .
| 308081 | 1 | 14.803 | 183.700 | 55.935 | 2 |
| 308081 | 1 | 15.780 | 183.590 | 54.780 | 2 |
| 308081 | 1 | 16.865 | 184.195 | 58.905 | 2 |
| 308081 | 1 | 17.864 | 184.580 | 56.320 | 2 |
| 308081 | 1 | 18.631 | 184.195 | 56.100 | 2 |
+--------+------+--------+---------+---------+------+
13030 rows in set (35 min 33.96 sec)
Return
Introduction to
SQL
mysql> select * from kids inner join
-> (select id from kids group by id having count(*)=10)
-> as a using(id);
+--------+------+--------+---------+---------+------+
| id | race | age | height | weight | sex |
+--------+------+--------+---------+---------+------+
| 100011 | 2 | 10.346 | 148.500 | 38.950 | 1 |
| 100011 | 2 | 11.282 | 157.100 | 44.100 | 1 |
| 100011 | 2 | 12.336 | 163.900 | 51.150 | 1 |
| 100011 | 2 | 13.388 | 166.450 | 57.400 | 1 |
| 100011 | 2 | 14.428 | 165.950 | 57.800 | 1 |
. . . . .
| 308081 | 1 | 14.803 | 183.700 | 55.935 | 2 |
| 308081 | 1 | 15.780 | 183.590 | 54.780 | 2 |
| 308081 | 1 | 16.865 | 184.195 | 58.905 | 2 |
| 308081 | 1 | 17.864 | 184.580 | 56.320 | 2 |
| 308081 | 1 | 18.631 | 184.195 | 56.100 | 2 |
+--------+------+--------+---------+---------+------+
13030 rows in set (11.89 sec)
Return
Introduction to
SQL
mysql> select * from kids
-> having weight = max(weight);
Empty set (0.00 sec)
Return
Introduction to
SQL
mysql> select * from kids
-> where weight = (select max(weight) from kids);
+--------+------+--------+---------+---------+------+
| id | race | age | height | weight | sex |
+--------+------+--------+---------+---------+------+
| 304741 | 1 | 18.680 | 192.940 | 189.695 | 2 |
+--------+------+--------+---------+---------+------+
1 row in set (0.03 sec)
Return
Introduction to
SQL
mysql> select k.id,k.sex,k.race,k.age,k.weight,k.height
-> from kids as k, (select sex,race,max(weight) as weight
-> from kids group by sex,race) as m
-> where k.sex = m.sex and k.race = m.race and
-> k.weight = m.weight;
+--------+------+------+--------+---------+---------+
| id | sex | race | age | weight | height |
+--------+------+------+--------+---------+---------+
| 207201 | 2 | 2 | 19.405 | 173.360 | 191.565 |
| 207931 | 1 | 2 | 19.674 | 151.200 | 164.900 |
| 208171 | 1 | 1 | 18.633 | 128.500 | 168.100 |
| 304741 | 2 | 1 | 18.680 | 189.695 | 192.940 |
+--------+------+------+--------+---------+---------+
4 rows in set (0.34 sec)
Return
Introduction to
SQL
mysql> select a.title,r.name from album as a,artist as r where a.aid = r.aid;
+----------------------------------------------------+------------------------------+
| title | name |
+----------------------------------------------------+------------------------------+
| A Night in Tunisia | Art Blakey & Jazz Messengers |
| Ugetsu | Art Blakey & Jazz Messengers |
| Born To Be Blue | Bobby Timmons |
| Connecticut Jazz Party | Bobby Timmons |
| Easy Does It | Bobby Timmons |
| In Person | Bobby Timmons |
| Moanin’ Blues | Bobby Timmons |
| The Prestige Trio Sessions | Bobby Timmons |
| Soul Man Soul Food | Bobby Timmons |
| Soul Time | Bobby Timmons |
| Workin’ Out | Bobby Timmons |
| 1945-1950 Small Groups | Dizzy Gillespie |
. . . . .
| Live at the Circle Room and Mo | Nat King Cole |
| Birth of the Cole 1938-1939 | Nat King Cole |
| Rockin’ Boppin’ & Blues | Nat King Cole |
| WWII Transcriptions | Nat King Cole |
| Oscar Peterson And Clark Terry | Oscar Peterson |
| A Tribute To My Friends | Oscar Peterson |
| The Oscar Peterson Trio Live At Zardi’s - Disc One | Oscar Peterson |
| The Oscar Peterson Trio Live At Zardi’s - Disc Two | Oscar Peterson |
| Skol | Oscar Peterson |
| Oscar Peterson and Dizzy Gillespie | Oscar Peterson |
| Overseas | Tommy Flanagan |
| The Tommy Flanagan Trio | Tommy Flanagan |
| Trio & Sextet | Tommy Flanagan |
+----------------------------------------------------+------------------------------+
72 rows in set (0.02 sec)
Return
Introduction to
SQL
mysql> select alid,sum(time) as duration
-> from track group by alid order by duration desc;
+------+----------+
| alid | duration |
+------+----------+
| 150 | 6057 |
| 286 | 5664 |
| 264 | 5028 |
| 156 | 4764 |
| 158 | 4674 |
. . . .
| 343 | 2031 |
| 263 | 1865 |
| 281 | 1749 |
| 280 | 1611 |
| 287 | 1519 |
| 203 | 1061 |
+------+----------+
72 rows in set (0.04 sec)
Return
Introduction to
SQL
mysql> select a.title,r.name,sum(time) as duration
-> from track as t,album as a,artist as r
-> where t.alid=a.alid and a.aid = r.aid
-> group by t.alid
-> order by duration desc limit 1,10;
+----------------------------------------------------+----------------+----------+
| title | name | duration |
+----------------------------------------------------+----------------+----------+
| My Funny Valentine | Miles Davis | 5664 |
| Trio | Kenny Drew | 5028 |
| Soul Man Soul Food | Bobby Timmons | 4764 |
| Workin’ Out | Bobby Timmons | 4674 |
| The All-Stars Sessions | Elmo Hope | 4636 |
| The Oscar Peterson Trio Live At Zardi’s - Disc Two | Oscar Peterson | 4567 |
| Memories Of You | Erroll Garner | 4538 |
| Elmo Hope | Elmo Hope | 4536 |
| WWII Transcriptions | Nat King Cole | 4456 |
| The Oscar Peterson Trio Live At Zardi’s - Disc One | Oscar Peterson | 4355 |
+----------------------------------------------------+----------------+----------+
10 rows in set (0.10 sec)
Return

More Related Content

Similar to sql.pdf

Introduction to sq lite
Introduction to sq liteIntroduction to sq lite
Introduction to sq lite
punu_82
 
Sql tutorial, tutorials sql
Sql tutorial, tutorials sqlSql tutorial, tutorials sql
Sql tutorial, tutorials sql
Vivek Singh
 

Similar to sql.pdf (20)

Introduction to sq lite
Introduction to sq liteIntroduction to sq lite
Introduction to sq lite
 
Sql tutorial, tutorials sql
Sql tutorial, tutorials sqlSql tutorial, tutorials sql
Sql tutorial, tutorials sql
 
Mysql
MysqlMysql
Mysql
 
Database Systems - Introduction to SQL (Chapter 3/1)
Database Systems - Introduction to SQL (Chapter 3/1)Database Systems - Introduction to SQL (Chapter 3/1)
Database Systems - Introduction to SQL (Chapter 3/1)
 
Which Freaking Database Should I Use?
Which Freaking Database Should I Use?Which Freaking Database Should I Use?
Which Freaking Database Should I Use?
 
broadfield_vm_cv
broadfield_vm_cvbroadfield_vm_cv
broadfield_vm_cv
 
SQL & NoSQL
SQL & NoSQLSQL & NoSQL
SQL & NoSQL
 
Elastic search overview
Elastic search overviewElastic search overview
Elastic search overview
 
Sparkflows - Build E2E Data Analytics Use Cases in less than 30 mins
Sparkflows - Build E2E Data Analytics Use Cases in less than 30 minsSparkflows - Build E2E Data Analytics Use Cases in less than 30 mins
Sparkflows - Build E2E Data Analytics Use Cases in less than 30 mins
 
Free The Enterprise With Ruby & Master Your Own Domain
Free The Enterprise With Ruby & Master Your Own DomainFree The Enterprise With Ruby & Master Your Own Domain
Free The Enterprise With Ruby & Master Your Own Domain
 
Kubernetes and AWS Lambda can play nicely together
Kubernetes and AWS Lambda can play nicely togetherKubernetes and AWS Lambda can play nicely together
Kubernetes and AWS Lambda can play nicely together
 
Introduction to Azure Data Lake and U-SQL for SQL users (SQL Saturday 635)
Introduction to Azure Data Lake and U-SQL for SQL users (SQL Saturday 635)Introduction to Azure Data Lake and U-SQL for SQL users (SQL Saturday 635)
Introduction to Azure Data Lake and U-SQL for SQL users (SQL Saturday 635)
 
Cassandra nyc
Cassandra nycCassandra nyc
Cassandra nyc
 
NoSQL, SQL, NewSQL - methods of structuring data.
NoSQL, SQL, NewSQL - methods of structuring data.NoSQL, SQL, NewSQL - methods of structuring data.
NoSQL, SQL, NewSQL - methods of structuring data.
 
SQL.pptx
SQL.pptxSQL.pptx
SQL.pptx
 
Colin Carter - LSPs and APIs
Colin Carter  - LSPs and APIsColin Carter  - LSPs and APIs
Colin Carter - LSPs and APIs
 
Structured Query Language
Structured Query LanguageStructured Query Language
Structured Query Language
 
SQL Server 2016 new features
SQL Server 2016 new featuresSQL Server 2016 new features
SQL Server 2016 new features
 
My Sql
My SqlMy Sql
My Sql
 
Ebook1
Ebook1Ebook1
Ebook1
 

Recently uploaded

Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...
Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...
Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...
gajnagarg
 
Top profile Call Girls In bhavnagar [ 7014168258 ] Call Me For Genuine Models...
Top profile Call Girls In bhavnagar [ 7014168258 ] Call Me For Genuine Models...Top profile Call Girls In bhavnagar [ 7014168258 ] Call Me For Genuine Models...
Top profile Call Girls In bhavnagar [ 7014168258 ] Call Me For Genuine Models...
gajnagarg
 
Abortion pills in Doha {{ QATAR }} +966572737505) Get Cytotec
Abortion pills in Doha {{ QATAR }} +966572737505) Get CytotecAbortion pills in Doha {{ QATAR }} +966572737505) Get Cytotec
Abortion pills in Doha {{ QATAR }} +966572737505) Get Cytotec
Abortion pills in Riyadh +966572737505 get cytotec
 
Abortion pills in Jeddah | +966572737505 | Get Cytotec
Abortion pills in Jeddah | +966572737505 | Get CytotecAbortion pills in Jeddah | +966572737505 | Get Cytotec
Abortion pills in Jeddah | +966572737505 | Get Cytotec
Abortion pills in Riyadh +966572737505 get cytotec
 
Top profile Call Girls In Hapur [ 7014168258 ] Call Me For Genuine Models We ...
Top profile Call Girls In Hapur [ 7014168258 ] Call Me For Genuine Models We ...Top profile Call Girls In Hapur [ 7014168258 ] Call Me For Genuine Models We ...
Top profile Call Girls In Hapur [ 7014168258 ] Call Me For Genuine Models We ...
nirzagarg
 
In Riyadh ((+919101817206)) Cytotec kit @ Abortion Pills Saudi Arabia
In Riyadh ((+919101817206)) Cytotec kit @ Abortion Pills Saudi ArabiaIn Riyadh ((+919101817206)) Cytotec kit @ Abortion Pills Saudi Arabia
In Riyadh ((+919101817206)) Cytotec kit @ Abortion Pills Saudi Arabia
ahmedjiabur940
 
Top profile Call Girls In Satna [ 7014168258 ] Call Me For Genuine Models We ...
Top profile Call Girls In Satna [ 7014168258 ] Call Me For Genuine Models We ...Top profile Call Girls In Satna [ 7014168258 ] Call Me For Genuine Models We ...
Top profile Call Girls In Satna [ 7014168258 ] Call Me For Genuine Models We ...
nirzagarg
 
Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...
Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...
Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...
nirzagarg
 

Recently uploaded (20)

SAC 25 Final National, Regional & Local Angel Group Investing Insights 2024 0...
SAC 25 Final National, Regional & Local Angel Group Investing Insights 2024 0...SAC 25 Final National, Regional & Local Angel Group Investing Insights 2024 0...
SAC 25 Final National, Regional & Local Angel Group Investing Insights 2024 0...
 
Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...
Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...
Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...
 
Giridih Escorts Service Girl ^ 9332606886, WhatsApp Anytime Giridih
Giridih Escorts Service Girl ^ 9332606886, WhatsApp Anytime GiridihGiridih Escorts Service Girl ^ 9332606886, WhatsApp Anytime Giridih
Giridih Escorts Service Girl ^ 9332606886, WhatsApp Anytime Giridih
 
Top profile Call Girls In bhavnagar [ 7014168258 ] Call Me For Genuine Models...
Top profile Call Girls In bhavnagar [ 7014168258 ] Call Me For Genuine Models...Top profile Call Girls In bhavnagar [ 7014168258 ] Call Me For Genuine Models...
Top profile Call Girls In bhavnagar [ 7014168258 ] Call Me For Genuine Models...
 
DATA SUMMIT 24 Building Real-Time Pipelines With FLaNK
DATA SUMMIT 24  Building Real-Time Pipelines With FLaNKDATA SUMMIT 24  Building Real-Time Pipelines With FLaNK
DATA SUMMIT 24 Building Real-Time Pipelines With FLaNK
 
Gomti Nagar & best call girls in Lucknow | 9548273370 Independent Escorts & D...
Gomti Nagar & best call girls in Lucknow | 9548273370 Independent Escorts & D...Gomti Nagar & best call girls in Lucknow | 9548273370 Independent Escorts & D...
Gomti Nagar & best call girls in Lucknow | 9548273370 Independent Escorts & D...
 
Statistics notes ,it includes mean to index numbers
Statistics notes ,it includes mean to index numbersStatistics notes ,it includes mean to index numbers
Statistics notes ,it includes mean to index numbers
 
Identify Customer Segments to Create Customer Offers for Each Segment - Appli...
Identify Customer Segments to Create Customer Offers for Each Segment - Appli...Identify Customer Segments to Create Customer Offers for Each Segment - Appli...
Identify Customer Segments to Create Customer Offers for Each Segment - Appli...
 
社内勉強会資料_Object Recognition as Next Token Prediction
社内勉強会資料_Object Recognition as Next Token Prediction社内勉強会資料_Object Recognition as Next Token Prediction
社内勉強会資料_Object Recognition as Next Token Prediction
 
Abortion pills in Doha {{ QATAR }} +966572737505) Get Cytotec
Abortion pills in Doha {{ QATAR }} +966572737505) Get CytotecAbortion pills in Doha {{ QATAR }} +966572737505) Get Cytotec
Abortion pills in Doha {{ QATAR }} +966572737505) Get Cytotec
 
Abortion pills in Jeddah | +966572737505 | Get Cytotec
Abortion pills in Jeddah | +966572737505 | Get CytotecAbortion pills in Jeddah | +966572737505 | Get Cytotec
Abortion pills in Jeddah | +966572737505 | Get Cytotec
 
Top profile Call Girls In Hapur [ 7014168258 ] Call Me For Genuine Models We ...
Top profile Call Girls In Hapur [ 7014168258 ] Call Me For Genuine Models We ...Top profile Call Girls In Hapur [ 7014168258 ] Call Me For Genuine Models We ...
Top profile Call Girls In Hapur [ 7014168258 ] Call Me For Genuine Models We ...
 
Fun all Day Call Girls in Jaipur 9332606886 High Profile Call Girls You Ca...
Fun all Day Call Girls in Jaipur   9332606886  High Profile Call Girls You Ca...Fun all Day Call Girls in Jaipur   9332606886  High Profile Call Girls You Ca...
Fun all Day Call Girls in Jaipur 9332606886 High Profile Call Girls You Ca...
 
Nirala Nagar / Cheap Call Girls In Lucknow Phone No 9548273370 Elite Escort S...
Nirala Nagar / Cheap Call Girls In Lucknow Phone No 9548273370 Elite Escort S...Nirala Nagar / Cheap Call Girls In Lucknow Phone No 9548273370 Elite Escort S...
Nirala Nagar / Cheap Call Girls In Lucknow Phone No 9548273370 Elite Escort S...
 
Case Study 4 Where the cry of rebellion happen?
Case Study 4 Where the cry of rebellion happen?Case Study 4 Where the cry of rebellion happen?
Case Study 4 Where the cry of rebellion happen?
 
In Riyadh ((+919101817206)) Cytotec kit @ Abortion Pills Saudi Arabia
In Riyadh ((+919101817206)) Cytotec kit @ Abortion Pills Saudi ArabiaIn Riyadh ((+919101817206)) Cytotec kit @ Abortion Pills Saudi Arabia
In Riyadh ((+919101817206)) Cytotec kit @ Abortion Pills Saudi Arabia
 
Top Call Girls in Balaghat 9332606886Call Girls Advance Cash On Delivery Ser...
Top Call Girls in Balaghat  9332606886Call Girls Advance Cash On Delivery Ser...Top Call Girls in Balaghat  9332606886Call Girls Advance Cash On Delivery Ser...
Top Call Girls in Balaghat 9332606886Call Girls Advance Cash On Delivery Ser...
 
Top profile Call Girls In Satna [ 7014168258 ] Call Me For Genuine Models We ...
Top profile Call Girls In Satna [ 7014168258 ] Call Me For Genuine Models We ...Top profile Call Girls In Satna [ 7014168258 ] Call Me For Genuine Models We ...
Top profile Call Girls In Satna [ 7014168258 ] Call Me For Genuine Models We ...
 
Digital Transformation Playbook by Graham Ware
Digital Transformation Playbook by Graham WareDigital Transformation Playbook by Graham Ware
Digital Transformation Playbook by Graham Ware
 
Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...
Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...
Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...
 

sql.pdf

  • 1. Introduction to SQL Phil Spector Introduction to SQL Phil Spector Statistical Computing Facility University of California, Berkeley
  • 4. Introduction to SQL What is SQL? I Structured Query Language
  • 5. Introduction to SQL What is SQL? I Structured Query Language I Usually “talk” to a database server
  • 6. Introduction to SQL What is SQL? I Structured Query Language I Usually “talk” to a database server I Used as front end to many databases (mysql, postgresql, oracle, sybase)
  • 7. Introduction to SQL What is SQL? I Structured Query Language I Usually “talk” to a database server I Used as front end to many databases (mysql, postgresql, oracle, sybase) I Three Subsystems: data description, data access and privileges
  • 8. Introduction to SQL What is SQL? I Structured Query Language I Usually “talk” to a database server I Used as front end to many databases (mysql, postgresql, oracle, sybase) I Three Subsystems: data description, data access and privileges I Optimized for certain data arrangements
  • 9. Introduction to SQL What is SQL? I Structured Query Language I Usually “talk” to a database server I Used as front end to many databases (mysql, postgresql, oracle, sybase) I Three Subsystems: data description, data access and privileges I Optimized for certain data arrangements I The language is case-sensitive, but I use upper case for keywords.
  • 10. Introduction to SQL When do you need a Database?
  • 11. Introduction to SQL When do you need a Database? I Multiple simultaneous changes to data (concurrency)
  • 12. Introduction to SQL When do you need a Database? I Multiple simultaneous changes to data (concurrency) I Data changes on a regular basis
  • 13. Introduction to SQL When do you need a Database? I Multiple simultaneous changes to data (concurrency) I Data changes on a regular basis I Large data sets where you only need some observations/variables
  • 14. Introduction to SQL When do you need a Database? I Multiple simultaneous changes to data (concurrency) I Data changes on a regular basis I Large data sets where you only need some observations/variables I Share huge data set among many people
  • 15. Introduction to SQL When do you need a Database? I Multiple simultaneous changes to data (concurrency) I Data changes on a regular basis I Large data sets where you only need some observations/variables I Share huge data set among many people I Rapid queries with no analysis
  • 16. Introduction to SQL When do you need a Database? I Multiple simultaneous changes to data (concurrency) I Data changes on a regular basis I Large data sets where you only need some observations/variables I Share huge data set among many people I Rapid queries with no analysis I Web interfaces to data, especially dynamic data
  • 17. Introduction to SQL Uses of Databases Traditional Uses:
  • 18. Introduction to SQL Uses of Databases Traditional Uses: I Live Queries
  • 19. Introduction to SQL Uses of Databases Traditional Uses: I Live Queries I Report Generation
  • 20. Introduction to SQL Uses of Databases Traditional Uses: I Live Queries I Report Generation I Normalization, foreign keys, joins, etc.
  • 21. Introduction to SQL Uses of Databases Traditional Uses: I Live Queries I Report Generation I Normalization, foreign keys, joins, etc. Newer uses:
  • 22. Introduction to SQL Uses of Databases Traditional Uses: I Live Queries I Report Generation I Normalization, foreign keys, joins, etc. Newer uses: I Storage - data is extracted and analyzed in another application
  • 23. Introduction to SQL Uses of Databases Traditional Uses: I Live Queries I Report Generation I Normalization, foreign keys, joins, etc. Newer uses: I Storage - data is extracted and analyzed in another application I Backends to web sites
  • 24. Introduction to SQL Uses of Databases Traditional Uses: I Live Queries I Report Generation I Normalization, foreign keys, joins, etc. Newer uses: I Storage - data is extracted and analyzed in another application I Backends to web sites I Traditional rules may not be as important
  • 26. Introduction to SQL Ways to Use SQL I console command (mysql -u user -p dbname)
  • 27. Introduction to SQL Ways to Use SQL I console command (mysql -u user -p dbname) I GUI interfaces are often available
  • 28. Introduction to SQL Ways to Use SQL I console command (mysql -u user -p dbname) I GUI interfaces are often available I Interfaces to many programming languages: R, python, perl, PHP, etc.
  • 29. Introduction to SQL Ways to Use SQL I console command (mysql -u user -p dbname) I GUI interfaces are often available I Interfaces to many programming languages: R, python, perl, PHP, etc. I SQLite - use SQL without a database server
  • 30. Introduction to SQL Ways to Use SQL I console command (mysql -u user -p dbname) I GUI interfaces are often available I Interfaces to many programming languages: R, python, perl, PHP, etc. I SQLite - use SQL without a database server I PROC SQL in SAS
  • 31. Introduction to SQL Some Relational Database Concepts
  • 32. Introduction to SQL Some Relational Database Concepts I A database server can contain many databases
  • 33. Introduction to SQL Some Relational Database Concepts I A database server can contain many databases I Databases are collections of tables
  • 34. Introduction to SQL Some Relational Database Concepts I A database server can contain many databases I Databases are collections of tables I Tables are two-dimensional with rows (observations) and columns (variables)
  • 35. Introduction to SQL Some Relational Database Concepts I A database server can contain many databases I Databases are collections of tables I Tables are two-dimensional with rows (observations) and columns (variables) I Limited mathematical and summary operations available
  • 36. Introduction to SQL Some Relational Database Concepts I A database server can contain many databases I Databases are collections of tables I Tables are two-dimensional with rows (observations) and columns (variables) I Limited mathematical and summary operations available I Very good at combining information from several tables
  • 37. Introduction to SQL Finding Your Way Around the Server Since a single server can support many databases, each containing many tables, with each table having a variety of columns, it’s easy to get lost when you’re working with databases. These commands will help figure out what’s available:
  • 38. Introduction to SQL Finding Your Way Around the Server Since a single server can support many databases, each containing many tables, with each table having a variety of columns, it’s easy to get lost when you’re working with databases. These commands will help figure out what’s available: I SHOW DATABASES;
  • 39. Introduction to SQL Finding Your Way Around the Server Since a single server can support many databases, each containing many tables, with each table having a variety of columns, it’s easy to get lost when you’re working with databases. These commands will help figure out what’s available: I SHOW DATABASES; I SHOW TABLES IN database;
  • 40. Introduction to SQL Finding Your Way Around the Server Since a single server can support many databases, each containing many tables, with each table having a variety of columns, it’s easy to get lost when you’re working with databases. These commands will help figure out what’s available: I SHOW DATABASES; I SHOW TABLES IN database; I SHOW COLUMNS IN table;
  • 41. Introduction to SQL Finding Your Way Around the Server Since a single server can support many databases, each containing many tables, with each table having a variety of columns, it’s easy to get lost when you’re working with databases. These commands will help figure out what’s available: I SHOW DATABASES; I SHOW TABLES IN database; I SHOW COLUMNS IN table; I DESCRIBE table; - shows the columns and their types
  • 42. Introduction to SQL Variable Types SQL supports a very large number of different formats for internal storage of information.
  • 43. Introduction to SQL Variable Types SQL supports a very large number of different formats for internal storage of information. Numeric
  • 44. Introduction to SQL Variable Types SQL supports a very large number of different formats for internal storage of information. Numeric I INTEGER, SMALLINT, BIGINT
  • 45. Introduction to SQL Variable Types SQL supports a very large number of different formats for internal storage of information. Numeric I INTEGER, SMALLINT, BIGINT I NUMERIC(w,d), DECIMAL(w,d) - numbers with width w and d decimal places
  • 46. Introduction to SQL Variable Types SQL supports a very large number of different formats for internal storage of information. Numeric I INTEGER, SMALLINT, BIGINT I NUMERIC(w,d), DECIMAL(w,d) - numbers with width w and d decimal places I REAL, DOUBLE PRECISION - machine and database dependent
  • 47. Introduction to SQL Variable Types SQL supports a very large number of different formats for internal storage of information. Numeric I INTEGER, SMALLINT, BIGINT I NUMERIC(w,d), DECIMAL(w,d) - numbers with width w and d decimal places I REAL, DOUBLE PRECISION - machine and database dependent I FLOAT(p) - floating point number with p binary digits of precision
  • 48. Introduction to SQL Variable Types (cont’d) Character
  • 49. Introduction to SQL Variable Types (cont’d) Character I CHARACTER(L) - a fixed-length character of length L
  • 50. Introduction to SQL Variable Types (cont’d) Character I CHARACTER(L) - a fixed-length character of length L I CHARACTER VARYING(L) or VARCHAR(L) - supports maximum length of L
  • 51. Introduction to SQL Variable Types (cont’d) Character I CHARACTER(L) - a fixed-length character of length L I CHARACTER VARYING(L) or VARCHAR(L) - supports maximum length of L Binary
  • 52. Introduction to SQL Variable Types (cont’d) Character I CHARACTER(L) - a fixed-length character of length L I CHARACTER VARYING(L) or VARCHAR(L) - supports maximum length of L Binary I BIT(L), BIT VARYING(L) - like corresponding characters
  • 53. Introduction to SQL Variable Types (cont’d) Character I CHARACTER(L) - a fixed-length character of length L I CHARACTER VARYING(L) or VARCHAR(L) - supports maximum length of L Binary I BIT(L), BIT VARYING(L) - like corresponding characters I BINARY LARGE OBJECT(L) or BLOB(L)
  • 54. Introduction to SQL Variable Types (cont’d) Character I CHARACTER(L) - a fixed-length character of length L I CHARACTER VARYING(L) or VARCHAR(L) - supports maximum length of L Binary I BIT(L), BIT VARYING(L) - like corresponding characters I BINARY LARGE OBJECT(L) or BLOB(L) Temporal
  • 55. Introduction to SQL Variable Types (cont’d) Character I CHARACTER(L) - a fixed-length character of length L I CHARACTER VARYING(L) or VARCHAR(L) - supports maximum length of L Binary I BIT(L), BIT VARYING(L) - like corresponding characters I BINARY LARGE OBJECT(L) or BLOB(L) Temporal I DATE
  • 56. Introduction to SQL Variable Types (cont’d) Character I CHARACTER(L) - a fixed-length character of length L I CHARACTER VARYING(L) or VARCHAR(L) - supports maximum length of L Binary I BIT(L), BIT VARYING(L) - like corresponding characters I BINARY LARGE OBJECT(L) or BLOB(L) Temporal I DATE I TIME
  • 57. Introduction to SQL Variable Types (cont’d) Character I CHARACTER(L) - a fixed-length character of length L I CHARACTER VARYING(L) or VARCHAR(L) - supports maximum length of L Binary I BIT(L), BIT VARYING(L) - like corresponding characters I BINARY LARGE OBJECT(L) or BLOB(L) Temporal I DATE I TIME I TIMESTAMP
  • 58. Introduction to SQL CREATE TABLE statement Suppose we have data measured on the height and weight of children over a range of ages. The first step is deciding on the appropriate variable types, and creating the table with the CREATE TABLE command.
  • 59. Introduction to SQL CREATE TABLE statement Suppose we have data measured on the height and weight of children over a range of ages. The first step is deciding on the appropriate variable types, and creating the table with the CREATE TABLE command. CREATE TABLE kids(id CHAR(6), race SMALLINT, age DECIMAL(6,3), height DECIMAL(7,3), weight DECIMAL(7,3), sex SMALLINT);
  • 60. Introduction to SQL Entering observations into a table We could now enter individual items with the INSERT command: INSERT INTO kids VALUES(100011,2,10.346, 148.5,38.95,1); This quickly gets tedious. We can automate the process using the LOAD DATA command:
  • 61. Introduction to SQL Entering observations into a table We could now enter individual items with the INSERT command: INSERT INTO kids VALUES(100011,2,10.346, 148.5,38.95,1); This quickly gets tedious. We can automate the process using the LOAD DATA command: LOAD DATA INFILE ’kids.tab’ INTO TABLE kids FIELDS TERMINATED BY ’t’;
  • 62. Introduction to SQL Entering observations into a table We could now enter individual items with the INSERT command: INSERT INTO kids VALUES(100011,2,10.346, 148.5,38.95,1); This quickly gets tedious. We can automate the process using the LOAD DATA command: LOAD DATA INFILE ’kids.tab’ INTO TABLE kids FIELDS TERMINATED BY ’t’; This will read an entire tab-separated file into the database in one command.
  • 63. Introduction to SQL Comparison Operators In SQL, the WHERE clause allows you to operate on subsets of a table. The following comparison operators are avaiable:
  • 64. Introduction to SQL Comparison Operators In SQL, the WHERE clause allows you to operate on subsets of a table. The following comparison operators are avaiable: I Usual logical operators: < > <= >= = <>
  • 65. Introduction to SQL Comparison Operators In SQL, the WHERE clause allows you to operate on subsets of a table. The following comparison operators are avaiable: I Usual logical operators: < > <= >= = <> I BETWEEN used to test for a range
  • 66. Introduction to SQL Comparison Operators In SQL, the WHERE clause allows you to operate on subsets of a table. The following comparison operators are avaiable: I Usual logical operators: < > <= >= = <> I BETWEEN used to test for a range I IN used to test group membership I Keyword NOT used for negation
  • 67. Introduction to SQL Comparison Operators In SQL, the WHERE clause allows you to operate on subsets of a table. The following comparison operators are avaiable: I Usual logical operators: < > <= >= = <> I BETWEEN used to test for a range I IN used to test group membership I Keyword NOT used for negation I LIKE operator allows wildcards
  • 68. Introduction to SQL Comparison Operators In SQL, the WHERE clause allows you to operate on subsets of a table. The following comparison operators are avaiable: I Usual logical operators: < > <= >= = <> I BETWEEN used to test for a range I IN used to test group membership I Keyword NOT used for negation I LIKE operator allows wildcards I _ means single character, % means anything
  • 69. Introduction to SQL Comparison Operators In SQL, the WHERE clause allows you to operate on subsets of a table. The following comparison operators are avaiable: I Usual logical operators: < > <= >= = <> I BETWEEN used to test for a range I IN used to test group membership I Keyword NOT used for negation I LIKE operator allows wildcards I _ means single character, % means anything I SELECT salary WHERE name LIKE ’Fred %’;
  • 70. Introduction to SQL Comparison Operators In SQL, the WHERE clause allows you to operate on subsets of a table. The following comparison operators are avaiable: I Usual logical operators: < > <= >= = <> I BETWEEN used to test for a range I IN used to test group membership I Keyword NOT used for negation I LIKE operator allows wildcards I _ means single character, % means anything I SELECT salary WHERE name LIKE ’Fred %’; I RLIKE operator allows regular expressions
  • 71. Introduction to SQL Comparison Operators In SQL, the WHERE clause allows you to operate on subsets of a table. The following comparison operators are avaiable: I Usual logical operators: < > <= >= = <> I BETWEEN used to test for a range I IN used to test group membership I Keyword NOT used for negation I LIKE operator allows wildcards I _ means single character, % means anything I SELECT salary WHERE name LIKE ’Fred %’; I RLIKE operator allows regular expressions I Use AND(&&) and OR(||) to combine conditions
  • 72. Introduction to SQL Updating a Table To change some of the values of columns of a table, you can use the UPDATE command. Changes are provided as a comma-separated list of column/value pairs.
  • 73. Introduction to SQL Updating a Table To change some of the values of columns of a table, you can use the UPDATE command. Changes are provided as a comma-separated list of column/value pairs. For example, to add one to the weight of an observation in the kids table where id is 101311 and age is between 9 and 10, we could use:
  • 74. Introduction to SQL Updating a Table To change some of the values of columns of a table, you can use the UPDATE command. Changes are provided as a comma-separated list of column/value pairs. For example, to add one to the weight of an observation in the kids table where id is 101311 and age is between 9 and 10, we could use: UPDATE kids SET weight=weight + 1 WHERE id=’101311’ AND age BETWEEN 9 and 10;
  • 75. Introduction to SQL Updating a Table To change some of the values of columns of a table, you can use the UPDATE command. Changes are provided as a comma-separated list of column/value pairs. For example, to add one to the weight of an observation in the kids table where id is 101311 and age is between 9 and 10, we could use: UPDATE kids SET weight=weight + 1 WHERE id=’101311’ AND age BETWEEN 9 and 10; Be careful with UPDATE, because if you don’t provide a WHERE clause, all the rows of the table will be changed.
  • 76. Introduction to SQL The SELECT statement For many of the modern uses of databases, all you’ll need to do with the database is to select some subset of the variables and/or observations from a table, and let some other program manipulate them. In SQL the SELECT statement is the workhorse for these operations.
  • 77. Introduction to SQL The SELECT statement For many of the modern uses of databases, all you’ll need to do with the database is to select some subset of the variables and/or observations from a table, and let some other program manipulate them. In SQL the SELECT statement is the workhorse for these operations. SELECT columns or computations FROM table WHERE condition GROUP BY columns HAVING condition ORDER BY column [ASC | DESC] LIMIT offset,count;
  • 78. Introduction to SQL Examples of SELECT queries Suppose we wish to simply see all of the data:
  • 79. Introduction to SQL Examples of SELECT queries Suppose we wish to simply see all of the data: SELECT * FROM kids; View
  • 80. Introduction to SQL Examples of SELECT queries Suppose we wish to simply see all of the data: SELECT * FROM kids; View Find the age, race, height and weight for any observations with weight greater than 80kg and height less than 150cm:
  • 81. Introduction to SQL Examples of SELECT queries Suppose we wish to simply see all of the data: SELECT * FROM kids; View Find the age, race, height and weight for any observations with weight greater than 80kg and height less than 150cm: SELECT age,race,height,weight FROM kids View WHERE weight > 80 AND height < 150;
  • 82. Introduction to SQL Examples of SELECT queries Suppose we wish to simply see all of the data: SELECT * FROM kids; View Find the age, race, height and weight for any observations with weight greater than 80kg and height less than 150cm: SELECT age,race,height,weight FROM kids View WHERE weight > 80 AND height < 150; Find all information about the 10 tallest observations:
  • 83. Introduction to SQL Examples of SELECT queries Suppose we wish to simply see all of the data: SELECT * FROM kids; View Find the age, race, height and weight for any observations with weight greater than 80kg and height less than 150cm: SELECT age,race,height,weight FROM kids View WHERE weight > 80 AND height < 150; Find all information about the 10 tallest observations: SELECT * FROM kids View ORDER BY height DESC limit 1,10;
  • 84. Introduction to SQL Examples of SELECT queries Suppose we wish to simply see all of the data: SELECT * FROM kids; View Find the age, race, height and weight for any observations with weight greater than 80kg and height less than 150cm: SELECT age,race,height,weight FROM kids View WHERE weight > 80 AND height < 150; Find all information about the 10 tallest observations: SELECT * FROM kids View ORDER BY height DESC limit 1,10; Find all information about observations where age is from 17 to 18 and weight is from 180 to 185:
  • 85. Introduction to SQL Examples of SELECT queries Suppose we wish to simply see all of the data: SELECT * FROM kids; View Find the age, race, height and weight for any observations with weight greater than 80kg and height less than 150cm: SELECT age,race,height,weight FROM kids View WHERE weight > 80 AND height < 150; Find all information about the 10 tallest observations: SELECT * FROM kids View ORDER BY height DESC limit 1,10; Find all information about observations where age is from 17 to 18 and weight is from 180 to 185: SELECT * FROM kids WHERE age BETWEEN 17 AND 18 AND weight BETWEEN 180 AND 185; View
  • 86. Introduction to SQL Summaries and Computations SQL supports basic arithmetic operations to create new columns, as well as some summarization functions which include
  • 87. Introduction to SQL Summaries and Computations SQL supports basic arithmetic operations to create new columns, as well as some summarization functions which include I COUNT()
  • 88. Introduction to SQL Summaries and Computations SQL supports basic arithmetic operations to create new columns, as well as some summarization functions which include I COUNT() I AVG() (mean)
  • 89. Introduction to SQL Summaries and Computations SQL supports basic arithmetic operations to create new columns, as well as some summarization functions which include I COUNT() I AVG() (mean) I SUM()
  • 90. Introduction to SQL Summaries and Computations SQL supports basic arithmetic operations to create new columns, as well as some summarization functions which include I COUNT() I AVG() (mean) I SUM() I MIN()
  • 91. Introduction to SQL Summaries and Computations SQL supports basic arithmetic operations to create new columns, as well as some summarization functions which include I COUNT() I AVG() (mean) I SUM() I MIN() I MAX()
  • 92. Introduction to SQL Summaries and Computations SQL supports basic arithmetic operations to create new columns, as well as some summarization functions which include I COUNT() I AVG() (mean) I SUM() I MIN() I MAX() Since the COUNT for all columns is the same, the form COUNT(*) is often used.
  • 93. Introduction to SQL Summaries and Computations SQL supports basic arithmetic operations to create new columns, as well as some summarization functions which include I COUNT() I AVG() (mean) I SUM() I MIN() I MAX() Since the COUNT for all columns is the same, the form COUNT(*) is often used. Other functions (ABS(), FLOOR(), ROUND(), SQRT(), etc.) may also be available.
  • 94. Introduction to SQL Summary and Computation examples
  • 95. Introduction to SQL Summary and Computation examples Find max. height for age between 10 and 11 and race=1:
  • 96. Introduction to SQL Summary and Computation examples Find max. height for age between 10 and 11 and race=1: SELECT MAX(height) FROM kids View WHERE age BETWEEN 10 AND 11 AND race = 1 ;
  • 97. Introduction to SQL Summary and Computation examples Find max. height for age between 10 and 11 and race=1: SELECT MAX(height) FROM kids View WHERE age BETWEEN 10 AND 11 AND race = 1 ; By combining with the GROUP BY command, useful summaries can be obtained.
  • 98. Introduction to SQL Summary and Computation examples Find max. height for age between 10 and 11 and race=1: SELECT MAX(height) FROM kids View WHERE age BETWEEN 10 AND 11 AND race = 1 ; By combining with the GROUP BY command, useful summaries can be obtained. Find the average BMI (weight/height2 ∗ 10000) by sex and race:
  • 99. Introduction to SQL Summary and Computation examples Find max. height for age between 10 and 11 and race=1: SELECT MAX(height) FROM kids View WHERE age BETWEEN 10 AND 11 AND race = 1 ; By combining with the GROUP BY command, useful summaries can be obtained. Find the average BMI (weight/height2 ∗ 10000) by sex and race: SELECT sex,race,count(*) AS n, View AVG(weight/(height*height)*10000) AS bmi FROM kids GROUP BY sex,race;
  • 100. Introduction to SQL Summary and Computation examples Find max. height for age between 10 and 11 and race=1: SELECT MAX(height) FROM kids View WHERE age BETWEEN 10 AND 11 AND race = 1 ; By combining with the GROUP BY command, useful summaries can be obtained. Find the average BMI (weight/height2 ∗ 10000) by sex and race: SELECT sex,race,count(*) AS n, View AVG(weight/(height*height)*10000) AS bmi FROM kids GROUP BY sex,race; The SUM function can count logical expressions:
  • 101. Introduction to SQL Summary and Computation examples Find max. height for age between 10 and 11 and race=1: SELECT MAX(height) FROM kids View WHERE age BETWEEN 10 AND 11 AND race = 1 ; By combining with the GROUP BY command, useful summaries can be obtained. Find the average BMI (weight/height2 ∗ 10000) by sex and race: SELECT sex,race,count(*) AS n, View AVG(weight/(height*height)*10000) AS bmi FROM kids GROUP BY sex,race; The SUM function can count logical expressions: SELECT race,SUM(height > 150)/COUNT(*) View FROM kids GROUP BY race;
  • 102. Introduction to SQL Selecting based on Summaries Summaries can’t be used in the WHERE clause, but they can be used in the HAVING clause. For example, suppose we wanted to find all the IDs in the kids database for which there were less than 2 observations:
  • 103. Introduction to SQL Selecting based on Summaries Summaries can’t be used in the WHERE clause, but they can be used in the HAVING clause. For example, suppose we wanted to find all the IDs in the kids database for which there were less than 2 observations: SELECT id FROM kids View GROUP BY id HAVING COUNT(*) < 2;
  • 104. Introduction to SQL Selecting based on Summaries Summaries can’t be used in the WHERE clause, but they can be used in the HAVING clause. For example, suppose we wanted to find all the IDs in the kids database for which there were less than 2 observations: SELECT id FROM kids View GROUP BY id HAVING COUNT(*) < 2; Get all information about ids that have exactly ten observations:
  • 105. Introduction to SQL Selecting based on Summaries Summaries can’t be used in the WHERE clause, but they can be used in the HAVING clause. For example, suppose we wanted to find all the IDs in the kids database for which there were less than 2 observations: SELECT id FROM kids View GROUP BY id HAVING COUNT(*) < 2; Get all information about ids that have exactly ten observations: SELECT * FROM kids View GROUP BY id HAVING COUNT(*) = 10;
  • 106. Introduction to SQL Selecting based on Summaries Summaries can’t be used in the WHERE clause, but they can be used in the HAVING clause. For example, suppose we wanted to find all the IDs in the kids database for which there were less than 2 observations: SELECT id FROM kids View GROUP BY id HAVING COUNT(*) < 2; Get all information about ids that have exactly ten observations: SELECT * FROM kids View GROUP BY id HAVING COUNT(*) = 10; This doesn’t work - it only gives the first observation for each id.
  • 107. Introduction to SQL Subqueries By putting a SELECT statement in parentheses, you can use it in other SELECT statements as if it were another table.
  • 108. Introduction to SQL Subqueries By putting a SELECT statement in parentheses, you can use it in other SELECT statements as if it were another table. SELECT * FROM kids View WHERE id IN (SELECT id FROM kids GROUP BY id HAVING COUNT(*) = 10);
  • 109. Introduction to SQL Subqueries By putting a SELECT statement in parentheses, you can use it in other SELECT statements as if it were another table. SELECT * FROM kids View WHERE id IN (SELECT id FROM kids GROUP BY id HAVING COUNT(*) = 10); This may be slow if the number of ids is large.
  • 110. Introduction to SQL Subqueries By putting a SELECT statement in parentheses, you can use it in other SELECT statements as if it were another table. SELECT * FROM kids View WHERE id IN (SELECT id FROM kids GROUP BY id HAVING COUNT(*) = 10); This may be slow if the number of ids is large. A more efficient way is to use the subquery in an inner join (discussed later):
  • 111. Introduction to SQL Subqueries By putting a SELECT statement in parentheses, you can use it in other SELECT statements as if it were another table. SELECT * FROM kids View WHERE id IN (SELECT id FROM kids GROUP BY id HAVING COUNT(*) = 10); This may be slow if the number of ids is large. A more efficient way is to use the subquery in an inner join (discussed later): SELECT * FROM kids View INNER JOIN (SELECT id FROM kids GROUP BY id HAVING COUNT(*) = 10) AS t USING(id);
  • 112. Introduction to SQL Subqueries By putting a SELECT statement in parentheses, you can use it in other SELECT statements as if it were another table. SELECT * FROM kids View WHERE id IN (SELECT id FROM kids GROUP BY id HAVING COUNT(*) = 10); This may be slow if the number of ids is large. A more efficient way is to use the subquery in an inner join (discussed later): SELECT * FROM kids View INNER JOIN (SELECT id FROM kids GROUP BY id HAVING COUNT(*) = 10) AS t USING(id); This is considerably faster than the previous query.
  • 113. Introduction to SQL Subqueries (cont’d) Suppose we want to find all information about the observation with maximum weight:
  • 114. Introduction to SQL Subqueries (cont’d) Suppose we want to find all information about the observation with maximum weight: SELECT * FROM kids View HAVING weight = MAX(weight);
  • 115. Introduction to SQL Subqueries (cont’d) Suppose we want to find all information about the observation with maximum weight: SELECT * FROM kids View HAVING weight = MAX(weight); It returns an empty set!
  • 116. Introduction to SQL Subqueries (cont’d) Suppose we want to find all information about the observation with maximum weight: SELECT * FROM kids View HAVING weight = MAX(weight); It returns an empty set! Subqueries can be used to find the correct information:
  • 117. Introduction to SQL Subqueries (cont’d) Suppose we want to find all information about the observation with maximum weight: SELECT * FROM kids View HAVING weight = MAX(weight); It returns an empty set! Subqueries can be used to find the correct information: SELECT * FROM kids View WHERE weight = (SELECT MAX(weight) FROM kids);
  • 118. Introduction to SQL Subqueries (cont’d) Suppose we want to find all information about the observation with maximum weight: SELECT * FROM kids View HAVING weight = MAX(weight); It returns an empty set! Subqueries can be used to find the correct information: SELECT * FROM kids View WHERE weight = (SELECT MAX(weight) FROM kids); A similar thing can be done when there are grouping variables:
  • 119. Introduction to SQL Subqueries (cont’d) Suppose we want to find all information about the observation with maximum weight: SELECT * FROM kids View HAVING weight = MAX(weight); It returns an empty set! Subqueries can be used to find the correct information: SELECT * FROM kids View WHERE weight = (SELECT MAX(weight) FROM kids); A similar thing can be done when there are grouping variables: SELECT k.id,k.sex,k.race,k.age, View k.weight,k.height FROM kids AS k, (SELECT sex,race,max(weight) AS weight from kids) AS m WHERE k.sex=m.sex AND k.race=m.race AND k.weight=m.weight;
  • 120. Introduction to SQL Making Tables from Queries Sometimes it is useful to store a table which results from a query.
  • 121. Introduction to SQL Making Tables from Queries Sometimes it is useful to store a table which results from a query. Suppose we want to create a table with only observations with age less than 15.
  • 122. Introduction to SQL Making Tables from Queries Sometimes it is useful to store a table which results from a query. Suppose we want to create a table with only observations with age less than 15. CREATE TABLE young LIKE kids; INSERT INTO young SELECT * FROM kids WHERE age < 15;
  • 123. Introduction to SQL Making Tables from Queries Sometimes it is useful to store a table which results from a query. Suppose we want to create a table with only observations with age less than 15. CREATE TABLE young LIKE kids; INSERT INTO young SELECT * FROM kids WHERE age < 15; Such a table will stay on the database – to create a temporary one:
  • 124. Introduction to SQL Making Tables from Queries Sometimes it is useful to store a table which results from a query. Suppose we want to create a table with only observations with age less than 15. CREATE TABLE young LIKE kids; INSERT INTO young SELECT * FROM kids WHERE age < 15; Such a table will stay on the database – to create a temporary one: CREATE TEMPORARY TABLE young LIKE kids;
  • 125. Introduction to SQL Making Tables from Queries Sometimes it is useful to store a table which results from a query. Suppose we want to create a table with only observations with age less than 15. CREATE TABLE young LIKE kids; INSERT INTO young SELECT * FROM kids WHERE age < 15; Such a table will stay on the database – to create a temporary one: CREATE TEMPORARY TABLE young LIKE kids; Alternatively, you can DROP the table when you’re done:
  • 126. Introduction to SQL Making Tables from Queries Sometimes it is useful to store a table which results from a query. Suppose we want to create a table with only observations with age less than 15. CREATE TABLE young LIKE kids; INSERT INTO young SELECT * FROM kids WHERE age < 15; Such a table will stay on the database – to create a temporary one: CREATE TEMPORARY TABLE young LIKE kids; Alternatively, you can DROP the table when you’re done: DROP TABLE young;
  • 127. Introduction to SQL Music Collection Example Traditionally, redundancy is the enemy of database design, because it wastes storage space and increase data entry errors. For this reason, may traditional databases have a separate table for each attribute of importance. For example, suppose we have a collection of songs, organized into albums. Rather than store each song as a row with the album title and artist, we would create three tables: one for songs(tracks), one for albums, and one for artists.
  • 128. Introduction to SQL Music Collection Example Traditionally, redundancy is the enemy of database design, because it wastes storage space and increase data entry errors. For this reason, may traditional databases have a separate table for each attribute of importance. For example, suppose we have a collection of songs, organized into albums. Rather than store each song as a row with the album title and artist, we would create three tables: one for songs(tracks), one for albums, and one for artists. Album Artist Track alid INT aid INT tid INT aid INT name VARCHAR(40) alid INT title VARCHAR(60) time INT title VARCHAR(40) filename VARCHAR(14)
  • 129. Introduction to SQL A Look at the Tables mysql> select * from album limit 1,5; +------+------+------------------------+ | alid | aid | title | +------+------+------------------------+ | 140 | 102 | Ugetsu | | 150 | 109 | Born To Be Blue | | 151 | 109 | Connecticut Jazz Party | | 152 | 109 | Easy Does It | | 153 | 109 | In Person | +------+------+------------------------+ 5 rows in set (0.03 sec) mysql> select * from artist limit 1,5; +------+-----------------+ | aid | name | +------+-----------------+ | 109 | Bobby Timmons | | 134 | Dizzy Gillespie | | 140 | Elmo Hope | | 146 | Erroll Garner | | 159 | Horace Silver | +------+-----------------+ 5 rows in set (0.03 sec) mysql> select * from track limit 1,5; +------+------+------+----------------------------------+----------------+ | tid | alid | time | title | filename | +------+------+------+----------------------------------+----------------+ | 1713 | 139 | 413 | Sincerely Diane (alternate take) | 1077698286.mp3 | | 1714 | 139 | 384 | Yama | 1077698288.mp3 | | 1715 | 139 | 404 | When your lover has gone | 1077698290.mp3 | | 2276 | 139 | 398 | So tired | 1077699502.mp3 | | 3669 | 139 | 408 | Sincerely Diana | 1077702347.mp3 | +------+------+------+----------------------------------+----------------+ 5 rows in set (0.03 sec)
  • 130. Introduction to SQL SELECT with multiple tables Produce a list of album titles along with artist:
  • 131. Introduction to SQL SELECT with multiple tables Produce a list of album titles along with artist: SELECT a.title,r.name View FROM album AS a, artist AS r WHERE a.aid = r.aid;
  • 132. Introduction to SQL SELECT with multiple tables Produce a list of album titles along with artist: SELECT a.title,r.name View FROM album AS a, artist AS r WHERE a.aid = r.aid; This is a common operation, known as an inner join:
  • 133. Introduction to SQL SELECT with multiple tables Produce a list of album titles along with artist: SELECT a.title,r.name View FROM album AS a, artist AS r WHERE a.aid = r.aid; This is a common operation, known as an inner join: SELECT a.title,r.name FROM album AS a INNER JOIN artist AS r USING(aid);
  • 134. Introduction to SQL SELECT with multiple tables Produce a list of album titles along with artist: SELECT a.title,r.name View FROM album AS a, artist AS r WHERE a.aid = r.aid; This is a common operation, known as an inner join: SELECT a.title,r.name FROM album AS a INNER JOIN artist AS r USING(aid); This produces the same result as the previous query.
  • 135. Introduction to SQL SELECT with multiple tables Produce a list of album titles along with artist: SELECT a.title,r.name View FROM album AS a, artist AS r WHERE a.aid = r.aid; This is a common operation, known as an inner join: SELECT a.title,r.name FROM album AS a INNER JOIN artist AS r USING(aid); This produces the same result as the previous query. Find the sum of the times on each album: SELECT SUM(time) as duration View FROM track GROUP BY alid ORDER BY duration DESC;
  • 136. Introduction to SQL SELECT with multiple tables Produce a list of album titles along with artist: SELECT a.title,r.name View FROM album AS a, artist AS r WHERE a.aid = r.aid; This is a common operation, known as an inner join: SELECT a.title,r.name FROM album AS a INNER JOIN artist AS r USING(aid); This produces the same result as the previous query. Find the sum of the times on each album: SELECT SUM(time) as duration View FROM track GROUP BY alid ORDER BY duration DESC; Unfortunately, all we have are the album ids, not the names
  • 137. Introduction to SQL SELECT with multiple tables(cont’d) To improve our previous example, we need to combine the track information with album and artist information. Suppose we want to find the 10 longest albums in the collection:
  • 138. Introduction to SQL SELECT with multiple tables(cont’d) To improve our previous example, we need to combine the track information with album and artist information. Suppose we want to find the 10 longest albums in the collection: SELECT a.title,r.name, View SUM(time) AS duration FROM track AS t, album as a, artist as r WHERE t.alid = a.alid AND a.aid = r.aid GROUP BY t.alid ORDER BY duration DESC LIMIT 1,10;
  • 139. Introduction to SQL SELECT with multiple tables(cont’d) To improve our previous example, we need to combine the track information with album and artist information. Suppose we want to find the 10 longest albums in the collection: SELECT a.title,r.name, View SUM(time) AS duration FROM track AS t, album as a, artist as r WHERE t.alid = a.alid AND a.aid = r.aid GROUP BY t.alid ORDER BY duration DESC LIMIT 1,10;
  • 140. Introduction to SQL The Rules Have Changed As powerful as SQL is, we can use it as a data store without having to use all of the SQL features.
  • 141. Introduction to SQL The Rules Have Changed As powerful as SQL is, we can use it as a data store without having to use all of the SQL features. I Don’t hesitate to use familiar programs to do the hard work
  • 142. Introduction to SQL The Rules Have Changed As powerful as SQL is, we can use it as a data store without having to use all of the SQL features. I Don’t hesitate to use familiar programs to do the hard work I Repeated SELECT queries in loops can do wonders
  • 143. Introduction to SQL The Rules Have Changed As powerful as SQL is, we can use it as a data store without having to use all of the SQL features. I Don’t hesitate to use familiar programs to do the hard work I Repeated SELECT queries in loops can do wonders I Load up data structures with entire tables
  • 144. Introduction to SQL The Rules Have Changed As powerful as SQL is, we can use it as a data store without having to use all of the SQL features. I Don’t hesitate to use familiar programs to do the hard work I Repeated SELECT queries in loops can do wonders I Load up data structures with entire tables I Use as little or as much pure SQL as you like
  • 145. Introduction to SQL The Rules Have Changed As powerful as SQL is, we can use it as a data store without having to use all of the SQL features. I Don’t hesitate to use familiar programs to do the hard work I Repeated SELECT queries in loops can do wonders I Load up data structures with entire tables I Use as little or as much pure SQL as you like These ideas are illustrated using the music collection data, R, python, and perl
  • 146. Introduction to SQL Using SQL in R library(RMySQL) drv = dbDriver("MySQL") con = dbConnect(drv,dbname="dbname",user="user",pass="pass") rs = dbSendQuery(con,statement="select * from album") album = fetch(rs,n=-1) rs = dbSendQuery(con,statement="select * from track") track = fetch(rs,n=-1) rs = dbSendQuery(con,statement="select * from artist") artist = fetch(rs,n=-1) tracks = data.frame( album = factor(track$alid,levels=album$alid, labels=album$title), artist = factor(merge(track[,"alid",drop=FALSE], album[,c("alid","aid")],by="alid")$aid, levels=artist$aid, labels=artist$name), time = track$time) res = aggregate(tracks$time, list(album=tracks$album,artist=tracks$artist),sum) res = res[order(res$x,decreasing=TRUE),] print(res[1:10,])
  • 147. Introduction to SQL Using SQL in python #!/usr/bin/python from MySQLdb import * con = connect(user=’user’,passwd=’pass’,db=’dbname’) cursor = con.cursor() cursor.execute(’select * from track’) tracks = cursor.fetchall() durations = {} for t in tracks: durations[t[1]] = durations.get(t[1],0) + t[2] alids = durations.keys() alids.sort(lambda x,y:cmp(durations[y],durations[x])) for i in range(10): cursor.execute( ’select title,aid from album where alid = %d’ % alids[i]) title,aid = cursor.fetchall()[0] cursor.execute(’select name from artist where aid = %d’ % aid) name = cursor.fetchall()[0][0] print ’%st%st%d’ % (title,name,durations[alids[i]])
  • 148. Introduction to SQL Using SQL in perl #!/usr/bin/perl use DBI; $dbh = DBI->connect(’DBI:mysql:dbname:localhost’,’user’,’pass’); $sth = $dbh->prepare(’select * from album’); $sth->execute(); while((@row) = $sth->fetchrow()){ $album{$row[0]} = $row[2]; $aartist{$row[0]} = $row[1]; } $sth = $dbh->prepare(’select * from artist’); $sth->execute(); $artist{$row[0]} = $row[1] while((@row) = $sth->fetchrow()); $sth = $dbh->prepare(’select * from track’); $sth->execute(); $duration{$row[1]} += $row[2] while((@row) = $sth->fetchrow()); @salbum = sort({$duration{$b} <=> $duration{$a}} keys(%duration)); foreach $i (0..9){ print "$album{$salbum[$i]}t$artist{$aartist{$salbum[$i]}}t", "$duration{$salbum[$i]}n" }
  • 149. Introduction to SQL mysql> select * from kids; +--------+------+--------+---------+---------+------+ | id | race | age | height | weight | sex | +--------+------+--------+---------+---------+------+ | 100011 | 2 | 10.346 | 148.500 | 38.950 | 1 | | 100011 | 2 | 11.282 | 157.100 | 44.100 | 1 | | 100011 | 2 | 14.428 | 165.950 | 57.800 | 1 | | 100011 | 2 | 15.321 | 167.050 | 59.650 | 1 | | 100031 | 1 | 10.920 | 158.000 | 63.700 | 1 | | 100031 | 1 | 11.917 | 161.000 | 68.500 | 1 | | 100031 | 1 | 13.007 | 162.750 | 85.950 | 1 | . . . . . . . | 308091 | 1 | 9.460 | 138.000 | 39.000 | 1 | | 308091 | 1 | 10.740 | 147.500 | 53.100 | 1 | | 308091 | 1 | 11.359 | 151.750 | 57.050 | 1 | | 308101 | 1 | 9.800 | 152.350 | 38.500 | 2 | | 308101 | 1 | 10.781 | 159.335 | 48.235 | 2 | | 308101 | 1 | 11.701 | 164.285 | 51.700 | 2 | +--------+------+--------+---------+---------+------+ 20704 rows in set (0.18 sec) Return
  • 150. Introduction to SQL mysql> select age,race,height,weight from kids -> where weight > 80 and height < 150; +--------+------+---------+--------+ | age | race | height | weight | +--------+------+---------+--------+ | 12.429 | 2 | 147.800 | 83.000 | | 11.674 | 2 | 149.350 | 82.950 | | 14.414 | 2 | 149.300 | 86.750 | +--------+------+---------+--------+ 3 rows in set (0.06 sec) Return
  • 151. Introduction to SQL mysql> select * from kids order by height desc; +--------+------+--------+---------+---------+------+ | id | race | age | height | weight | sex | +--------+------+--------+---------+---------+------+ | 302941 | 2 | 19.657 | 201.905 | 83.820 | 2 | | 300861 | 2 | 17.804 | 201.850 | 126.610 | 2 | | 302941 | 2 | 16.572 | 201.795 | 76.670 | 2 | | 300861 | 2 | 14.833 | 201.520 | 124.245 | 2 | | 300861 | 2 | 18.781 | 201.520 | 123.310 | 2 | | 302941 | 2 | 18.611 | 201.410 | 83.710 | 2 | | 107061 | 2 | 17.626 | 201.300 | 82.005 | 2 | | 302941 | 2 | 15.537 | 201.190 | 72.820 | 2 | | 304441 | 1 | 17.946 | 201.190 | 67.430 | 2 | | 116741 | 1 | 17.338 | 201.025 | 72.710 | 2 | +--------+------+--------+---------+---------+------+ 10 rows in set (0.10 sec) Return
  • 152. Introduction to SQL mysql> select * from kids -> where age between 17 and 18 -> and weight between 180 and 185; +--------+------+--------+---------+---------+------+ | id | race | age | height | weight | sex | +--------+------+--------+---------+---------+------+ | 304741 | 1 | 17.875 | 194.150 | 184.250 | 2 | +--------+------+--------+---------+---------+------+ 1 row in set (0.03 sec) Return
  • 153. Introduction to SQL mysql> select max(height) from kids -> where age between 10 and 11 and race = 1; +-------------+ | max(height) | +-------------+ | 178.750 | +-------------+ 1 row in set (0.06 sec) Return
  • 154. Introduction to SQL mysql> select sex,race,count(*) as n, -> avg(weight/(height*height)*10000) as bmi -> from kids group by sex,race; +------+------+------+--------------+ | sex | race | n | bmi | +------+------+------+--------------+ | 1 | 1 | 4977 | 21.312670406 | | 1 | 2 | 5532 | 23.489962065 | | 2 | 1 | 4973 | 19.153469602 | | 2 | 2 | 5222 | 21.040500147 | +------+------+------+--------------+ 4 rows in set (0.12 sec) Return
  • 155. Introduction to SQL mysql> select race,sum(height > 150)/count(*) -> from kids group by race; +------+----------------------------+ | race | sum(height > 150)/count(*) | +------+----------------------------+ | 1 | 0.85 | | 2 | 0.89 | +------+----------------------------+ 2 rows in set (0.05 sec) Return
  • 156. Introduction to SQL mysql> select id from kids -> group by id having count(*) < 2; +--------+ | id | +--------+ | 101051 | | 103181 | | 103191 | | 107231 | | 109001 | . . . | 207291 | | 207961 | | 302241 | | 304561 | | 307081 | +--------+ 22 rows in set (0.10 sec) Return
  • 157. Introduction to SQL mysql> select * from kids group by id having count(*)=10; +--------+------+--------+---------+--------+------+ | id | race | age | height | weight | sex | +--------+------+--------+---------+--------+------+ | 100031 | 1 | 10.920 | 158.000 | 63.700 | 1 | | 100041 | 1 | 10.070 | 159.500 | 51.700 | 2 | | 100071 | 2 | 10.630 | 139.700 | 37.500 | 1 | | 100081 | 2 | 9.110 | 152.130 | 36.795 | 2 | | 100091 | 2 | 9.200 | 148.250 | 54.150 | 1 | . . . . . . | 308021 | 1 | 9.330 | 157.850 | 41.470 | 2 | | 308041 | 1 | 10.810 | 157.025 | 38.060 | 2 | | 308061 | 1 | 10.120 | 156.200 | 32.780 | 2 | | 308071 | 1 | 10.990 | 138.500 | 29.450 | 1 | | 308081 | 1 | 9.920 | 152.900 | 31.130 | 2 | +--------+------+--------+---------+--------+------+ 1303 rows in set (0.11 sec) Return
  • 158. Introduction to SQL mysql> select * from kids where id in -> (select id from kids group by id -> having count(*)=10); +--------+------+--------+---------+---------+------+ | id | race | age | height | weight | sex | +--------+------+--------+---------+---------+------+ | 100011 | 2 | 10.346 | 148.500 | 38.950 | 1 | | 100011 | 2 | 11.282 | 157.100 | 44.100 | 1 | | 100011 | 2 | 12.336 | 163.900 | 51.150 | 1 | | 100011 | 2 | 13.388 | 166.450 | 57.400 | 1 | | 100011 | 2 | 14.428 | 165.950 | 57.800 | 1 | . . . . . | 308081 | 1 | 14.803 | 183.700 | 55.935 | 2 | | 308081 | 1 | 15.780 | 183.590 | 54.780 | 2 | | 308081 | 1 | 16.865 | 184.195 | 58.905 | 2 | | 308081 | 1 | 17.864 | 184.580 | 56.320 | 2 | | 308081 | 1 | 18.631 | 184.195 | 56.100 | 2 | +--------+------+--------+---------+---------+------+ 13030 rows in set (35 min 33.96 sec) Return
  • 159. Introduction to SQL mysql> select * from kids inner join -> (select id from kids group by id having count(*)=10) -> as a using(id); +--------+------+--------+---------+---------+------+ | id | race | age | height | weight | sex | +--------+------+--------+---------+---------+------+ | 100011 | 2 | 10.346 | 148.500 | 38.950 | 1 | | 100011 | 2 | 11.282 | 157.100 | 44.100 | 1 | | 100011 | 2 | 12.336 | 163.900 | 51.150 | 1 | | 100011 | 2 | 13.388 | 166.450 | 57.400 | 1 | | 100011 | 2 | 14.428 | 165.950 | 57.800 | 1 | . . . . . | 308081 | 1 | 14.803 | 183.700 | 55.935 | 2 | | 308081 | 1 | 15.780 | 183.590 | 54.780 | 2 | | 308081 | 1 | 16.865 | 184.195 | 58.905 | 2 | | 308081 | 1 | 17.864 | 184.580 | 56.320 | 2 | | 308081 | 1 | 18.631 | 184.195 | 56.100 | 2 | +--------+------+--------+---------+---------+------+ 13030 rows in set (11.89 sec) Return
  • 160. Introduction to SQL mysql> select * from kids -> having weight = max(weight); Empty set (0.00 sec) Return
  • 161. Introduction to SQL mysql> select * from kids -> where weight = (select max(weight) from kids); +--------+------+--------+---------+---------+------+ | id | race | age | height | weight | sex | +--------+------+--------+---------+---------+------+ | 304741 | 1 | 18.680 | 192.940 | 189.695 | 2 | +--------+------+--------+---------+---------+------+ 1 row in set (0.03 sec) Return
  • 162. Introduction to SQL mysql> select k.id,k.sex,k.race,k.age,k.weight,k.height -> from kids as k, (select sex,race,max(weight) as weight -> from kids group by sex,race) as m -> where k.sex = m.sex and k.race = m.race and -> k.weight = m.weight; +--------+------+------+--------+---------+---------+ | id | sex | race | age | weight | height | +--------+------+------+--------+---------+---------+ | 207201 | 2 | 2 | 19.405 | 173.360 | 191.565 | | 207931 | 1 | 2 | 19.674 | 151.200 | 164.900 | | 208171 | 1 | 1 | 18.633 | 128.500 | 168.100 | | 304741 | 2 | 1 | 18.680 | 189.695 | 192.940 | +--------+------+------+--------+---------+---------+ 4 rows in set (0.34 sec) Return
  • 163. Introduction to SQL mysql> select a.title,r.name from album as a,artist as r where a.aid = r.aid; +----------------------------------------------------+------------------------------+ | title | name | +----------------------------------------------------+------------------------------+ | A Night in Tunisia | Art Blakey & Jazz Messengers | | Ugetsu | Art Blakey & Jazz Messengers | | Born To Be Blue | Bobby Timmons | | Connecticut Jazz Party | Bobby Timmons | | Easy Does It | Bobby Timmons | | In Person | Bobby Timmons | | Moanin’ Blues | Bobby Timmons | | The Prestige Trio Sessions | Bobby Timmons | | Soul Man Soul Food | Bobby Timmons | | Soul Time | Bobby Timmons | | Workin’ Out | Bobby Timmons | | 1945-1950 Small Groups | Dizzy Gillespie | . . . . . | Live at the Circle Room and Mo | Nat King Cole | | Birth of the Cole 1938-1939 | Nat King Cole | | Rockin’ Boppin’ & Blues | Nat King Cole | | WWII Transcriptions | Nat King Cole | | Oscar Peterson And Clark Terry | Oscar Peterson | | A Tribute To My Friends | Oscar Peterson | | The Oscar Peterson Trio Live At Zardi’s - Disc One | Oscar Peterson | | The Oscar Peterson Trio Live At Zardi’s - Disc Two | Oscar Peterson | | Skol | Oscar Peterson | | Oscar Peterson and Dizzy Gillespie | Oscar Peterson | | Overseas | Tommy Flanagan | | The Tommy Flanagan Trio | Tommy Flanagan | | Trio & Sextet | Tommy Flanagan | +----------------------------------------------------+------------------------------+ 72 rows in set (0.02 sec) Return
  • 164. Introduction to SQL mysql> select alid,sum(time) as duration -> from track group by alid order by duration desc; +------+----------+ | alid | duration | +------+----------+ | 150 | 6057 | | 286 | 5664 | | 264 | 5028 | | 156 | 4764 | | 158 | 4674 | . . . . | 343 | 2031 | | 263 | 1865 | | 281 | 1749 | | 280 | 1611 | | 287 | 1519 | | 203 | 1061 | +------+----------+ 72 rows in set (0.04 sec) Return
  • 165. Introduction to SQL mysql> select a.title,r.name,sum(time) as duration -> from track as t,album as a,artist as r -> where t.alid=a.alid and a.aid = r.aid -> group by t.alid -> order by duration desc limit 1,10; +----------------------------------------------------+----------------+----------+ | title | name | duration | +----------------------------------------------------+----------------+----------+ | My Funny Valentine | Miles Davis | 5664 | | Trio | Kenny Drew | 5028 | | Soul Man Soul Food | Bobby Timmons | 4764 | | Workin’ Out | Bobby Timmons | 4674 | | The All-Stars Sessions | Elmo Hope | 4636 | | The Oscar Peterson Trio Live At Zardi’s - Disc Two | Oscar Peterson | 4567 | | Memories Of You | Erroll Garner | 4538 | | Elmo Hope | Elmo Hope | 4536 | | WWII Transcriptions | Nat King Cole | 4456 | | The Oscar Peterson Trio Live At Zardi’s - Disc One | Oscar Peterson | 4355 | +----------------------------------------------------+----------------+----------+ 10 rows in set (0.10 sec) Return