CHAPTER 5 Advanced Querying

  • Use nicknames,or aliases, in queies to save typing and allow a table to be used more than once in a query.
  • Aggregate data into groups so you can discover sums,averages,and counts.
  • Join Tables in different ways.
  • Use nested queries
  • Save query results in variables so they can be reused in other queries.

1.Aliases

 Column Aliases

mysql> 
mysql> SELECT first_name as 'First Name',last_name as 'Last Name'
    -> FROM actor LIMIT 5;
ERROR 1146 (42S02): Table 'sakila_new.actor' doesn't exist
mysql> show database;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'database' at line 1
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| employees          |
| lu                 |
| lu;cy              |
| lucy               |
| mysql              |
| performance_schema |
| sakila             |
| sakila_new         |
| sys                |
| world              |
+--------------------+
11 rows in set (0.00 sec)

mysql> use sakila
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> 
mysql> SELECT first_name as 'First Name',last_name as 'Last Name'
    -> FROM actor LIMIT 5;

+------------+--------------+
| First Name | Last Name    |
+------------+--------------+
| PENELOPE   | CRUZ         |
| NICK       | WAHLBERG     |
| ED         | CHASE        |
| JENNIFER   | DAVIS        |
| JOHNNY     | LOLLOBRIGIDA |
+------------+--------------+
5 rows in set (0.00 sec)

mysql> SELECT CONCAT(first_name, ' ', last_name, ' played in ', title) AS movie
    -> FROM actor JOIN film_actor USING (actor_id)
    -> JOIN film USING (film_id)
    -> ORDER BY movie LIMIT 20;

+--------------------------------------------+
| movie                                      |
+--------------------------------------------+
| ADAM GRANT played in ANNIE IDENTITY        |
| ADAM GRANT played in BALLROOM MOCKINGBIRD  |
| ADAM GRANT played in DISCIPLE MOTHER       |
| ADAM GRANT played in FIREBALL PHILADELPHIA |
| ADAM GRANT played in GLADIATOR WESTWARD    |
| ADAM GRANT played in GLORY TRACY           |
| ADAM GRANT played in GROUNDHOG UNCUT       |
| ADAM GRANT played in HAPPINESS UNITED      |
| ADAM GRANT played in IDOLS SNATCHERS       |
| ADAM GRANT played in LOSER HUSTLER         |
| ADAM GRANT played in MARS ROMAN            |
| ADAM GRANT played in MIDNIGHT WESTWARD     |
| ADAM GRANT played in OPERATION OPERATION   |
| ADAM GRANT played in SEABISCUIT PUNK       |
| ADAM GRANT played in SPLENDOR PATTON       |
| ADAM GRANT played in TADPOLE PARK          |
| ADAM GRANT played in TWISTED PIRATES       |
| ADAM GRANT played in WANDA CHAMBER         |
| ADAM HOPPER played in BLINDNESS GUN        |
| ADAM HOPPER played in BLOOD ARGONAUTS      |
+--------------------------------------------+
20 rows in set (0.02 sec)

mysql> SELECT CONCAT(first_name, ' ', last_name, ' played in ', title) AS movie FROM actor JOIN film_actor USING (actor_id) JOIN film USING (film_id) ORDER BY CONCAT(first_name, ' ',last_name, ' played in
', title) LIMIT 20;

+--------------------------------------------+
| movie                                      |
+--------------------------------------------+
| ADAM GRANT played in ANNIE IDENTITY        |
| ADAM GRANT played in BALLROOM MOCKINGBIRD  |
| ADAM GRANT played in DISCIPLE MOTHER       |
| ADAM GRANT played in FIREBALL PHILADELPHIA |
| ADAM GRANT played in GLADIATOR WESTWARD    |
| ADAM GRANT played in GLORY TRACY           |
| ADAM GRANT played in GROUNDHOG UNCUT       |
| ADAM GRANT played in HAPPINESS UNITED      |
| ADAM GRANT played in IDOLS SNATCHERS       |
| ADAM GRANT played in LOSER HUSTLER         |
| ADAM GRANT played in MARS ROMAN            |
| ADAM GRANT played in MIDNIGHT WESTWARD     |
| ADAM GRANT played in OPERATION OPERATION   |
| ADAM GRANT played in SEABISCUIT PUNK       |
| ADAM GRANT played in SPLENDOR PATTON       |
| ADAM GRANT played in TADPOLE PARK          |
| ADAM GRANT played in TWISTED PIRATES       |
| ADAM GRANT played in WANDA CHAMBER         |
| ADAM HOPPER played in BLINDNESS GUN        |
| ADAM HOPPER played in BLOOD ARGONAUTS      |
+--------------------------------------------+
20 rows in set (0.03 sec)

mysql> select first_name as name from actor where name = 'ZERO CAGE';
ERROR 1054 (42S22): Unknown column 'name' in 'where clause'
mysql> select actor_id as id FROM actor WHERE first_name = 'ZERO';
+----+
| id |
+----+
| 11 |
+----+
1 row in set (0.00 sec)

mysql> SELECT actor_id id from actor where first_name = 'ZERO';
+----+
| id |
+----+
| 11 |
+----+
1 row in set (0.00 sec)

mysql> 

Tables Aliases

mysql> 
mysql> SELECT ac.actor_id,ac.first_name,ac.last_name,fl.title from actor as ac inner join film_actor as fla using (actor_id) inner join film as fl using (film_id) where fl.title = 'AFFAIR PREJUDICE';  
+----------+------------+-----------+------------------+
| actor_id | first_name | last_name | title            |
+----------+------------+-----------+------------------+
|       41 | JODIE      | DEGENERES | AFFAIR PREJUDICE |
|       81 | SCARLETT   | DAMON     | AFFAIR PREJUDICE |
|       88 | KENNETH    | PESCI     | AFFAIR PREJUDICE |
|      147 | FAY        | WINSLET   | AFFAIR PREJUDICE |
|      162 | OPRAH      | KILMER    | AFFAIR PREJUDICE |
+----------+------------+-----------+------------------+
5 rows in set (0.00 sec)

mysql> SELECT ac.actor_id,ac.first_name,ac.last_name,fl.title from actor as ac inner join film_actor as fla using (actor_id) inner join film as fl using (film_id) where film.title = 'AFFAIR PREJUDICE';
ERROR 1054 (42S22): Unknown column 'film.title' in 'where clause'
mysql> 
mysql> select * from film where title = title limit 5;
+---------+------------------+-----------------------------------------------------------------------------------------------------------------------+--------------+-------------+----------------------+-----------------+-------------+--------+------------------+--------+----------------------------------+---------------------+
| film_id | title            | description                                                                                                           | release_year | language_id | original_language_id | rental_duration | rental_rate | length | replacement_cost | rating | special_features                 | last_update         |
+---------+------------------+-----------------------------------------------------------------------------------------------------------------------+--------------+-------------+----------------------+-----------------+-------------+--------+------------------+--------+----------------------------------+---------------------+
|       1 | ACADEMY DINOSAUR | A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies                      |         2006 |           1 |                 NULL |               6 |        0.99 |     86 |            20.99 | PG     | Deleted Scenes,Behind the Scenes | 2006-02-15 05:03:42 |
|       2 | ACE GOLDFINGER   | A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China                  |         2006 |           1 |                 NULL |               3 |        4.99 |     48 |            12.99 | G      | Trailers,Deleted Scenes          | 2006-02-15 05:03:42 |
|       3 | ADAPTATION HOLES | A Astounding Reflection of a Lumberjack And a Car who must Sink a Lumberjack in A Baloon Factory                      |         2006 |           1 |                 NULL |               7 |        2.99 |     50 |            18.99 | NC-17  | Trailers,Deleted Scenes          | 2006-02-15 05:03:42 |
|       4 | AFFAIR PREJUDICE | A Fanciful Documentary of a Frisbee And a Lumberjack who must Chase a Monkey in A Shark Tank                          |         2006 |           1 |                 NULL |               5 |        2.99 |    117 |            26.99 | G      | Commentaries,Behind the Scenes   | 2006-02-15 05:03:42 |
|       5 | AFRICAN EGG      | A Fast-Paced Documentary of a Pastry Chef And a Dentist who must Pursue a Forensic Psychologist in The Gulf of Mexico |         2006 |           1 |                 NULL |               6 |        2.99 |    130 |            22.99 | G      | Deleted Scenes                   | 2006-02-15 05:03:42 |
+---------+------------------+-----------------------------------------------------------------------------------------------------------------------+--------------+-------------+----------------------+-----------------+-------------+--------+------------------+--------+----------------------------------+---------------------+
5 rows in set (0.00 sec)

mysql> 

mysql> select m1.film_id,m2.title from film as m1,film as m2 where m1.title = m2.title limit 5;
+---------+------------------+
| film_id | title            |
+---------+------------------+
|       1 | ACADEMY DINOSAUR |
|       2 | ACE GOLDFINGER   |
|       3 | ADAPTATION HOLES |
|       4 | AFFAIR PREJUDICE |
|       5 | AFRICAN EGG      |
+---------+------------------+
5 rows in set (0.00 sec)

mysql> select m1.film_id,m2.title from film as m1,film as m2 where m1.title = m2.title and m1.film_id <> m2.film_id limit 5;        
Empty set (0.00 sec)

mysql> 

2.Aggregating Data 

  The DISTINCT Clause

mysql> select first_name
    -> from actor join film_actor using (actor_id)
    -> limit 5;

+------------+
| first_name |
+------------+
| PENELOPE   |
| PENELOPE   |
| PENELOPE   |
| PENELOPE   |
| PENELOPE   |
+------------+
5 rows in set (0.00 sec)

mysql> select distinct first_name,last_name
    -> from actor join film_actor using(actor_id);

+-------------+--------------+
| first_name  | last_name    |
+-------------+--------------+
| PENELOPE    | CRUZ         |
| NICK        | WAHLBERG     |
| ED          | CHASE        |
| JENNIFER    | DAVIS        |
| JOHNNY      | LOLLOBRIGIDA |
| BETTE       | NICHOLSON    |
| GRACE       | MOSTEL       |
| MATTHEW     | JOHANSSON    |
| JOE         | SWANK        |
| CHRISTIAN   | GABLE        |
| ZERO        | CAGE         |
| KARL        | BERRY        |
| UMA         | WOOD         |
| VIVIEN      | BERGEN       |
| CUBA        | OLIVIER      |
| FRED        | COSTNER      |
| HELEN       | VOIGHT       |
| DAN         | TORN         |
| BOB         | FAWCETT      |
| LUCILLE     | TRACY        |
| KIRSTEN     | PALTROW      |
| ELVIS       | MARX         |
| SANDRA      | KILMER       |
| CAMERON     | STREEP       |
| KEVIN       | BLOOM        |
| RIP         | CRAWFORD     |
| JULIA       | MCQUEEN      |
| WOODY       | HOFFMAN      |
| ALEC        | WAYNE        |
| SANDRA      | PECK         |
| SISSY       | SOBIESKI     |
| TIM         | HACKMAN      |
| MILLA       | PECK         |
| AUDREY      | OLIVIER      |
| JUDY        | DEAN         |
| BURT        | DUKAKIS      |
| VAL         | BOLGER       |
| TOM         | MCKELLEN     |
| GOLDIE      | BRODY        |
| JOHNNY      | CAGE         |
| JODIE       | DEGENERES    |
| TOM         | MIRANDA      |
| KIRK        | JOVOVICH     |
| NICK        | STALLONE     |
| REESE       | KILMER       |
| PARKER      | GOLDBERG     |
| JULIA       | BARRYMORE    |
| FRANCES     | DAY-LEWIS    |
| ANNE        | CRONYN       |
| NATALIE     | HOPKINS      |
| GARY        | PHOENIX      |
| CARMEN      | HUNT         |
| MENA        | TEMPLE       |
| PENELOPE    | PINKETT      |
| FAY         | KILMER       |
| DAN         | HARRIS       |
| JUDE        | CRUISE       |
| CHRISTIAN   | AKROYD       |
| DUSTIN      | TAUTOU       |
| HENRY       | BERRY        |
| CHRISTIAN   | NEESON       |
| JAYNE       | NEESON       |
| CAMERON     | WRAY         |
| RAY         | JOHANSSON    |
| ANGELA      | HUDSON       |
| MARY        | TANDY        |
| JESSICA     | BAILEY       |
| RIP         | WINSLET      |
| KENNETH     | PALTROW      |
| MICHELLE    | MCCONAUGHEY  |
| ADAM        | GRANT        |
| SEAN        | WILLIAMS     |
| GARY        | PENN         |
| MILLA       | KEITEL       |
| BURT        | POSEY        |
| ANGELINA    | ASTAIRE      |
| CARY        | MCCONAUGHEY  |
| GROUCHO     | SINATRA      |
| MAE         | HOFFMAN      |
| RALPH       | CRUZ         |
| SCARLETT    | DAMON        |
| WOODY       | JOLIE        |
| BEN         | WILLIS       |
| JAMES       | PITT         |
| MINNIE      | ZELLWEGER    |
| GREG        | CHAPLIN      |
| SPENCER     | PECK         |
| KENNETH     | PESCI        |
| CHARLIZE    | DENCH        |
| SEAN        | GUINESS      |
| CHRISTOPHER | BERRY        |
| KIRSTEN     | AKROYD       |
| ELLEN       | PRESLEY      |
| KENNETH     | TORN         |
| DARYL       | WAHLBERG     |
| GENE        | WILLIS       |
| MEG         | HAWKE        |
| CHRIS       | BRIDGES      |
| JIM         | MOSTEL       |
| SPENCER     | DEPP         |
| SUSAN       | DAVIS        |
| WALTER      | TORN         |
| MATTHEW     | LEIGH        |
| PENELOPE    | CRONYN       |
| SIDNEY      | CROWE        |
| GROUCHO     | DUNST        |
| GINA        | DEGENERES    |
| WARREN      | NOLTE        |
| SYLVESTER   | DERN         |
| CAMERON     | ZELLWEGER    |
| RUSSELL     | BACALL       |
| MORGAN      | HOPKINS      |
| MORGAN      | MCDORMAND    |
| HARRISON    | BALE         |
| DAN         | STREEP       |
| RENEE       | TRACY        |
| CUBA        | ALLEN        |
| WARREN      | JACKMAN      |
| PENELOPE    | MONROE       |
| LIZA        | BERGMAN      |
| SALMA       | NOLTE        |
| JULIANNE    | DENCH        |
| SCARLETT    | BENING       |
| ALBERT      | NOLTE        |
| FRANCES     | TOMEI        |
| KEVIN       | GARLAND      |
| CATE        | MCQUEEN      |
| DARYL       | CRAWFORD     |
| GRETA       | KEITEL       |
| JANE        | JACKMAN      |
| ADAM        | HOPPER       |
| RICHARD     | PENN         |
| GENE        | HOPKINS      |
| RITA        | REYNOLDS     |
| ED          | MANSFIELD    |
| MORGAN      | WILLIAMS     |
| LUCILLE     | DEE          |
| EWAN        | GOODING      |
| WHOOPI      | HURT         |
| CATE        | HARRIS       |
| JADA        | RYDER        |
| RIVER       | DEAN         |
| ANGELA      | WITHERSPOON  |
| KIM         | ALLEN        |
| ALBERT      | JOHANSSON    |
| FAY         | WINSLET      |
| EMILY       | DEE          |
| RUSSELL     | TEMPLE       |
| JAYNE       | NOLTE        |
| GEOFFREY    | HESTON       |
| BEN         | HARRIS       |
| MINNIE      | KILMER       |
| MERYL       | GIBSON       |
| IAN         | TANDY        |
| FAY         | WOOD         |
| GRETA       | MALDEN       |
| VIVIEN      | BASINGER     |
| LAURA       | BRODY        |
| CHRIS       | DEPP         |
| HARVEY      | HOPE         |
| OPRAH       | KILMER       |
| CHRISTOPHER | WEST         |
| HUMPHREY    | WILLIS       |
| AL          | GARLAND      |
| NICK        | DEGENERES    |
| LAURENCE    | BULLOCK      |
| WILL        | WILSON       |
| KENNETH     | HOFFMAN      |
| MENA        | HOPPER       |
| OLYMPIA     | PFEIFFER     |
| GROUCHO     | WILLIAMS     |
| ALAN        | DREYFUSS     |
| MICHAEL     | BENING       |
| WILLIAM     | HACKMAN      |
| JON         | CHASE        |
| GENE        | MCKELLEN     |
| LISA        | MONROE       |
| ED          | GUINESS      |
| JEFF        | SILVERSTONE  |
| MATTHEW     | CARREY       |
| DEBBIE      | AKROYD       |
| RUSSELL     | CLOSE        |
| HUMPHREY    | GARLAND      |
| MICHAEL     | BOLGER       |
| JULIA       | ZELLWEGER    |
| RENEE       | BALL         |
| ROCK        | DUKAKIS      |
| CUBA        | BIRCH        |
| AUDREY      | BAILEY       |
| GREGORY     | GOODING      |
| JOHN        | SUVARI       |
| BURT        | TEMPLE       |
| MERYL       | ALLEN        |
| JAYNE       | SILVERSTONE  |
| BELA        | WALKEN       |
| REESE       | WEST         |
| MARY        | KEITEL       |
| JULIA       | FAWCETT      |
| THORA       | TEMPLE       |
+-------------+--------------+
199 rows in set (0.00 sec)

mysql> 

The GROUP BY Clause

mysql> select first_name from actor
    -> where first_name in ('GENE','MERYL');

+------------+
| first_name |
+------------+
| GENE       |
| GENE       |
| MERYL      |
| GENE       |
| MERYL      |
+------------+
5 rows in set (0.00 sec)

mysql> 
mysql> SELECT first_name from actor
    -> where first_name in ('GENE','MERYL')
    -> group by first_name;

+------------+
| first_name |
+------------+
| GENE       |
| MERYL      |
+------------+
2 rows in set (0.00 sec)

mysql> select first_name,last_name,film_id
    -> from actor inner join film_actor using (actor_id)
    -> order by first_name,last_name limit 20;

+------------+-----------+---------+
| first_name | last_name | film_id |
+------------+-----------+---------+
| ADAM       | GRANT     |      26 |
| ADAM       | GRANT     |      52 |
| ADAM       | GRANT     |     233 |
| ADAM       | GRANT     |     317 |
| ADAM       | GRANT     |     359 |
| ADAM       | GRANT     |     362 |
| ADAM       | GRANT     |     385 |
| ADAM       | GRANT     |     399 |
| ADAM       | GRANT     |     450 |
| ADAM       | GRANT     |     532 |
| ADAM       | GRANT     |     560 |
| ADAM       | GRANT     |     574 |
| ADAM       | GRANT     |     638 |
| ADAM       | GRANT     |     773 |
| ADAM       | GRANT     |     833 |
| ADAM       | GRANT     |     874 |
| ADAM       | GRANT     |     918 |
| ADAM       | GRANT     |     956 |
| ADAM       | HOPPER    |      81 |
| ADAM       | HOPPER    |      82 |
+------------+-----------+---------+
20 rows in set (0.00 sec)

mysql> select first_name,last_name,count(film_id) as num_films from 
    -> actor inner join film_actor using (actor_id)
    -> group by first_name,last_name
    -> order by num_films desc limit 5;

+------------+-----------+-----------+
| first_name | last_name | num_films |
+------------+-----------+-----------+
| SUSAN      | DAVIS     |        54 |
| GINA       | DEGENERES |        42 |
| WALTER     | TORN      |        41 |
| MARY       | KEITEL    |        40 |
| MATTHEW    | CARREY    |        39 |
+------------+-----------+-----------+
5 rows in set (0.00 sec)

mysql> 

Aggregate functions

count()

avg()

max()

min()

STD(),STDDEV(),STDDEV_POP()

SUM()

The Having Clause

mysql> select first_name,last_name,count(film_id)
    -> from actor inner join film_actor using (actor_id)
    -> group by actor_id,first_name,last_name
    -> having count(film_id) > 40
    -> order by count(film_id) desc;

+------------+-----------+----------------+
| first_name | last_name | count(film_id) |
+------------+-----------+----------------+
| GINA       | DEGENERES |             42 |
| WALTER     | TORN      |             41 |
+------------+-----------+----------------+
2 rows in set (0.01 sec)

mysql> 
mysql> 
mysql> select title,count(rental_id) as num_rented FROM 
    -> film inner join inventory using (film_id)
    -> inner join rental using (inventory_id)
    -> group by title
    -> having num_rented > 30
    -> order by num_rented desc limit 5;

+---------------------+------------+
| title               | num_rented |
+---------------------+------------+
| BUCKET BROTHERHOOD  |         34 |
| ROCKETEER MOTHER    |         33 |
| JUGGLER HARDLY      |         32 |
| RIDGEMONT SUBMARINE |         32 |
| FORWARD TEMPLE      |         32 |
+---------------------+------------+
5 rows in set (0.02 sec)
mysql> select first_name,last_name,count(film_id) as film_cnt from actor inner join film_actor using (actor_id) group by actor_id,first_name,last_name having first_name = 'EMILY' AND
 last_name = 'DEE'; 

+------------+-----------+----------+
| first_name | last_name | film_cnt |
+------------+-----------+----------+
| EMILY      | DEE       |       14 |
+------------+-----------+----------+
1 row in set (0.01 sec)

mysql> select first_name,last_name,count(film_id) as film_cnt from 
    -> actor inner join film_actor using (actor_id)
    -> where first_name = 'EMILY' and last_name = 'DEE'
    -> group by actor_id,first_name,last_name;

+------------+-----------+----------+
| first_name | last_name | film_cnt |
+------------+-----------+----------+
| EMILY      | DEE       |       14 |
+------------+-----------+----------+
1 row in set (0.00 sec)

mysql> 

Advanced Joins

The inner join 

The keyphrase INNER JOIN can be replaced with JOIN or STRAIGHT JOIN ;They all do the same thing.

mysql> select first_name,last_name,film_id from actor inner join film_actor using(actor_id) limit 20;
+------------+-----------+---------+
| first_name | last_name | film_id |
+------------+-----------+---------+
| PENELOPE   | GUINESS   |       1 |
| PENELOPE   | GUINESS   |      23 |
| PENELOPE   | GUINESS   |      25 |
| PENELOPE   | GUINESS   |     106 |
| PENELOPE   | GUINESS   |     140 |
| PENELOPE   | GUINESS   |     166 |
| PENELOPE   | GUINESS   |     277 |
| PENELOPE   | GUINESS   |     361 |
| PENELOPE   | GUINESS   |     438 |
| PENELOPE   | GUINESS   |     499 |
| PENELOPE   | GUINESS   |     506 |
| PENELOPE   | GUINESS   |     509 |
| PENELOPE   | GUINESS   |     605 |
| PENELOPE   | GUINESS   |     635 |
| PENELOPE   | GUINESS   |     749 |
| PENELOPE   | GUINESS   |     832 |
| PENELOPE   | GUINESS   |     939 |
| PENELOPE   | GUINESS   |     970 |
| PENELOPE   | GUINESS   |     980 |
| NICK       | WAHLBERG  |       3 |
+------------+-----------+---------+
20 rows in set (0.00 sec)

mysql> select first_name,last_name,film_id
    -> from actor,film_actor
    -> where actor.actor_id = film_actor.actor_id
    -> limit 20;

+------------+-----------+---------+
| first_name | last_name | film_id |
+------------+-----------+---------+
| PENELOPE   | GUINESS   |       1 |
| PENELOPE   | GUINESS   |      23 |
| PENELOPE   | GUINESS   |      25 |
| PENELOPE   | GUINESS   |     106 |
| PENELOPE   | GUINESS   |     140 |
| PENELOPE   | GUINESS   |     166 |
| PENELOPE   | GUINESS   |     277 |
| PENELOPE   | GUINESS   |     361 |
| PENELOPE   | GUINESS   |     438 |
| PENELOPE   | GUINESS   |     499 |
| PENELOPE   | GUINESS   |     506 |
| PENELOPE   | GUINESS   |     509 |
| PENELOPE   | GUINESS   |     605 |
| PENELOPE   | GUINESS   |     635 |
| PENELOPE   | GUINESS   |     749 |
| PENELOPE   | GUINESS   |     832 |
| PENELOPE   | GUINESS   |     939 |
| PENELOPE   | GUINESS   |     970 |
| PENELOPE   | GUINESS   |     980 |
| NICK       | WAHLBERG  |       3 |
+------------+-----------+---------+
20 rows in set (0.00 sec)

mysql> select first_name,last_name,film_id from
    -> actor inner join film_actor
    -> on actor.actor_id = film_actor.actor_id
    -> limit 20;

+------------+-----------+---------+
| first_name | last_name | film_id |
+------------+-----------+---------+
| PENELOPE   | GUINESS   |       1 |
| PENELOPE   | GUINESS   |      23 |
| PENELOPE   | GUINESS   |      25 |
| PENELOPE   | GUINESS   |     106 |
| PENELOPE   | GUINESS   |     140 |
| PENELOPE   | GUINESS   |     166 |
| PENELOPE   | GUINESS   |     277 |
| PENELOPE   | GUINESS   |     361 |
| PENELOPE   | GUINESS   |     438 |
| PENELOPE   | GUINESS   |     499 |
| PENELOPE   | GUINESS   |     506 |
| PENELOPE   | GUINESS   |     509 |
| PENELOPE   | GUINESS   |     605 |
| PENELOPE   | GUINESS   |     635 |
| PENELOPE   | GUINESS   |     749 |
| PENELOPE   | GUINESS   |     832 |
| PENELOPE   | GUINESS   |     939 |
| PENELOPE   | GUINESS   |     970 |
| PENELOPE   | GUINESS   |     980 |
| NICK       | WAHLBERG  |       3 |
+------------+-----------+---------+
20 rows in set (0.00 sec)

mysql> 

The Union

The UNION operator has several limitations:

  •  The output is labeled with the names of the columns or expressions from the first query.
  • The queries must output the same number of columns.If you try using different numbers of columns ,MySQL will report an error.
  • All matching columns must have the same type .
  • The result returned are unique,as if you'd applied a distinct to the overall result set.

The Left and Right Joins

 

The Natural Join

mysql> # The Natural Join 
mysql> select first_name,last_name,film_id
    -> from actor_info natural join film_actor
    -> limit 20;

+------------+-----------+---------+
| first_name | last_name | film_id |
+------------+-----------+---------+
| PENELOPE   | GUINESS   |       1 |
| PENELOPE   | GUINESS   |      23 |
| PENELOPE   | GUINESS   |      25 |
| PENELOPE   | GUINESS   |     106 |
| PENELOPE   | GUINESS   |     140 |
| PENELOPE   | GUINESS   |     166 |
| PENELOPE   | GUINESS   |     277 |
| PENELOPE   | GUINESS   |     361 |
| PENELOPE   | GUINESS   |     438 |
| PENELOPE   | GUINESS   |     499 |
| PENELOPE   | GUINESS   |     506 |
| PENELOPE   | GUINESS   |     509 |
| PENELOPE   | GUINESS   |     605 |
| PENELOPE   | GUINESS   |     635 |
| PENELOPE   | GUINESS   |     749 |
| PENELOPE   | GUINESS   |     832 |
| PENELOPE   | GUINESS   |     939 |
| PENELOPE   | GUINESS   |     970 |
| PENELOPE   | GUINESS   |     980 |
| NICK       | WAHLBERG  |       3 |
+------------+-----------+---------+
20 rows in set (0.50 sec)

mysql> select first_name,last_name,film_id from
    -> actor_info join film_actor
    -> where (actor_info.actor_id = film_actor.actor_id)
    -> limit 20;

+------------+-----------+---------+
| first_name | last_name | film_id |
+------------+-----------+---------+
| PENELOPE   | GUINESS   |       1 |
| PENELOPE   | GUINESS   |      23 |
| PENELOPE   | GUINESS   |      25 |
| PENELOPE   | GUINESS   |     106 |
| PENELOPE   | GUINESS   |     140 |
| PENELOPE   | GUINESS   |     166 |
| PENELOPE   | GUINESS   |     277 |
| PENELOPE   | GUINESS   |     361 |
| PENELOPE   | GUINESS   |     438 |
| PENELOPE   | GUINESS   |     499 |
| PENELOPE   | GUINESS   |     506 |
| PENELOPE   | GUINESS   |     509 |
| PENELOPE   | GUINESS   |     605 |
| PENELOPE   | GUINESS   |     635 |
| PENELOPE   | GUINESS   |     749 |
| PENELOPE   | GUINESS   |     832 |
| PENELOPE   | GUINESS   |     939 |
| PENELOPE   | GUINESS   |     970 |
| PENELOPE   | GUINESS   |     980 |
| NICK       | WAHLBERG  |       3 |
+------------+-----------+---------+
20 rows in set (0.49 sec)

mysql> 

 Constant Expressions in Joins

 Nested Queries

Nested Query Basics

The ANY,SOME,ALL,IN ,and NOT IN Clauses

Using ANY and IN

mysql> SELECT emp_no, first_name, last_name, hire_date

          -> FROM employees JOIN titles USING (emp_no)

          -> WHERE title = 'Assistant Engineer'

         -> AND hire_date < ANY (SELECT hire_date FROM

         -> employees JOIN titles USING (emp_no)

         -> WHERE title = 'Manager');

mysql> select hire_date from 
    -> employees join titles using (emp_no)
    -> where title = 'Manager';

 mysql> select emp_no,first_name,last_name
    -> from employees join titles using (emp_no)
    -> where title = 'Manager'
    -> and emp_no = ANY(select emp_no from employees join titles using (emp_no) where title <> 'Manager');

 Using ALL

We can use the alias NOT IN in place of <> ANY or != ANY. 

  Writing row subqueries

mysql> select mgr.emp_no,YEAR(mgr.from_date) as fd
    -> from titles as mgr,titles as other
    -> where mgr.emp_no = other.emp_no
    -> and mgr.title = 'Manager'
    -> and mgr.title <> other.title
    -> and year(mgr.from_date) = Year(other.from_date);

+--------+------+
| emp_no | fd   |
+--------+------+
| 110765 | 1989 |
| 111784 | 1988 |
+--------+------+
2 rows in set (0.15 sec)

mysql> select emp_no,Year(from_date) as fd
    -> from titles where title = 'Manager' and 
    -> (emp_no,year(from_date)) IN
    -> (select emp_no,year(from_date)
    -> from titles where title <> 'Manager');

+--------+------+
| emp_no | fd   |
+--------+------+
| 110765 | 1989 |
| 111784 | 1988 |
+--------+------+
2 rows in set (0.15 sec)

The EXISTS and NOT EXISTS Clauses

EXISTS and NOT EXISTS basics

mysql> select first_name,last_name from staff 
    -> where exists (select * from customer                                        
    -> where customer.first_name = staff.first_name                                                                           
    -> and customer.last_name = staff.last_name);

Empty set (0.00 sec)

mysql> INSERT INTO customer(store_id,first_name,last_name,email,address_id,create_date) values(1,'Mike','Hillyer','Mike.Hillyer@sakilastaff.com',3,now());
Query OK, 1 row affected (0.01 sec)

mysql> select first_name,last_name from staff
    -> where exists (select * from customer
    -> where customer.first_name = staff.first_name
    -> and customer.last_name = staff.last_name);

+------------+-----------+
| first_name | last_name |
+------------+-----------+
| Mike       | Hillyer   |
+------------+-----------+
1 row in set (0.00 sec)

mysql> select count(*) from film where exists
    -> (select film_id from inventory
    -> where inventory.film_id = film.film_id
    -> group by film_id having count(*) >= 2);

+----------+
| count(*) |
+----------+
|      958 |
+----------+
1 row in set (0.01 sec)

mysql> 

Use the In and finds managers who also had some other position:

mysql> select emp_no,first_name,last_name from employees join titles using (emp_no) where title = 'Manager' and emp_no IN (select emp_no from employees join titles using (emp_no) where title <> 'Manager');

 rewritten query:

mysql> select emp_no,first_name,last_name
    -> from employees join titles using (emp_no)
    -> where title = 'Manager'
    -> and exists (select emp_no from titles
    -> where titles.emp_no = employees.emp_no
    -> and title <> 'Manager');

Nested Queries in the FROM Clause

mysql> select emp_no,monthly_salary from 
    -> (select emp_no,salary/12 as monthly_salary from salaries) as ms limit 5;

+--------+----------------+
| emp_no | monthly_salary |
+--------+----------------+
|  10001 |      5009.7500 |
|  10001 |      5175.1667 |
|  10001 |      5506.1667 |
|  10001 |      5549.6667 |
|  10001 |      5580.0833 |
+--------+----------------+
5 rows in set (0.00 sec)

mysql> # derived table must have an alias,even if we don''t use the alias in our query.
mysql> 
mysql> select emp_no,monthly_salary from
    -> (select emp_no,salary/12 as monthly_salary from salaries) limit 5;

ERROR 1248 (42000): Every derived table must have its own alias
mysql> 

User Variables

The following query finds the title of a film and saves the result in a user variable:

mysql> SELECT @film:=title from film where film_id = 1;
+------------------+
| @film:=title     |
+------------------+
| ACADEMY DINOSAUR |
+------------------+
1 row in set (0.00 sec)

mysql> select @film;
+------------------+
| @film            |
+------------------+
| ACADEMY DINOSAUR |
+------------------+
1 row in set (0.00 sec)

mysql> select @film:=title from film where film_id = 1;
+------------------+
| @film:=title     |
+------------------+
| ACADEMY DINOSAUR |
+------------------+
1 row in set (0.00 sec)

mysql> show warnings\G
Empty set (0.02 sec)

mysql> set @film := (select title from film where film_id = 1);
Query OK, 0 rows affected (0.01 sec)

mysql> select @film;
+------------------+
| @film            |
+------------------+
| ACADEMY DINOSAUR |
+------------------+
1 row in set (0.00 sec)

mysql> 

 Second,we can use the SELECT INTO statement:

mysql> select title into @film from film where film_id = 1;
Query OK, 1 row affected (0.00 sec)

mysql> select @film;
+------------------+
| @film            |
+------------------+
| ACADEMY DINOSAUR |
+------------------+
1 row in set (0.00 sec)

mysql> 

You can explicity set a variable using the set statement without a select.Suppose you want to initialize a counter to zero.

mysql> set @counter := 0;
Query OK, 0 rows affected (0.00 sec)

mysql> set @counter = 0,@age := 23;
Query OK, 0 rows affected (0.00 sec)

mysql> select 0 into @counter;
Query OK, 1 row affected (0.00 sec)

mysql> select 0, 23 into @counter,@age;
Query OK, 1 row affected (0.00 sec)

mysql> select max(rental_date) from rental
    -> join customer using (customer_id)
    -> where email = 'WESLEY.BULL@sakilacustomer.org';

+---------------------+
| max(rental_date)    |
+---------------------+
| 2005-08-23 15:46:33 |
+---------------------+
1 row in set (0.00 sec)

mysql> select title from film
    -> join inventory using (film_id)
    -> join rental using (inventory_id)
    -> join customer using (customer_id)
    -> where email = 'WESLEY.BULL@sakilacustomer.org'
    -> and rental_date = '2005-08-23 15:46:33';

+-------------+
| title       |
+-------------+
| KARATE MOON |
+-------------+
1 row in set (0.01 sec)

mysql> select max(rental_date) into @recent from rental
    -> join customer using (customer_id)
    -> where email = 'WESLEY.BULL@sakilacustomer.org';

Query OK, 1 row affected (0.00 sec)

mysql> select title from film
    -> join inventory using (film_id)
    -> join rental using (inventory_id)
    -> join customer using (customer_id)
    -> where email = 'WESLEY.BULL@sakilacustomer.org'
    -> and rental_date = @recent;

+-------------+
| title       |
+-------------+
| KARATE MOON |
+-------------+
1 row in set (0.00 sec)

mysql> 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值