mysql开发者sql权威指南

原文地址:http://www.r20.nl/SQLforMySQL_V1_All_SQL_Statements.txt


Example 4.1:

CREATE USER 'BOOKSQL'@'localhost' IDENTIFIED BY 'BOOKSQLPW'

Example 4.2:

GRANT ALL PRIVILEGES
ON    *.*
TO    'BOOKSQL'@'localhost'
WITH  GRANT OPTION

Example 4.3:

CREATE DATABASE TENNIS

Example 4.4:

USE TENNIS

Example 4.5:

CREATE   TABLE PLAYERS
        (PLAYERNO       INTEGER      NOT NULL,
         NAME           CHAR(15)     NOT NULL,
         INITIALS       CHAR(3)      NOT NULL,
         BIRTH_DATE     DATE                 ,
         SEX            CHAR(1)      NOT NULL,
         JOINED         SMALLINT     NOT NULL,
         STREET         VARCHAR(30)  NOT NULL,
         HOUSENO        CHAR(4)              ,
         POSTCODE       CHAR(6)              ,
         TOWN           VARCHAR(30)  NOT NULL,
         PHONENO        CHAR(13)             ,
         LEAGUENO       CHAR(4)              ,
         PRIMARY KEY    (PLAYERNO)           )
;
CREATE   TABLE TEAMS
        (TEAMNO         INTEGER      NOT NULL,
         PLAYERNO       INTEGER      NOT NULL,
         DIVISION       CHAR(6)      NOT NULL,
         PRIMARY KEY    (TEAMNO)             )
;
CREATE   TABLE MATCHES
        (MATCHNO        INTEGER      NOT NULL,
         TEAMNO         INTEGER      NOT NULL,
         PLAYERNO       INTEGER      NOT NULL,
         WON            SMALLINT     NOT NULL,
         LOST           SMALLINT     NOT NULL,
         PRIMARY KEY    (MATCHNO)            )
;
CREATE   TABLE PENALTIES
        (PAYMENTNO      INTEGER      NOT NULL,
         PLAYERNO       INTEGER      NOT NULL,
         PAYMENT_DATE   DATE         NOT NULL,
         AMOUNT         DECIMAL(7,2) NOT NULL,
         PRIMARY KEY    (PAYMENTNO)          )
;
CREATE   TABLE COMMITTEE_MEMBERS
        (PLAYERNO       INTEGER      NOT NULL,
         BEGIN_DATE     DATE         NOT NULL,
         END_DATE       DATE                 ,
         POSITION       CHAR(20)             ,
         PRIMARY KEY    (PLAYERNO, BEGIN_DATE))

Example 4.6:

INSERT INTO PLAYERS VALUES (
  2, 'Everett', 'R', '1948-09-01', 'M', 1975, 'Stoney Road',
    '43', '3575NH', 'Stratford', '070-237893', '2411')
;
INSERT INTO PLAYERS VALUES (
  6, 'Parmenter', 'R', '1964-06-25', 'M', 1977, 'Haseltine Lane',
    '80', '1234KK', 'Stratford', '070-476537', '8467')
;
INSERT INTO PLAYERS VALUES (
  7, 'Wise', 'GWS', '1963-05-11', 'M', 1981, 'Edgecombe Way',
    '39', '9758VB', 'Stratford', '070-347689', NULL)
;
INSERT INTO PLAYERS VALUES (
  8, 'Newcastle', 'B', '1962-07-08', 'F', 1980, 'Station Road',
    '4', '6584WO', 'Inglewood', '070-458458', '2983')
;
INSERT INTO PLAYERS VALUES (
27, 'Collins', 'DD', '1964-12-28', 'F', 1983, 'Long Drive',
    '804', '8457DK', 'Eltham', '079-234857', '2513')
;
INSERT INTO PLAYERS VALUES (
28, 'Collins', 'C', '1963-06-22', 'F', 1983, 'Old Main Road',
    '10', '1294QK', 'Midhurst', '010-659599', NULL)
;
INSERT INTO PLAYERS VALUES (
39, 'Bishop', 'D', '1956-10-29', 'M', 1980, 'Eaton Square',
    '78', '9629CD', 'Stratford', '070-393435', NULL)
;
INSERT INTO PLAYERS VALUES (
44, 'Baker', 'E', '1963-01-09', 'M', 1980, 'Lewis Street',
    '23', '4444LJ', 'Inglewood', '070-368753', '1124')
;
INSERT INTO PLAYERS VALUES (
57, 'Brown', 'M', '1971-08-17', 'M', 1985, 'Edgecombe Way',
    '16', '4377CB', 'Stratford', '070-473458', '6409')
;
INSERT INTO PLAYERS VALUES (
83, 'Hope', 'PK', '1956-11-11', 'M', 1982, 'Magdalene Road',
    '16A', '1812UP', 'Stratford', '070-353548', '1608')
;
INSERT INTO PLAYERS VALUES (
95, 'Miller', 'P', '1963-05-14', 'M', 1972, 'High Street',
    '33A', '5746OP', 'Douglas', '070-867564', NULL)
;
INSERT INTO PLAYERS VALUES (
100, 'Parmenter', 'P', '1963-02-28', 'M', 1979, 'Haseltine Lane',
    '80', '6494SG', 'Stratford', '070-494593', '6524')
;
INSERT INTO PLAYERS VALUES (
104, 'Moorman', 'D', '1970-05-10', 'F', 1984, 'Stout Street',
    '65', '9437AO', 'Eltham', '079-987571', '7060')
;
INSERT INTO PLAYERS VALUES (
112, 'Bailey', 'IP', '1963-10-01', 'F', 1984, 'Vixen Road',
    '8', '6392LK', 'Plymouth', '010-548745', '1319')
;
INSERT INTO TEAMS VALUES (1,  6, 'first')
;
INSERT INTO TEAMS VALUES (2, 27, 'second')
;
INSERT INTO MATCHES VALUES ( 1, 1,   6, 3, 1)
;
INSERT INTO MATCHES VALUES ( 2, 1,   6, 2, 3)
;
INSERT INTO MATCHES VALUES ( 3, 1,   6, 3, 0)
;
INSERT INTO MATCHES VALUES ( 4, 1,  44, 3, 2)
;
INSERT INTO MATCHES VALUES ( 5, 1,  83, 0, 3)
;
INSERT INTO MATCHES VALUES ( 6, 1,   2, 1, 3)
;
INSERT INTO MATCHES VALUES ( 7, 1,  57, 3, 0)
;
INSERT INTO MATCHES VALUES ( 8, 1,   8, 0, 3)
;
INSERT INTO MATCHES VALUES ( 9, 2,  27, 3, 2)
;
INSERT INTO MATCHES VALUES (10, 2, 104, 3, 2)
;
INSERT INTO MATCHES VALUES (11, 2, 112, 2, 3)
;
INSERT INTO MATCHES VALUES (12, 2, 112, 1, 3)
;
INSERT INTO MATCHES VALUES (13, 2,   8, 0, 3)
;
INSERT INTO PENALTIES VALUES (1,  6, '1980-12-08',100)
;
INSERT INTO PENALTIES VALUES (2, 44, '1981-05-05', 75)
;
INSERT INTO PENALTIES VALUES (3, 27, '1983-09-10',100)
;
INSERT INTO PENALTIES VALUES (4,104, '1984-12-08', 50)
;
INSERT INTO PENALTIES VALUES (5, 44, '1980-12-08', 25)
;
INSERT INTO PENALTIES VALUES (6,  8, '1980-12-08', 25)
;
INSERT INTO PENALTIES VALUES (7, 44, '1982-12-30', 30)
;
INSERT INTO PENALTIES VALUES (8, 27, '1984-11-12', 75)
;
INSERT INTO COMMITTEE_MEMBERS VALUES (  6, '1990-01-01', '1990-12-31', 'Secretary')
;
INSERT INTO COMMITTEE_MEMBERS VALUES (  6, '1991-01-01', '1992-12-31', 'Member')
;
INSERT INTO COMMITTEE_MEMBERS VALUES (  6, '1992-01-01', '1993-12-31', 'Treasurer')
;
INSERT INTO COMMITTEE_MEMBERS VALUES (  6, '1993-01-01',  NULL, 'Chairman')
;
INSERT INTO COMMITTEE_MEMBERS VALUES (  2, '1990-01-01', '1992-12-31', 'Chairman')
;
INSERT INTO COMMITTEE_MEMBERS VALUES (  2, '1994-01-01',  NULL, 'Member')
;
INSERT INTO COMMITTEE_MEMBERS VALUES (112, '1992-01-01', '1992-12-31', 'Member')
;
INSERT INTO COMMITTEE_MEMBERS VALUES (112, '1994-01-01',  NULL, 'Secretary')
;
INSERT INTO COMMITTEE_MEMBERS VALUES (  8, '1990-01-01', '1990-12-31', 'Treasurer')
;
INSERT INTO COMMITTEE_MEMBERS VALUES (  8, '1991-01-01', '1991-12-31', 'Secretary')
;
INSERT INTO COMMITTEE_MEMBERS VALUES (  8, '1993-01-01', '1993-12-31', 'Member')
;
INSERT INTO COMMITTEE_MEMBERS VALUES (  8, '1994-01-01',  NULL, 'Member')
;
INSERT INTO COMMITTEE_MEMBERS VALUES ( 57, '1992-01-01', '1992-12-31', 'Secretary')
;
INSERT INTO COMMITTEE_MEMBERS VALUES ( 27, '1990-01-01', '1990-12-31', 'Member')
;
INSERT INTO COMMITTEE_MEMBERS VALUES ( 27, '1991-01-01', '1991-12-31', 'Treasurer')
;
INSERT INTO COMMITTEE_MEMBERS VALUES ( 27, '1993-01-01', '1993-12-31', 'Treasurer')
;
INSERT INTO COMMITTEE_MEMBERS VALUES ( 95, '1994-01-01',  NULL, 'Treasurer')

Example 4.7:

SELECT   PLAYERNO, NAME, BIRTH_DATE
FROM     PLAYERS
WHERE    TOWN = 'Stratford'
ORDER BY NAME

Example 4.8:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    JOINED > 1980
AND      TOWN = 'Stratford'
ORDER BY PLAYERNO

Example 4.9:

SELECT   *
FROM     PENALTIES

Example 4.10:

SELECT   33 * 121

Example 4.11:

UPDATE   PENALTIES
SET      AMOUNT = 200
WHERE    PLAYERNO = 44
;
SELECT   PLAYERNO, AMOUNT
FROM     PENALTIES
WHERE    PLAYERNO = 44

Example 4.12:

DELETE
FROM     PENALTIES
WHERE    AMOUNT > 100

Example 4.13:

CREATE   INDEX PENALTIES_AMOUNT ON
         PENALTIES (AMOUNT)

Example 4.14:

CREATE   VIEW NUMBER_SETS (MATCHNO, DIFFERENCE) AS
SELECT   MATCHNO, ABS(WON - LOST)
FROM     MATCHES
;
SELECT   *
FROM     NUMBER_SETS

Example 4.15:

GRANT   SELECT
ON      PLAYERS
TO      DIANE
;
GRANT   SELECT, UPDATE
ON      PLAYERS
TO      PAUL
;
GRANT   SELECT, UPDATE
ON      TEAMS
TO      PAUL
;
SELECT   *
FROM     TEAMS

Example 4.16:

DROP TABLE MATCHES

Example 4.17:

DROP VIEW NUMBER_SETS

Example 4.18:

DROP INDEX PENALTIES_AMOUNT

Example 4.19:

DROP DATABASE TENNIS

Example 4.20:

SELECT @@VERSION

Example 4.21:

SET @@SQL_MODE = 'PIPES_AS_CONCAT'

Example 4.22:

SET @@SQL_MODE = CONCAT(@@SQL_MODE,
                 CASE @@SQL_MODE WHEN '' THEN '' ELSE ',' END,
                 'NO_ZERO_IN_DATE')

Example 4.23:

CREATE   OR REPLACE VIEW USERS
        (USER_NAME) AS
SELECT   DISTINCT UPPER(CONCAT('''',USER,'''@''',HOST,''''))
FROM     MYSQL.USER
;
CREATE   OR REPLACE VIEW TABLES
        (TABLE_CREATOR, TABLE_NAME,
         CREATE_TIMESTAMP, COMMENT) AS
SELECT   UPPER(TABLE_SCHEMA), UPPER(TABLE_NAME),
         CREATE_TIME, TABLE_COMMENT
FROM     INFORMATION_SCHEMA.TABLES
WHERE    TABLE_TYPE IN ('BASE TABLE','TEMPORARY')
;
CREATE   OR REPLACE VIEW COLUMNS
        (TABLE_CREATOR, TABLE_NAME, COLUMN_NAME,
         COLUMN_NO, DATA_TYPE, CHAR_LENGTH,
        `PRECISION`, SCALE, NULLABLE, COMMENT) AS
SELECT   UPPER(TABLE_SCHEMA), UPPER(TABLE_NAME),
         UPPER(COLUMN_NAME), ORDINAL_POSITION,
         UPPER(DATA_TYPE), CHARACTER_MAXIMUM_LENGTH,
         NUMERIC_PRECISION, NUMERIC_SCALE, IS_NULLABLE,
         COLUMN_COMMENT
FROM     INFORMATION_SCHEMA.COLUMNS
;
CREATE   OR REPLACE VIEW VIEWS
        (VIEW_CREATOR, VIEW_NAME, CREATE_TIMESTAMP,
         WITHCHECKOPT, IS_UPDATABLE, VIEWFORMULA, COMMENT) AS
SELECT   UPPER(V.TABLE_SCHEMA), UPPER(V.TABLE_NAME),
         T.CREATE_TIME,
         CASE
            WHEN V.CHECK_OPTION = 'None' THEN 'NO'
            WHEN V.CHECK_OPTION = 'Cascaded' THEN 'CASCADED'
            WHEN V.CHECK_OPTION = 'Local' THEN 'LOCAL'
            ELSE 'Yes'
         END, V.IS_UPDATABLE, V.VIEW_DEFINITION, T.TABLE_COMMENT
FROM     INFORMATION_SCHEMA.VIEWS AS V,
         INFORMATION_SCHEMA.TABLES AS T
WHERE    V.TABLE_NAME = T.TABLE_NAME
AND      V.TABLE_SCHEMA = T.TABLE_SCHEMA
;
CREATE   OR REPLACE VIEW INDEXES
        (INDEX_CREATOR, INDEX_NAME, CREATE_TIMESTAMP,
         TABLE_CREATOR, TABLE_NAME, UNIQUE_ID, INDEX_TYPE) AS
SELECT   DISTINCT UPPER(I.INDEX_SCHEMA), UPPER(I.INDEX_NAME),
         T.CREATE_TIME, UPPER(I.TABLE_SCHEMA),
         UPPER(I.TABLE_NAME),
         CASE
            WHEN I.NON_UNIQUE = 0 THEN 'YES'
            ELSE 'NO'
         END,
         I.INDEX_TYPE
FROM     INFORMATION_SCHEMA.STATISTICS AS I,
         INFORMATION_SCHEMA.TABLES AS T
WHERE    I.TABLE_NAME = T.TABLE_NAME
AND      I.TABLE_SCHEMA = T.TABLE_SCHEMA
;
CREATE   OR REPLACE VIEW COLUMNS_IN_INDEX
        (INDEX_CREATOR, INDEX_NAME,
         TABLE_CREATOR, TABLE_NAME, COLUMN_NAME,
         COLUMN_SEQ, ORDERING) AS
SELECT   UPPER(INDEX_SCHEMA), UPPER(INDEX_NAME),
         UPPER(TABLE_SCHEMA), UPPER(TABLE_NAME),
         UPPER(COLUMN_NAME), SEQ_IN_INDEX,
         CASE
            WHEN COLLATION = 'A' THEN 'ASCENDING'
            WHEN COLLATION = 'D' THEN 'DESCENDING'
            ELSE 'OTHER'
         END
FROM     INFORMATION_SCHEMA.STATISTICS
;
CREATE   OR REPLACE VIEW USER_AUTHS
        (GRANTOR, GRANTEE, PRIVILEGE, WITHGRANTOPT) AS
SELECT   'UNKNOWN', UPPER(GRANTEE), PRIVILEGE_TYPE, IS_GRANTABLE
FROM     INFORMATION_SCHEMA.USER_PRIVILEGES
;
CREATE   OR REPLACE VIEW DATABASE_AUTHS
        (GRANTOR, GRANTEE, DATABASE_NAME, PRIVILEGE,
         WITHGRANTOPT) AS
SELECT   'UNKNOWN', UPPER(GRANTEE), UPPER(TABLE_SCHEMA),
         PRIVILEGE_TYPE, IS_GRANTABLE
FROM     INFORMATION_SCHEMA.SCHEMA_PRIVILEGES
;
CREATE   OR REPLACE VIEW TABLE_AUTHS
        (GRANTOR, GRANTEE, TABLE_CREATOR, TABLE_NAME,
         PRIVILEGE, WITHGRANTOPT) AS
SELECT   'UNKNOWN', UPPER(GRANTEE), UPPER(TABLE_SCHEMA),
         UPPER(TABLE_NAME), PRIVILEGE_TYPE, IS_GRANTABLE
FROM     INFORMATION_SCHEMA.TABLE_PRIVILEGES
;
CREATE   OR REPLACE VIEW COLUMN_AUTHS
        (GRANTOR, GRANTEE, TABLE_CREATOR, TABLE_NAME,
         COLUMN_NAME, PRIVILEGE, WITHGRANTOPT) AS
SELECT   'UNKNOWN', UPPER(GRANTEE), UPPER(TABLE_SCHEMA),
         UPPER(TABLE_NAME), UPPER(COLUMN_NAME),
         PRIVILEGE_TYPE, IS_GRANTABLE
FROM     INFORMATION_SCHEMA.COLUMN_PRIVILEGES

Example 4.24:

SELECT   COLUMN_NAME, DATA_TYPE, COLUMN_NO
FROM     COLUMNS
WHERE    TABLE_NAME = 'PLAYERS'
AND      TABLE_CREATOR = 'TENNIS'
ORDER BY COLUMN_NO

Example 4.25:

SELECT   INDEX_NAME
FROM     INDEXES
WHERE    TABLE_NAME = 'PENALTIES'
AND      TABLE_CREATOR = 'TENNIS'

Example 4.26:

USE INFORMATION_SCHEMA
;
SELECT   DISTINCT INDEX_NAME
FROM     STATISTICS
WHERE    TABLE_NAME = 'PENALTIES'

Example 4.27:

SELECT   TABLE_NAME
FROM     TABLES
WHERE    TABLE_SCHEMA = 'INFORMATION_SCHEMA'
ORDER BY TABLE_NAME

Example 4.28:

SHOW COLUMNS FROM PLAYERS

Example 4.29:

SHOW INDEX FROM PENALTIES
;
SHOW DATABASES
;
SHOW TABLES
;
SHOW CREATE TABLE PLAYERS
;
SHOW INDEX FROM PLAYERS
;
SHOW GRANTS FOR BOOKSQL@localhost
;
SHOW PRIVILEGES

Example 4.30:

SELECT 10 / 0

Example 5.1:

CREATE TABLE INCORRECT_DATES (COLUMN1 DATE)
;
INSERT INTO INCORRECT_DATES VALUES ('2004-13-12')
;
SELECT   COLUMN1
FROM     INCORRECT_DATES
;
CREATE TABLE TIME_TABLE (COLUMN1 TIME)
;
INSERT INTO TIME_TABLE VALUES ('23:59:59.5912')
;
SELECT COLUMN1 FROM TIME_TABLE

Example 5.2:

CREATE TABLE TZ (COL1 TIMESTAMP)
;
INSERT INTO TZ VALUES ('2005-01-01 12:00:00')
;
SELECT * FROM TZ
;
SET @@TIME_ZONE = '+10:00'
;
SELECT * FROM TZ

Example 5.3:

SELECT @@TIME_ZONE

Example 5.4:

SELECT TRUE, FALSE

Example 5.5:

SELECT   MATCHNO, WON - LOST
FROM     MATCHES
WHERE    WON = LOST + 2

Example 5.6:

SELECT   TEAMNO, DIVISION
FROM     TEAMS

Example 5.7:

SELECT   TEAMNO AS TEAM_NUMBER, DIVISION AS DIVISION_OF_TEAM
FROM     TEAMS

Example 5.8:

SELECT   PAYMENTNO, AMOUNT * 100 AS CENTS
FROM     PENALTIES

Example 5.9:

SELECT   MATCHNO AS PRIMKEY,
         80 AS EIGHTY,
         WON - LOST AS DIFFERENCE,
         TIME('23:59:59') AS ALMOST_MIDNIGHT,
         'TEXT' AS TEXT
FROM     MATCHES
WHERE    MATCHNO <= 4

Example 5.10:

SELECT   PAYMENTNO, AMOUNT * 100 AS CENTS
FROM     PENALTIES
GROUP BY CENTS
ORDER BY CENTS

Example 5.11:

SET @PLAYERNO = 7

Example 5.12:

SELECT   NAME, TOWN, POSTCODE
FROM     PLAYERS
WHERE    PLAYERNO < @PLAYERNO

Example 5.13:

SELECT   @PLAYERNO

Example 5.14:

SET @@GLOBAL.SQL_WARNINGS = TRUE

Example 5.15:

SET @@SESSION.DATETIME_FORMAT = '%D-%m-%Y %H:%i:%s'
;
SELECT @@SESSION.DATETIME_FORMAT
;
SELECT @@GLOBAL.DATETIME_FORMAT

Example 5.16:

SET @@SESSION.DATETIME_FORMAT = DEFAULT

Example 5.17:

SELECT   *
FROM     USER_AUTHS
WHERE    GRANTEE = CURRENT_USER

Example 5.18:

SELECT   CURRENT_USER

Example 5.19:

SELECT   *
FROM     PENALTIES
WHERE    PAYMENT_DATE = CURRENT_DATE

Example 5.20:

SELECT   PLAYERNO,
         CASE SEX
            WHEN 'F' THEN 'Female'
            ELSE 'Male' END AS SEX,
         NAME
FROM     PLAYERS
WHERE    JOINED > 1980
;
SELECT   PLAYERNO,
         CASE SEX
            WHEN 'F' THEN 'Female' END AS FEMALES,
         NAME
FROM     PLAYERS
WHERE    JOINED > 1980

Example 5.21:

SELECT   PLAYERNO, TOWN, BIRTH_DATE,
         CASE TOWN
            WHEN 'Stratford' THEN 0
            WHEN 'Plymouth'  THEN 1
            WHEN 'Inglewood' THEN 2
            ELSE 3
         END AS P,
         CASE TOWN
            WHEN 'Stratford' THEN
               CASE BIRTH_DATE
                  WHEN '1948-09-01' THEN 'Old Stratforder'
                  ELSE 'Young Stratforder' END
            WHEN 'Inglewood' THEN
               CASE BIRTH_DATE
                  WHEN '1962-07-08' THEN 'Old Inglewooder'
                  ELSE 'Young Inglewooder' END
            ELSE 'Rest'
         END AS TYPE
FROM     PLAYERS

Example 5.22:

SELECT   PLAYERNO, JOINED,
         CASE
            WHEN JOINED < 1980 THEN 'Seniors'
            WHEN JOINED < 1983 THEN 'Juniors'
            ELSE 'Children' END AS AGE_GROUP
FROM     PLAYERS
ORDER BY JOINED

Example 5.23:

SELECT   PLAYERNO, JOINED, TOWN,
         CASE
            WHEN JOINED >= 1980 AND JOINED <= 1982
               THEN 'Seniors'
            WHEN TOWN = 'Eltham'
               THEN 'Elthammers'
            WHEN PLAYERNO < 10
               THEN 'First members'
            ELSE 'Rest' END
FROM     PLAYERS

Example 5.24:

SELECT   (PLAYERNO), (((NAME)))
FROM     PLAYERS

Example 5.25:

SELECT   PAYMENTNO, YEAR(PAYMENT_DATE)
FROM     PENALTIES
WHERE    YEAR(PAYMENT_DATE) > 1980

Example 5.26:

SELECT   PLAYERNO, CONCAT(LEFT(INITIALS, 1), '. ', NAME)
         AS FULL_NAME
FROM     PLAYERS
WHERE    LEFT(NAME, 1) = 'B'

Example 5.27:

SELECT   INITIALS, NAME, COALESCE(LEAGUENO, 1)
FROM     PLAYERS
WHERE    Town = 'Stratford'

Example 5.28:

SELECT   PLAYERNO, DAYNAME(BIRTH_DATE),
         MONTHNAME(BIRTH_DATE), DAYOFYEAR(BIRTH_DATE)
FROM     PLAYERS
WHERE    PLAYERNO < 10

Example 5.29:

SELECT   PLAYERNO, BIRTH_DATE,
         ADDDATE(BIRTH_DATE, INTERVAL 7 DAY)
FROM     PLAYERS
WHERE    DAYNAME(BIRTH_DATE) = 'Saturday'

Example 5.30:

SELECT   PLAYERNO, BEGIN_DATE, END_DATE,
         DATEDIFF(END_DATE, BEGIN_DATE)
FROM     COMMITTEE_MEMBERS
WHERE    DATEDIFF(END_DATE, BEGIN_DATE) > 500
OR      (END_DATE IS NULL AND
         DATEDIFF(CURRENT_DATE, BEGIN_DATE) > 500)
ORDER BY PLAYERNO
;
SELECT   PLAYERNO, BEGIN_DATE, END_DATE,
         DATEDIFF(COALESCE(END_DATE, CURRENT_DATE),
         BEGIN_DATE)
FROM     COMMITTEE_MEMBERS
WHERE    DATEDIFF(COALESCE(END_DATE, CURRENT_DATE),
         BEGIN_DATE)
         > 500
ORDER BY PLAYERNO

Example 5.31:

SELECT   PAYMENTNO
FROM     PENALTIES
WHERE    AMOUNT > 50

Example 5.32:

SELECT   CONCAT(RTRIM(NAME), CAST(BIRTH_DATE AS CHAR(10)))
FROM     PLAYERS
WHERE    TOWN = 'Inglewood'

Example 5.33:

UPDATE   PLAYERS
SET      LEAGUENO = NULL
WHERE    PLAYERNO = 2

Example 5.34:

SELECT   TEAMNO, CAST(NULL AS CHAR)
FROM     TEAMS

Example 5.35:

SELECT   MATCHNO, WON, LOST
FROM     MATCHES
WHERE    WON >= LOST * 2

Example 5.36:

SELECT 50 << 2

Example 5.37:

SELECT B'11' << 3

Example 5.38:

SELECT CONV(6,10,2), CONV(10,10,2), BIN(8), BIN(10)

Example 5.39:

SELECT CONV(1001,2,10), CONV(111,2,10)

Example 5.40:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    PLAYERNO & 1

Example 5.41:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    PLAYERNO = (PLAYERNO >> 1) << 1

Example 5.42:

SELECT   MATCHNO, TEAMNO, MATCHNO | TEAMNO,
         MATCHNO & TEAMNO, MATCHNO ^ TEAMNO
FROM     MATCHES

Example 5.43:

SELECT   PLAYERNO, TOWN || ' ' || STREET || ' ' || HOUSENO
FROM     PLAYERS
WHERE    TOWN = 'Stratford'

Example 5.44:

SELECT   PAYMENTNO, PAYMENT_DATE, PAYMENT_DATE + INTERVAL 7 DAY
FROM     PENALTIES
WHERE    PAYMENTNO > 5

Example 5.45:

SELECT   PAYMENTNO, PAYMENT_DATE
FROM     PENALTIES
WHERE    PAYMENT_DATE >= '1982-12-25'
AND      PAYMENT_DATE <= '1982-12-25' + INTERVAL 6 DAY

Example 5.46:

SELECT '2004-13-12' + INTERVAL 1 DAY
;
SHOW WARNINGS

Example 5.47:

CREATE   TABLE MATCHES_SPECIAL
        (MATCHNO         INTEGER NOT NULL,
         TEAMNO          INTEGER NOT NULL,
         PLAYERNO        INTEGER NOT NULL,
         WON             SMALLINT NOT NULL,
         LOST            SMALLINT NOT NULL,
         START_DATE      DATE NOT NULL,
         START_TIME      TIME NOT NULL,
         END_TIME        TIME NOT NULL,
         PRIMARY KEY     (MATCHNO))
;
INSERT INTO MATCHES_SPECIAL VALUES
   (1, 1, 6, 3, 1, '2004-10-25', '14:10:12', '16:50:09')
;
INSERT INTO MATCHES_SPECIAL VALUES
   (2, 1, 44, 3, 2, '2004-10-25', '17:00:00', '17:55:48')

Example 5.48:

SELECT   MATCHNO, START_TIME,
         ADDTIME(START_TIME, '08:00:00')
FROM     MATCHES_SPECIAL

Example 5.49:

SELECT   MATCHNO, END_TIME
FROM     MATCHES_SPECIAL
WHERE    ADDTIME(END_TIME, '06:30:00') <= '24:00:00'

Example 5.50:

CREATE TABLE TSTAMP (COL1 TIMESTAMP)
;
SET @TIME = TIMESTAMP('1980-12-08 23:59:59.59')
;
INSERT INTO TSTAMP VALUES (@TIME + INTERVAL 3 MICROSECOND)
;
SELECT COL1, COL1 + INTERVAL 3 MICROSECOND FROM TSTAMP

Example 5.51:

SELECT   TEAMNO
FROM     TEAMS
WHERE    TRUE OR FALSE

Example 5.52:

SELECT   PAYMENTNO, PAYMENTNO > 4
FROM     PENALTIES
;
SELECT   PAYMENTNO, CASE PAYMENTNO > 4
                         WHEN 1 THEN 'Greater than 4'
                         ELSE 'Less than 5'
                      END AS GREATER_LESS
FROM     PENALTIES

Example 5.53:

SELECT   PLAYERNO, JOINED, PLAYERNO < 15, JOINED > 1979
FROM     PLAYERS
WHERE    (PLAYERNO < 15) = (JOINED > 1979)

Example 5.54:

INSERT   INTO COMMITTEE_MEMBERS
VALUES   (7 + 15, CURRENT_DATE,
          CURRENT_DATE + INTERVAL 17 DAY, 'Member')

Example 5.55:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    (TOWN, STREET) = ('Stratford', 'Haseltine Lane')

Example 5.56:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    (TOWN, STREET) = (SELECT 'Stratford', 'Haseltine Lane')

Example 5.57:

INSERT INTO PENALTIES VALUES
   (1,   6, '1980-12-08', 100),
   (2,  44, '1981-05-05',  75),
   (3,  27, '1983-09-10', 100),
   (4, 104, '1984-12-08',  50),
   (5,  44, '1980-12-08',  25),
   (6,   8, '1980-12-08',  25),
   (7,  44, '1982-12-30',  30),
   (8,  27, '1984-11-12',  75)

Answer 5.6:

SELECT   PLAYERS.PLAYERNO, PLAYERS.NAME,
         PLAYERS.INITIALS
FROM     PLAYERS
WHERE    PLAYERS.PLAYERNO > 6
ORDER BY PLAYERS.NAME

Answer 5.12:

SELECT   PLAYERNO
FROM     COMMITTEE_MEMBERS
WHERE    BEGIN_DATE = CURRENT_DATE

Answer 5.13:

SELECT   TEAMNO,
         CASE DIVISION
            WHEN 'first' then 'first division'
            WHEN 'second' THEN 'second division'
            ELSE 'unknown' END AS DIVISION
FROM     TEAMS

Answer 5.14:

SELECT   PAYMENTNO, AMOUNT,
         CASE
            WHEN AMOUNT >= 0 AND AMOUNT <= 40
               THEN 'low'
            WHEN AMOUNT >= 41 AND AMOUNT <= 80
               THEN 'moderate'
            WHEN AMOUNT >= 81
               THEN 'high'
            ELSE 'incorrect' END AS CATEGORY
FROM     PENALTIES

Answer 5.15:

SELECT   PAYMENTNO, AMOUNT
FROM     PENALTIES
WHERE    CASE
            WHEN AMOUNT >= 0 AND AMOUNT <= 40
               THEN 'low'
            WHEN AMOUNT > 40 AND AMOUNT <= 80
               THEN 'moderate'
            WHEN AMOUNT > 80
               THEN 'high'
            ELSE 'incorrect' END = 'low'

Answer 5.17:

SELECT   PAYMENTNO
FROM     PENALTIES
WHERE    DAYNAME(PAYMENT_DATE) = 'Monday'

Answer 5.18:

SELECT   PAYMENTNO
FROM     PENALTIES
WHERE    YEAR(PAYMENT_DATE) = 1984

Answer 5.25:

SELECT  PLAYERNO, SUBSTR(INITIALS,1,1) || '. ' || NAME
FROM    PLAYERS

Answer 5.26:

SELECT  TEAMNO, RTRIM(DIVISION) || ' division'
FROM    TEAMS

Answer 5.28:

SELECT   PLAYERNO, BEGIN_DATE,
         BEGIN_DATE + INTERVAL 2 MONTH + INTERVAL 3 DAY
FROM     COMMITTEE_MEMBERS

Answer 5.32:

SELECT   PAYMENTNO, PAYMENT_DATE,
         PAYMENT_DATE + INTERVAL 3 HOUR +
         INTERVAL 50 SECOND + INTERVAL 99 MICROSECOND
FROM     PENALTIES

Answer 5.33:

SELECT   PLAYERNO,
         CASE TOWN='Inglewood'
            WHEN 1 THEN 'Yes' ELSE 'No' END
FROM     PLAYERS

Answer 5.34:

SELECT   *
FROM     PENALTIES
WHERE    (AMOUNT = 25) = (PLAYERNO = 44)

Answer 5.35:

SELECT   PAYMENTNO
FROM     PENALTIES
WHERE    (AMOUNT, PLAYERNO, PAYMENT_DATE) =
         (25, 44, '1980-12-08')

Answer 5.36:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    (NAME, INITIALS) = (TOWN, STREET)

Answer 5.37:

SELECT   *
FROM     PENALTIES
WHERE    (AMOUNT = 25, PLAYERNO = 44) = (FALSE, TRUE)

Example 6.1:

SELECT   PLAYERNO
FROM     PENALTIES
WHERE    AMOUNT > 25
GROUP BY PLAYERNO
HAVING   COUNT(*) > 1
ORDER BY PLAYERNO

Example 6.2:

SELECT   PLAYERNO, LEAGUENO
FROM     PLAYERS
WHERE    TOWN = 'Stratford'
ORDER BY LEAGUENO

Example 6.3:

SELECT   89 * 73

Example 6.4:

(SELECT   *
FROM     TEAMS)
;
(((((SELECT   *
     FROM     TEAMS)))))

Example 6.5:

SELECT   PLAYERNO
FROM     TEAMS
UNION
SELECT   PLAYERNO
FROM     PENALTIES
;
SELECT   PLAYERNO
FROM     TEAMS
ORDER BY PLAYERNO
UNION
SELECT   PLAYERNO
FROM     PENALTIES
;
SELECT   PLAYERNO
FROM     TEAMS
UNION
SELECT   PLAYERNO
FROM     PENALTIES
ORDER BY PLAYERNO
;
(SELECT   PLAYERNO
FROM     TEAMS
ORDER BY PLAYERNO)
UNION
(SELECT   PLAYERNO
FROM     PENALTIES)
ORDER BY PLAYERNO

Example 6.6:

SELECT   PLAYERNO
FROM    (SELECT   PLAYERNO, SEX
         FROM     PLAYERS
         WHERE    PLAYERNO < 10) AS PLAYERS10
WHERE    SEX = 'M'
;
SELECT  *
FROM   (SELECT  *
        FROM   (SELECT  *
                FROM   (SELECT  *
                        FROM    PLAYERS) AS S1) AS S2) AS S3

Example 6.7:

SELECT   PLAYERNO
FROM    (SELECT   PLAYERNO, SEX
         FROM    (SELECT   PLAYERNO, SEX, JOINED
                  FROM    (SELECT   PLAYERNO, SEX, JOINED
                           FROM     PLAYERS
                           WHERE    PLAYERNO > 10) AS GREATER10
                  WHERE    PLAYERNO < 100) AS LESS100
         WHERE    JOINED > 1980) AS JOINED1980
WHERE    SEX = 'M'

Example 6.8:

SELECT   PLAYERNO, JOINED -
                  (SELECT   JOINED
                   FROM     PLAYERS
                   WHERE    PLAYERNO = 100)
FROM     PLAYERS
WHERE    PLAYERNO < 60
;
SELECT   PLAYERNO, JOINED - 1979
FROM     PLAYERS
WHERE    PLAYERNO < 60
;
SELECT   TEAMNO
FROM     TEAMS
WHERE    PLAYERNO =
        (SELECT   PLAYERNO
         FROM     PLAYERS)

Example 6.9:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    YEAR(BIRTH_DATE) = (SELECT   YEAR(BIRTH_DATE)
                             FROM     PLAYERS
                             WHERE    PLAYERNO = 27)
;
SELECT   PLAYERNO
FROM     PLAYERS
WHERE    YEAR(BIRTH_DATE) = 1964

Example 6.10:

SELECT   (SELECT   BIRTH_DATE
          FROM     PLAYERS
          WHERE    PLAYERNO = 27),
         (SELECT   BIRTH_DATE
          FROM     PLAYERS
          WHERE    PLAYERNO = 44),
         (SELECT   BIRTH_DATE
          FROM     PLAYERS
          WHERE    PLAYERNO = 100)

Example 6.11:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE   (SEX, TOWN) = (SELECT   SEX, TOWN
                       FROM     PLAYERS
                       WHERE    PLAYERNO = 100)

Answer 6.8:

SELECT   PLAYERNO, BEGIN_DATE
FROM     COMMITTEE_MEMBERS
UNION
SELECT   PLAYERNO, END_DATE
FROM     COMMITTEE_MEMBERS
ORDER BY PLAYERNO

Answer 6.9:

SELECT   PLAYERNO, BEGIN_DATE, 'Begin date'
FROM     COMMITTEE_MEMBERS
UNION
SELECT   PLAYERNO, END_DATE, 'End date'
FROM     COMMITTEE_MEMBERS
ORDER BY PLAYERNO

Answer 6.10:

SELECT  PLAYERNO
FROM   (SELECT  PLAYERNO
        FROM   (SELECT  PLAYERNO, END_DATE
                FROM   (SELECT  PLAYERNO, BEGIN_DATE,
                                END_DATE
                        FROM    COMMITTEE_MEMBERS
                        WHERE   POSITION = 'Secretary')
                        AS SECRETARIES
                WHERE   BEGIN_DATE >= '1990-01-01')
                AS AFTER1989
        WHERE   END_DATE <= '1994-12-31') AS BEFORE1995

Answer 6.11:

SELECT   TEAMNO
FROM     TEAMS
WHERE    PLAYERNO =
        (SELECT   PLAYERNO
         FROM     PLAYERS
         WHERE    NAME = 'Parmenter'
         AND      INITIALS = 'R')

Answer 6.12:

SELECT   TEAMNO
FROM     TEAMS
WHERE    PLAYERNO =
        (SELECT   PLAYERNO
         FROM     PLAYERS
         WHERE    NAME =
                 (SELECT   NAME
                  FROM     PLAYERS
                  WHERE    PLAYERNO = 6)
         AND      PLAYERNO <> 6)
;
SELECT   NAME
FROM     PLAYERS
WHERE    PLAYERNO =
        (SELECT   PLAYERNO
         FROM     TEAMS
         WHERE    TEAMNO =
                 (SELECT   TEAMNO
                  FROM     MATCHES
                  WHERE    MATCHNO = 6))

Answer 6.13:

SELECT   PAYMENTNO
FROM     PENALTIES
WHERE    AMOUNT >
        (SELECT   AMOUNT
         FROM     PENALTIES
         WHERE    PAYMENTNO = 4)

Answer 6.14:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    DAYNAME(BIRTH_DATE) =
        (SELECT   DAYNAME(BIRTH_DATE)
         FROM     PLAYERS
         WHERE    PLAYERNO = 2)

Answer 6.15:

SELECT   PLAYERNO
FROM     COMMITTEE_MEMBERS
WHERE   (BEGIN_DATE, END_DATE) =
        (SELECT   BEGIN_DATE, END_DATE
         FROM     COMMITTEE_MEMBERS
         WHERE    PLAYERNO = 8
         AND      POSITION = 'Treasurer')
AND      PLAYERNO <> 8

Answer 6.16:

SELECT  (SELECT   DIVISION
         FROM     TEAMS
         WHERE    TEAMNO = 1),
        (SELECT   DIVISION
         FROM     TEAMS
         WHERE    TEAMNO = 2)

Answer 6.17:

SELECT  (SELECT   AMOUNT
         FROM     PENALTIES
         WHERE    PAYMENTNO = 1) +
        (SELECT   AMOUNT
         FROM     PENALTIES
         WHERE    PAYMENTNO = 2) +
        (SELECT   AMOUNT
         FROM     PENALTIES
         WHERE    PAYMENTNO = 3)

Example 7.1:

CREATE DATABASE EXTRA
;
USE EXTRA
;
CREATE TABLE CITIES
      (CITYNO      INTEGER NOT NULL PRIMARY KEY,
       CITYNAME    CHAR(20) NOT NULL)
;
INSERT INTO CITIES VALUES
   (1, 'Stratford')
;
INSERT INTO CITIES VALUES
   (2, 'Inglewood')

Example 7.2:

SELECT   *
FROM     EXTRA.CITIES

Example 7.3:

SELECT   *
FROM     TENNIS.TEAMS

Example 7.4:

SELECT   TEAMNO
FROM     TEAMS
;
SELECT   TEAMS.TEAMNO
FROM     TEAMS
;
SELECT   TENNIS.TEAMS.TEAMNO
FROM     TENNIS.TEAMS

Example 7.5:

SELECT   TEAMNO, NAME
FROM     TEAMS, PLAYERS
WHERE    TEAMS.PLAYERNO = PLAYERS.PLAYERNO

Example 7.6:

SELECT   PAYMENTNO, PENALTIES.PLAYERNO, AMOUNT,
         NAME, INITIALS
FROM     PENALTIES, PLAYERS
WHERE    PENALTIES.PLAYERNO = PLAYERS.PLAYERNO
;
SELECT   PLAYERS.PLAYERNO
FROM     PLAYERS, TEAMS
WHERE    PLAYERS.PLAYERNO = TEAMS.PLAYERNO
;
SELECT   PLAYERS.PLAYERNO
FROM     TEAMS, PLAYERS
WHERE    PLAYERS.PLAYERNO = TEAMS.PLAYERNO

Example 7.7:

SELECT   PAYMENTNO, PEN.PLAYERNO, AMOUNT,
         NAME, INITIALS
FROM     PENALTIES AS PEN, PLAYERS AS P
WHERE    PEN.PLAYERNO = P.PLAYERNO
;
SELECT   PAYMENTNO, PEN.PLAYERNO, AMOUNT,
         NAME, INITIALS
FROM     PENALTIES PEN, PLAYERS P
WHERE    PEN.PLAYERNO = P.PLAYERNO

Example 7.8:

SELECT   T.PLAYERNO
FROM     TEAMS AS T, PENALTIES AS PEN
WHERE    T.PLAYERNO = PEN.PLAYERNO

Example 7.9:

SELECT   DISTINCT T.PLAYERNO
FROM     TEAMS AS T, PENALTIES AS PEN
WHERE    T.PLAYERNO = PEN.PLAYERNO

Example 7.10:

SELECT   DISTINCT P.NAME, P.INITIALS
FROM     PLAYERS AS P, MATCHES AS M
WHERE    P.PLAYERNO = M.PLAYERNO

Example 7.11:

SELECT   M.MATCHNO, M.PLAYERNO, M.TEAMNO, P.NAME, T.DIVISION
FROM     MATCHES AS M, PLAYERS AS P, TEAMS AS T
WHERE    M.PLAYERNO = P.PLAYERNO
AND      M.TEAMNO = T.TEAMNO

Example 7.12:

SELECT   PEN.PAYMENTNO, PEN.PLAYERNO, PEN.PAYMENT_DATE
FROM     PENALTIES AS PEN, PLAYERS AS P
WHERE    PEN.PLAYERNO = P.PLAYERNO
AND      YEAR(PEN.PAYMENT_DATE) = P.JOINED

Example 7.13:

SELECT   P.PLAYERNO
FROM     PLAYERS AS P, PLAYERS AS PAR
WHERE    PAR.NAME = 'Parmenter'
AND      PAR.INITIALS = 'R'
AND      P.BIRTH_DATE < PAR.BIRTH_DATE
;
SELECT   P.PLAYERNO
FROM     PLAYERS AS P, PLAYERS
WHERE    PLAYERS.NAME = 'Parmenter'
AND      PLAYERS.INITIALS = 'R'
AND      P.BIRTH_DATE < PLAYERS.BIRTH_DATE

Example 7.14:

SELECT   P.PLAYERNO
FROM     PLAYERS AS P, EXTRA.CITIES AS TOWN
WHERE    P.TOWN = TOWN.CITYNAME

Example 7.15:

SELECT   PLAYERS.PLAYERNO, NAME, AMOUNT
FROM     PLAYERS, PENALTIES
WHERE    PLAYERS.PLAYERNO = PENALTIES.PLAYERNO
AND      BIRTH_DATE > '1920-06-30'
;
SELECT   PLAYERS.PLAYERNO, NAME, AMOUNT
FROM     PLAYERS INNER JOIN PENALTIES
         ON (PLAYERS.PLAYERNO = PENALTIES.PLAYERNO)
WHERE    BIRTH_DATE > '1920-06-30'

Example 7.16:

SELECT   TEAMNO, NAME
FROM     TEAMS, PLAYERS
WHERE    TEAMS.PLAYERNO = PLAYERS.PLAYERNO
;
SELECT   TEAMNO, NAME
FROM     TEAMS INNER JOIN PLAYERS
         ON TEAMS.PLAYERNO = PLAYERS.PLAYERNO
;
SELECT   TEAMNO, NAME
FROM     TEAMS JOIN PLAYERS
         ON TEAMS.PLAYERNO = PLAYERS.PLAYERNO

Example 7.17:

SELECT   PLAYERS.PLAYERNO, NAME, AMOUNT
FROM     PLAYERS, PENALTIES
WHERE    PLAYERS.PLAYERNO = PENALTIES.PLAYERNO
ORDER BY PLAYERS.PLAYERNO
;
SELECT   PLAYERS.PLAYERNO, NAME, AMOUNT
FROM     PLAYERS LEFT OUTER JOIN PENALTIES
         ON PLAYERS.PLAYERNO = PENALTIES.PLAYERNO
ORDER BY PLAYERS.PLAYERNO

Example 7.18:

SELECT   PAYMENTNO, NAME
FROM     PENALTIES LEFT OUTER JOIN PLAYERS
         ON PENALTIES.PLAYERNO = PLAYERS.PLAYERNO
ORDER BY PAYMENTNO

Example 7.19:

SELECT   P.PLAYERNO, NAME, TEAMNO, DIVISION
FROM     PLAYERS AS P LEFT OUTER JOIN TEAMS AS T
         ON P.PLAYERNO = T.PLAYERNO
ORDER BY P.PLAYERNO

Example 7.20:

SELECT   PLAYERS.PLAYERNO, NAME, AMOUNT, TEAMNO
FROM     PLAYERS LEFT OUTER JOIN PENALTIES
         ON PLAYERS.PLAYERNO = PENALTIES.PLAYERNO
            LEFT OUTER JOIN MATCHES
            ON PLAYERS.PLAYERNO = MATCHES.PLAYERNO
WHERE    TOWN = 'Inglewood'

Example 7.21:

SELECT   PLAYERS.PLAYERNO, NAME, TEAMNO
FROM     TEAMS RIGHT OUTER JOIN PLAYERS
         ON TEAMS.PLAYERNO = PLAYERS.PLAYERNO

Example 7.22:

SELECT   PLAYERS.PLAYERNO, NAME, AMOUNT
FROM     PLAYERS INNER JOIN PENALTIES
         ON PLAYERS.PLAYERNO = PENALTIES.PLAYERNO
WHERE    BIRTH_DATE > '1920-06-30'
;
SELECT   PLAYERS.PLAYERNO, NAME, AMOUNT
FROM     PLAYERS NATURAL JOIN PENALTIES
WHERE    BIRTH_DATE > '1920-06-30'

Example 7.23:

SELECT   TEAMS.PLAYERNO, TEAMS.TEAMNO, PENALTIES.PAYMENTNO
FROM     TEAMS LEFT OUTER JOIN PENALTIES
         ON TEAMS.PLAYERNO = PENALTIES.PLAYERNO
WHERE    DIVISION = 'second'
;
SELECT   TEAMS.PLAYERNO, TEAMS.TEAMNO, PENALTIES.PAYMENTNO
FROM     TEAMS LEFT OUTER JOIN PENALTIES
         ON TEAMS.PLAYERNO = PENALTIES.PLAYERNO
         AND DIVISION = 'second'

Example 7.24:

SELECT   TEAMS.PLAYERNO, TEAMS.TEAMNO, PENALTIES.PAYMENTNO
FROM     TEAMS FULL OUTER JOIN PENALTIES
         ON TEAMS.PLAYERNO = PENALTIES.PLAYERNO
         AND TEAMS.PLAYERNO > 1000

Example 7.25:

SELECT   *
FROM     PENALTIES LEFT OUTER JOIN TEAMS
         USING (PLAYERNO)

Example 7.26:

SELECT   PLAYERNO
FROM    (SELECT   *
         FROM     PLAYERS
         WHERE    TOWN = 'Stratford') AS STRATFORDERS

Example 7.27:

SELECT   SMALL_TEAMS.PLAYERNO
FROM    (SELECT   PLAYERNO, DIVISION
         FROM     TEAMS) AS SMALL_TEAMS
WHERE    SMALL_TEAMS.DIVISION = 'first'

Example 7.28:

SELECT   MATCHNO, DIFFERENCE
FROM    (SELECT   MATCHNO,
                  ABS(WON – LOST) AS DIFFERENCE
         FROM     MATCHES) AS M
WHERE    DIFFERENCE > 2

Example 7.29:

SELECT   *
FROM    (SELECT 'Stratford' AS TOWN, 4 AS NUMBER
         UNION
         SELECT 'Plymouth', 6
         UNION
         SELECT 'Inglewood', 1
         UNION
         SELECT 'Douglas', 2) AS TOWNS
ORDER BY TOWN

Example 7.30:

SELECT   PLAYERNO, NAME, PLAYERS.TOWN, NUMBER * 1000
FROM     PLAYERS,
        (SELECT 'Stratford' AS TOWN, 4 AS NUMBER
         UNION
         SELECT 'Plymouth', 6
         UNION
         SELECT 'Inglewood', 1
         UNION
         SELECT 'Douglas', 2) AS TOWNS
WHERE    PLAYERS.TOWN = TOWNS.TOWN
ORDER BY PLAYERNO
;
SELECT   PLAYERNO, NAME, PLAYERS.TOWN, NUMBER
FROM     PLAYERS LEFT OUTER JOIN
        (SELECT 'Stratford' AS TOWN, 4 AS NUMBER
         UNION
         SELECT 'Plymouth', 6
         UNION
         SELECT 'Inglewood', 1
         UNION
         SELECT 'Douglas', 2) AS TOWNS
         ON PLAYERS.TOWN = TOWNS.TOWN
ORDER BY PLAYERNO

Example 7.31:

SELECT   PLAYERNO
FROM     PLAYERS LEFT OUTER JOIN
        (SELECT 'Stratford' AS TOWN, 4 AS NUMBER
         UNION
         SELECT 'Plymouth', 6
         UNION
         SELECT 'Inglewood', 1
         UNION
         SELECT 'Douglas', 2) AS TOWNS
         ON PLAYERS.TOWN = TOWNS.TOWN
WHERE    TOWNS.NUMBER > 2

Example 7.32:

SELECT   *
FROM    (SELECT 'John' AS FIRST_NAME
         UNION
         SELECT 'Mark'
         UNION
         SELECT 'Arnold') AS FIRST_NAMES,
        (SELECT 'Berg' AS LAST_NAME
         UNION
         SELECT 'Johnson'
         UNION
         SELECT 'Williams') AS LAST_NAMES

Example 7.33:

SELECT   NUMBER, POWER(NUMBER,3)
FROM    (SELECT 10 AS NUMBER UNION SELECT 11 UNION SELECT 12
         UNION
         SELECT 13 UNION SELECT 14 UNION SELECT 15
         UNION
         SELECT 16 UNION SELECT 17 UNION SELECT 18
         UNION
         SELECT 19) AS NUMBERS
WHERE    POWER(NUMBER,3) <= 4000

Example 7.34:

SELECT   NUMBER
FROM    (SELECT    CAST(CONCAT(DIGIT1.DIGIT,
                   CONCAT(DIGIT2.DIGIT,
                   DIGIT3.DIGIT)) AS UNSIGNED INTEGER)
                   AS NUMBER
         FROM     (SELECT '0' AS DIGIT UNION SELECT '1' UNION
                   SELECT '2' UNION SELECT '3' UNION
                   SELECT '4' UNION SELECT '5' UNION
                   SELECT '6' UNION SELECT '7' UNION
                   SELECT '8' UNION SELECT '9') AS DIGIT1,
                  (SELECT '0' AS DIGIT UNION SELECT '1' UNION
                   SELECT '2' UNION SELECT '3' UNION
                   SELECT '4' UNION SELECT '5' UNION
                   SELECT '6' UNION SELECT '7' UNION
                   SELECT '8' UNION SELECT '9') AS DIGIT2,
                  (SELECT '0' AS DIGIT UNION SELECT '1' UNION
                   SELECT '2' UNION SELECT '3' UNION
                   SELECT '4' UNION SELECT '5' UNION
                   SELECT '6' UNION SELECT '7' UNION
                   SELECT '8' UNION SELECT '9') AS DIGIT3)
                   AS NUMBERS
ORDER BY NUMBER

Example 7.35:

SELECT   NUMBER AS SQUARE, ROUND(SQRT(NUMBER)) AS BASIS
FROM    (SELECT    CAST(CONCAT(DIGIT1.DIGIT,
                   CONCAT(DIGIT2.DIGIT,
                   DIGIT3.DIGIT)) AS UNSIGNED INTEGER)
                   AS NUMBER
         FROM     (SELECT '0' AS DIGIT UNION SELECT '1' UNION
                   SELECT '2' UNION SELECT '3' UNION
                   SELECT '4' UNION SELECT '5' UNION
                   SELECT '6' UNION SELECT '7' UNION
                   SELECT '8' UNION SELECT '9') AS DIGIT1,
                  (SELECT '0' AS DIGIT UNION SELECT '1' UNION
                   SELECT '2' UNION SELECT '3' UNION
                   SELECT '4' UNION SELECT '5' UNION
                   SELECT '6' UNION SELECT '7' UNION
                   SELECT '8' UNION SELECT '9') AS DIGIT2,
                  (SELECT '0' AS DIGIT UNION SELECT '1' UNION
                   SELECT '2' UNION SELECT '3' UNION
                   SELECT '4' UNION SELECT '5' UNION
                   SELECT '6' UNION SELECT '7' UNION
                   SELECT '8' UNION SELECT '9') AS DIGIT3)
                   AS NUMBERS
WHERE    SQRT(NUMBER) = ROUND(SQRT(NUMBER))
ORDER BY NUMBER

Answer 7.3:

SELECT   PAYMENTNO, AMOUNT, PLAYERS.PLAYERNO, NAME
FROM     PENALTIES, PLAYERS
WHERE    PENALTIES.PLAYERNO = PLAYERS.PLAYERNO

Answer 7.4:

SELECT   PAYMENTNO, NAME
FROM     PENALTIES, PLAYERS, TEAMS
WHERE    PENALTIES.PLAYERNO = TEAMS.PLAYERNO
AND      TEAMS.PLAYERNO = PLAYERS.PLAYERNO

Answer 7.5:

SELECT   T.TEAMNO, P.NAME
FROM     TEAMS AS T, PLAYERS AS P
WHERE    T.PLAYERNO = P.PLAYERNO

Answer 7.6:

SELECT   M.MATCHNO, P.NAME, T.DIVISION
FROM     MATCHES AS M, PLAYERS AS P, TEAMS AS T
WHERE    M.PLAYERNO = P.PLAYERNO
AND      M.TEAMNO = T.TEAMNO

Answer 7.7:

SELECT   P.PLAYERNO, P.NAME
FROM     PLAYERS AS P, COMMITTEE_MEMBERS AS C
WHERE    P.PLAYERNO = C.PLAYERNO
AND      B.POSITION = 'Chairman'

Answer 7.8:

SELECT   DISTINCT CM.PLAYERNO
FROM     COMMITTEE_MEMBERS AS CM, PENALTIES AS PEN
WHERE    CM.PLAYERNO = PEN.PLAYERNO
AND      CM.BEGIN_DATE = PEN.PAYMENT_DATE

Answer 7.9:

SELECT   P.PLAYERNO, P.NAME
FROM     PLAYERS AS P, PLAYERS AS P27
WHERE    P.TOWN = P27.TOWN
AND      P27.PLAYERNO = 27
AND      P.PLAYERNO <> 27

Answer 7.10:

SELECT   DISTINCT P.PLAYERNO AS PLAYER_PLAYERNO,
         P.NAME AS PLAYER_NAME,
         CAP.PLAYERNO AS CAPTAIN_PLAYERNO,
         CAP.NAME AS CAPTAIN_NAME
FROM     PLAYERS AS P, PLAYERS AS CAP,
         MATCHES AS M, TEAMS AS T
WHERE    M.PLAYERNO = P.PLAYERNO
AND      T.TEAMNO = M.TEAMNO
AND      M.PLAYERNO <> T.PLAYERNO
AND      CAP.PLAYERNO = T.PLAYERNO

Answer 7.11:

SELECT   PEN1.PAYMENTNO, PEN1.PLAYERNO
FROM     PENALTIES AS PEN1, PENALTIES AS PEN2
WHERE    PEN1.AMOUNT = PEN2.AMOUNT
AND      PEN2.PLAYERNO = 44
AND      PEN1.PLAYERNO <> 44

Answer 7.12:

SELECT   T.TEAMNO, P.NAME
FROM     TEAMS AS T INNER JOIN PLAYERS AS P
         ON T.PLAYERNO = P.PLAYERNO

Answer 7.13:

SELECT   P.PLAYERNO, P.NAME
FROM     PLAYERS AS P INNER JOIN PLAYERS AS P27
         ON P.TOWN = P27.TOWN
AND      P27.PLAYERNO = 27
AND      P.PLAYERNO <> 27

Answer 7.14:

SELECT   M.MATCHNO, P.NAME, T.DIVISION
FROM    (MATCHES AS M INNER JOIN PLAYERS AS P
         ON M.PLAYERNO = P.PLAYERNO)
         INNER JOIN TEAMS AS T
         ON M.TEAMNO = T.TEAMNO

Answer 7.15:

SELECT   PLAYERS.PLAYERNO, PENALTIES.AMOUNT
FROM     PLAYERS LEFT OUTER JOIN PENALTIES
         ON PLAYERS.PLAYERNO = PENALTIES.PLAYERNO

Answer 7.16:

SELECT   P.PLAYERNO, M.TEAMNO
FROM     PLAYERS AS P LEFT OUTER JOIN MATCHES AS M
         ON P.PLAYERNO = M.PLAYERNO

Answer 7.17:

SELECT   P.PLAYERNO, PEN.AMOUNT, M.TEAMNO
FROM    (PLAYERS AS P LEFT OUTER JOIN MATCHES AS M
         ON P.PLAYERNO = M.PLAYERNO)
         LEFT OUTER JOIN PENALTIES AS PEN
         ON P.PLAYERNO = PEN.PLAYERNO

Answer 7.21:

SELECT   PLAYERNO, DIFFERENCE
FROM    (SELECT   PLAYERNO,
                  JOINED - YEAR(BIRTH_DATE) AS DIFFERENCE
         FROM     PLAYERS) AS DIFFERENCES
WHERE    DIFFERENCE > 20

Answer 7.22:

SELECT   LETTER1 || LETTER2 || LETTER3
FROM    (SELECT 'a' AS LETTER1 UNION SELECT 'b'
         UNION SELECT 'c' UNION SELECT 'd') AS LETTERS1,
        (SELECT 'a' AS LETTER2 UNION SELECT 'b'
         UNION SELECT 'c' UNION SELECT 'd') AS LETTERS2,
        (SELECT 'a' AS LETTER3 UNION SELECT 'b'
         UNION SELECT 'c' UNION SELECT 'd') AS LETTERS3

Answer 7.23:

SELECT   ROUND(RAND() * 1000)
FROM    (SELECT 0 AS NUMBER UNION SELECT 1 UNION SELECT 2
         UNION
         SELECT 3 UNION SELECT 4 UNION SELECT 5
         UNION
         SELECT 6 UNION SELECT 7 UNION SELECT 8
         UNION
         SELECT 9) AS NUMBERS

Example 8.1:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    TOWN = 'Stratford'

Example 8.2:

SELECT   PLAYERNO, BIRTH_DATE, JOINED
FROM     PLAYERS
WHERE    YEAR(BIRTH_DATE) + 17 = JOINED

Example 8.3:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    LEAGUENO = '7060'

Example 8.4:

SELECT   PLAYERNO, LEAGUENO
FROM     PLAYERS
WHERE    LEAGUENO = LEAGUENO

Example 8.5:

SELECT   PLAYERNO, LEAGUENO
FROM     PLAYERS
WHERE    LEAGUENO <=> NULL

Example 8.6:

SELECT   MATCHNO
FROM     MATCHES
WHERE   (WON, LOST) = (2, 3)

Example 8.7:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    PLAYERNO =
        (SELECT   PLAYERNO
         FROM     TEAMS
         WHERE    TEAMNO = 1)
;
SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    PLAYERNO = 6
;
SELECT   *
FROM     PLAYERS
WHERE    BIRTH_DATE <
        (SELECT   BIRTH_DATE
         FROM     PLAYERS)

Example 8.8:

SELECT   PLAYERNO, NAME, INITIALS
FROM     PLAYERS
WHERE    BIRTH_DATE <
        (SELECT   BIRTH_DATE
         FROM     PLAYERS
         WHERE    LEAGUENO = '8467')
;
SELECT   PLAYERNO, NAME, INITIALS
FROM     PLAYERS
WHERE    BIRTH_DATE <
        (SELECT   BIRTH_DATE
         FROM     PLAYERS
         WHERE    LEAGUENO = '9999')

Example 8.9:

SELECT   MATCHNO
FROM     MATCHES
WHERE    TEAMNO =
        (SELECT   TEAMNO
         FROM     TEAMS
         WHERE    PLAYERNO = 27)

Example 8.10:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    LEAGUENO <=>
        (SELECT   LEAGUENO
         FROM     PLAYERS
         WHERE    PLAYERNO = 7)

Example 8.11:

SELECT   PLAYERNO, TOWN, SEX
FROM     PLAYERS
WHERE   (TOWN, SEX) =
       ((SELECT   TOWN
         FROM     PLAYERS
         WHERE    PLAYERNO = 7),
        (SELECT   SEX
         FROM     PLAYERS
         WHERE    PLAYERNO = 2))

Example 8.12:

SELECT   DISTINCT PLAYERNO
FROM     COMMITTEE_MEMBERS
WHERE   (BEGIN_DATE, END_DATE) =
        (SELECT   BEGIN_DATE, END_DATE
         FROM     COMMITTEE_MEMBERS
         WHERE    PLAYERNO = 6
         AND      POSITION = 'Secretary'
         AND      BEGIN_DATE = '1990-01-01')

Example 8.13:

SELECT   PLAYERNO, NAME, INITIALS
FROM     PLAYERS
WHERE   (NAME, INITIALS) <
        (SELECT   NAME, INITIALS
         FROM     PLAYERS
         WHERE    PLAYERNO = 6)
ORDER BY NAME, INITIALS

Example 8.14:

SELECT   MATCHNO
FROM     MATCHES_SPECIAL
WHERE   (START_DATE, START_TIME) >
        (SELECT   START_DATE, START_TIME
         FROM     MATCHES_SPECIAL
         WHERE    MATCHNO = 1)

Example 8.15:

SELECT   MATCHNO
FROM     MATCHES
WHERE    'Inglewood' =
        (SELECT   TOWN
         FROM     PLAYERS
         WHERE    PLAYERS.PLAYERNO = MATCHES.PLAYERNO)
;
SELECT   TOWN
FROM     PLAYERS
WHERE    PLAYERS.PLAYERNO = 6
;
SELECT   TOWN
FROM     PLAYERS
WHERE    PLAYERS.PLAYERNO = 44

Example 8.16:

SELECT   MATCHNO, PLAYERNO, TEAMNO
FROM     MATCHES
WHERE    PLAYERNO =
        (SELECT   PLAYERNO
         FROM     TEAMS
         WHERE    TEAMS.PLAYERNO = MATCHES.PLAYERNO)

Example 8.17:

SELECT   MATCHNO
FROM     MATCHES
WHERE    SUBSTR((SELECT   DIVISION
                 FROM     TEAMS
                 WHERE    TEAMS.TEAMNO =
                          MATCHES.TEAMNO),3,1)
         =
         SUBSTR((SELECT   NAME
                 FROM     PLAYERS
                 WHERE    PLAYERS.PLAYERNO =
                          MATCHES.PLAYERNO),3,1)

Example 8.18:

SELECT   PLAYERNO, LEAGUENO
FROM     PLAYERS
WHERE    LEAGUENO

Example 8.19:

SELECT   TEAMNO
FROM     TEAMS
WHERE    TEAMNO - 1
;
SELECT * FROM PLAYERS WHERE 18
;
SELECT * FROM PLAYERS WHERE NULL
;
SELECT * FROM PLAYERS WHERE PLAYERNO & 3
;
SELECT * FROM PLAYERS WHERE YEAR(BIRTH_DATE)

Example 8.20:

SELECT   PLAYERNO, NAME, SEX, BIRTH_DATE
FROM     PLAYERS
WHERE    SEX = 'M'
AND      BIRTH_DATE > '1970-12-31'

Example 8.21:

SELECT   PLAYERNO, NAME, TOWN
FROM     PLAYERS
WHERE    TOWN = 'Plymouth'
OR       TOWN = 'Eltham'

Example 8.22:

SELECT   PLAYERNO, NAME, TOWN
FROM     PLAYERS
WHERE    TOWN <> 'Stratford'
;
SELECT   PLAYERNO, NAME, TOWN
FROM     PLAYERS
WHERE    NOT (TOWN = 'Stratford')

Example 8.23:

SELECT   PLAYERNO, LEAGUENO, PHONENO
FROM     PLAYERS
WHERE    LEAGUENO AND PHONENO

Example 8.24:

SELECT   PLAYERNO, TOWN, BIRTH_DATE
FROM     PLAYERS
WHERE   (TOWN = 'Stratford' OR  YEAR(BIRTH_DATE) = 1963)
AND NOT (TOWN = 'Stratford' AND YEAR(BIRTH_DATE) = 1963)
;
SELECT   PLAYERNO, TOWN, BIRTH_DATE
FROM     PLAYERS
WHERE   (TOWN = 'Stratford') XOR (YEAR(BIRTH_DATE) = 1963)

Example 8.25:

SELECT   PLAYERNO, NAME, TOWN
FROM     PLAYERS
WHERE    TOWN = 'Inglewood'
OR       TOWN = 'Plymouth'
OR       TOWN = 'Midhurst'
OR       TOWN = 'Douglas'
;
SELECT   PLAYERNO, NAME, TOWN
FROM     PLAYERS
WHERE    TOWN IN ('Inglewood', 'Plymouth', 'Midhurst',
                  'Douglas')

Example 8.26:

SELECT   PLAYERNO, YEAR(BIRTH_DATE)
FROM     PLAYERS
WHERE    YEAR(BIRTH_DATE) IN (1962, 1963, 1970)

Example 8.27:

SELECT   MATCHNO, WON, LOST
FROM     MATCHES
WHERE    2 IN (WON, LOST)

Example 8.28:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    PLAYERNO IN
        (100,
        (SELECT   PLAYERNO
         FROM     PENALTIES
         WHERE    PAYMENTNO = 1),
        (SELECT   PLAYERNO
         FROM     TEAMS
         WHERE    TEAMNO = 2))

Example 8.29:

SELECT   MATCHNO, WON, LOST
FROM     MATCHES
WHERE    WON IN
        (TRUNCATE(MATCHNO / 2,0), LOST,
        (SELECT   LOST
         FROM     MATCHES
         WHERE    MATCHNO = 1))

Example 8.30:

SELECT   MATCHNO
FROM     MATCHES
WHERE   (SELECT   SUBSTR(NAME,1,1)
         FROM     PLAYERS
         WHERE    PLAYERS.PLAYERNO = MATCHES.PLAYERNO)
         IN ('B','C','E')

Example 8.31:

SELECT   MATCHNO, WON, LOST
FROM     MATCHES
WHERE   (WON, LOST) IN ((3,1),(3,2))

Example 8.32:

SELECT   PLAYERNO, NAME, INITIALS
FROM     PLAYERS
WHERE   (NAME, INITIALS) IN
       ((SELECT   NAME, INITIALS
         FROM     PLAYERS
         WHERE    PLAYERNO = 6),
        (SELECT   NAME, INITIALS
         FROM     PLAYERS
         WHERE    PLAYERNO = 27))

Example 8.33:

SELECT   PLAYERNO
FROM     MATCHES
;
SELECT   PLAYERNO, NAME, INITIALS
FROM     PLAYERS
WHERE    PLAYERNO IN (6, 6, 6, 44, 83, 2, 57, 8, 27,
                      104, 112, 112,
;
SELECT   PLAYERNO, NAME, INITIALS
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     MATCHES)
;
SELECT   PLAYERNO, NAME, INITIALS
FROM     PLAYERS
WHERE    PLAYERNO IN (6, 6, 6, 44, 83, 2, 57, 8, 27,
                      104, 112, 112,

Example 8.34:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     MATCHES
         WHERE    TEAMNO = 1)

Example 8.35:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     MATCHES
         WHERE    TEAMNO NOT IN
                 (SELECT   TEAMNO
                  FROM     TEAMS
                  WHERE    PLAYERNO = 6))
;
SELECT   *
FROM     PLAYERS
WHERE    BIRTH_DATE NOT IN
        (SELECT   BIRTH_DATE
         FROM     PLAYERS
         WHERE    Town = 'London')

Example 8.36:

SELECT   *
FROM     COMMITTEE_MEMBERS
WHERE   (BEGIN_DATE, END_DATE) IN
        (SELECT   BEGIN_DATE, END_DATE
         FROM     COMMITTEE_MEMBERS
         WHERE    POSITION = 'Secretary')

Example 8.37:

CREATE TABLE PLAYERS_NI
      (NAME         CHAR(10) NOT NULL,
       INITIALS     CHAR(3) NOT NULL,
       TOWN         VARCHAR(30) NOT NULL,
       PRIMARY KEY (NAME, INITIALS))
;
INSERT INTO PLAYERS_NI VALUES ('Parmenter', 'R', 'Stratford')
;
INSERT INTO PLAYERS_NI VALUES ('Parmenter', 'P', 'Stratford')
;
INSERT INTO PLAYERS_NI VALUES ('Miller', 'P', 'Douglas')
;
CREATE TABLE PENALTIES_NI
      (PAYMENTNO    INTEGER NOT NULL,
       NAME         CHAR(10) NOT NULL,
       INITIALS     CHAR(3) NOT NULL,
       AMOUNT       DECIMAL(7,2) NOT NULL,
       PRIMARY KEY (PAYMENTNO),
       FOREIGN KEY (NAME, INITIALS)
          REFERENCES PLAYERS_NI (NAME, INITIALS))
;
INSERT INTO PENALTIES_NI VALUES (1, 'Parmenter', 'R', 100.00)
;
INSERT INTO PENALTIES_NI VALUES (2, 'Miller', 'P', 200.00)

Example 8.38:

SELECT   NAME, INITIALS, TOWN
FROM     PLAYERS_NI
WHERE    NAME IN
        (SELECT   NAME
         FROM     PENALTIES_NI)
AND      INITIALS IN
        (SELECT   INITIALS
         FROM     PENALTIES_NI)
;
SELECT   NAME, INITIALS, TOWN
FROM     PLAYERS_NI
WHERE   (NAME, INITIALS) IN
        (SELECT   NAME, INITIALS
         FROM     PENALTIES_NI)
;
SELECT   NAME, INITIALS, TOWN
FROM     PLAYERS_NI
WHERE    NAME IN
        (SELECT   NAME
         FROM     PENALTIES_NI
         WHERE    PLAYERS_NI.INITIALS =
                  PENALTIES_NI.INITIALS)

Example 8.39:

SELECT   NAME, INITIALS, TOWN
FROM     PLAYERS_NI
WHERE   (NAME, INITIALS) NOT IN
        (SELECT   NAME, INITIALS
         FROM     PENALTIES_NI)

Example 8.40:

SELECT   PLAYERNO, BIRTH_DATE
FROM     PLAYERS
WHERE    BIRTH_DATE >= '1962-01-01'
AND      BIRTH_DATE <= '1964-12-31'
;
SELECT   PLAYERNO, BIRTH_DATE
FROM     PLAYERS
WHERE    BIRTH_DATE BETWEEN '1962-01-01' AND '1964-12-31'

Example 8.41:

SELECT   MATCHNO, WON + LOST
FROM     MATCHES
WHERE    WON + LOST BETWEEN 2 AND 4

Example 8.42:

SELECT   PLAYERNO, BIRTH_DATE, NAME, INITIALS
FROM     PLAYERS
WHERE    BIRTH_DATE BETWEEN
        (SELECT   BIRTH_DATE
         FROM     PLAYERS
         WHERE    NAME = 'Newcastle'
         AND      INITIALS = 'B')
         AND
        (SELECT   BIRTH_DATE
         FROM     PLAYERS
         WHERE    NAME = 'Miller'
         AND      INITIALS = 'P')

Example 8.43:

SELECT   NAME, PLAYERNO
FROM     PLAYERS
WHERE    NAME LIKE 'B%'

Example 8.44:

SELECT   NAME, PLAYERNO
FROM     PLAYERS
WHERE    NAME LIKE '%r'

Example 8.45:

SELECT   NAME, PLAYERNO
FROM     PLAYERS
WHERE    NAME LIKE '%e_'

Example 8.46:

SELECT   NAME, TOWN, PLAYERNO
FROM     PLAYERS
WHERE    NAME LIKE CONCAT('%', SUBSTR(TOWN,3,1))

Example 8.47:

SELECT   NAME, PLAYERNO
FROM     PLAYERS
WHERE    NAME LIKE '%#_%' ESCAPE '#'

Example 8.48:

SELECT   NAME, PLAYERNO
FROM     PLAYERS
WHERE    NAME REGEXP 'e'

Example 8.49:

SELECT   NAME, PLAYERNO
FROM     PLAYERS
WHERE    NAME REGEXP '^ba'

Example 8.50:

SELECT   NAME, STREET, PLAYERNO
FROM     PLAYERS
WHERE    NAME REGEXP CONCAT(SUBSTR(STREET,1,1), '$')

Example 8.51:

SELECT   NAME, PLAYERNO
FROM     PLAYERS
WHERE    NAME REGEXP '[abc]'

Example 8.52:

SELECT   NAME, PLAYERNO
FROM     PLAYERS
WHERE    NAME REGEXP 'm.n'

Example 8.53:

SELECT   NAME, PLAYERNO
FROM     PLAYERS
WHERE    NAME REGEXP '[men][men]'

Example 8.54:

SELECT   PLAYERNO, POSTCODE
FROM     PLAYERS
WHERE    POSTCODE REGEXP '^[0-9][0-9]3'

Example 8.55:

SELECT   STREET, PLAYERNO
FROM     PLAYERS
WHERE    STREET REGEXP '^St.*Road$'

Example 8.56:

SELECT   PLAYERNO, POSTCODE
FROM     PLAYERS
WHERE    POSTCODE REGEXP '[0-9][0-9]*[a-z][a-z]*'

Example 8.57:

SELECT   NAME, PLAYERNO
FROM     PLAYERS
WHERE    NAME REGEXP '^[^A-M]'

Example 8.58:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    NAME REGEXP '^[a-z]{7}'

Example 8.59:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    NAME REGEXP '^[a-z]{6,7}$'

Example 8.60:

SELECT   PLAYERNO, POSTCODE
FROM     PLAYERS
WHERE    POSTCODE REGEXP '4{4}'

Example 8.61:

SELECT   PLAYERNO, STREET
FROM     PLAYERS
WHERE    STREET REGEXP 'Street|Square'

Example 8.62:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    NAME REGEXP '[[.space.]]'

Example 8.63:

SELECT   PLAYERNO, STREET
FROM     PLAYERS
WHERE    STREET REGEXP '[[:<:]]Street[[:>:]]'

Example 8.64:

CREATE TABLE BOOKS
      (BOOKNO              INTEGER NOT NULL PRIMARY KEY,
       AUTHORS             TEXT NOT NULL,
       TITLE               TEXT NOT NULL,
       YEAR_PUBLICATION    YEAR NOT NULL,
       SUMMARY             TEXT NOT NULL)
   ENGINE = MyISAM

Example 8.65:

SET @@SQL_MODE = 'PIPES_AS_CONCAT'
;
INSERT INTO BOOKS VALUES (1,
   'Ramez Elmasri and Shamkant B. Navathe',
   'Fundamentals of Database Systems', 2007,
   'This market-leading text serves as a valued resource for '||
   'those who will interact with databases in future courses '||
   'and careers. Renowned for its accessible, comprehensive '||
   'coverage of models and real systems, it provides an '||
   'up-to-date introduction to modern database technologies.')
;
INSERT INTO BOOKS VALUES (2,
   'George Coulouris, Jean Dollimore and Tim Kindberg',
   'Distributed Systems: Concepts and Design', 2005,
   'This book provides broad and up-to-date coverage of the '||
   'principles and practice in the fast moving area of '||
   'distributed systems. It includes the key issues in the '||
   'debate between components and web services as the way '||
   'forward for industry. The depth of coverage will enable '||
   'students to evaluate existing distributed systems and '||
   'design new ones.')
;
INSERT INTO BOOKS VALUES (3,
    'Rick van der Lans',
    'Introduction to SQL: Mastering the Relational Database '||
    'Language', 2007,
    'This book provides a technical introduction to the '||
    'features of SQL. Aimed at those new to SQL, but not new '||
    'to programming, it gives the reader the essential skills '||
    'required to start programming with this language.')
;
INSERT INTO BOOKS VALUES (4,
    'Chris Date',
    'An Introduction to Database Systems', 2004,
    'Continuing in the eighth edition, this book provides a '||
    'comprehensive introduction to the now very large field of '||
    'database systems by providing a solid grounding in the '||
    'foundations of database technology. This new edition has '||
    'been rewritten and expanded to stay current with database '||
    'system trends.')
;
INSERT INTO BOOKS VALUES (5,
    'Thomas M. Connolly and Carolyn E. Begg',
    'DataBase Systems: A Practical Approach to Design, '||
    'Implementation and Management',
    2005,
    'A clear introduction to design implementation and management '||
    'issues, as well as an extensive treatment of database '||
    'languages and standards, make this book an indispensable '||
    'complete reference for database students and professionals.')

Example 8.66:

CREATE FULLTEXT INDEX INDEX_TITLE
    ON BOOKS (TITLE)
;
CREATE FULLTEXT INDEX INDEX_SUMMARY
    ON BOOKS (SUMMARY)

Example 8.67:

SELECT   BOOKNO, TITLE
FROM     BOOKS
WHERE    MATCH(TITLE) AGAINST ('design')
;
SELECT   BOOKNO, TITLE
FROM     BOOKS
WHERE    MATCH(TITLE)
         AGAINST ('design' IN NATURAL LANGUAGE MODE)

Example 8.68:

SELECT   BOOKNO, TITLE
FROM     BOOKS
WHERE    MATCH(TITLE) AGAINST ('to')

Example 8.69:

SELECT   BOOKNO, TITLE
FROM     BOOKS
WHERE    MATCH(TITLE) AGAINST ('database')

Example 8.70:

SELECT   BOOKNO, TITLE
FROM     BOOKS
WHERE    MATCH(TITLE) AGAINST ('practical')

Example 8.71:

SELECT   BOOKNO, MATCH(SUMMARY) AGAINST ('distributed')
FROM     BOOKS

Example 8.72:

SELECT   BOOKNO, MATCH(TITLE) AGAINST ('introduction')
FROM     BOOKS
WHERE    MATCH(TITLE) AGAINST ('introduction')

Example 8.73:

SELECT   BOOKNO, TITLE
FROM     BOOKS
WHERE    MATCH(TITLE) AGAINST ('practical distributed')

Example 8.74:

CREATE FULLTEXT INDEX INDEX_TITLE_SUMMARY
    ON BOOKS (TITLE, SUMMARY)

Example 8.75:

SELECT   BOOKNO, TITLE
FROM     BOOKS
WHERE    MATCH(TITLE, SUMMARY) AGAINST ('careers')

Example 8.76:

SELECT   BOOKNO, TITLE
FROM     BOOKS
WHERE    MATCH(TITLE) AGAINST ('database' IN BOOLEAN MODE)

Example 8.77:

SELECT   BOOKNO, TITLE
FROM     BOOKS
WHERE    MATCH(TITLE, SUMMARY)
         AGAINST ('introduction' IN BOOLEAN MODE)

Example 8.78:

SELECT   BOOKNO, TITLE
FROM     BOOKS
WHERE    MATCH(TITLE)
         AGAINST ('database design' IN BOOLEAN MODE)

Example 8.79:

SELECT   BOOKNO, TITLE
FROM     BOOKS
WHERE    MATCH(TITLE)
         AGAINST ('+database +design' IN BOOLEAN MODE)

Example 8.80:

SELECT   BOOKNO, TITLE
FROM     BOOKS
WHERE    MATCH(TITLE)
         AGAINST ('+database -design' IN BOOLEAN MODE)

Example 8.81:

SELECT   BOOKNO, TITLE
FROM     BOOKS
WHERE    MATCH(TITLE)
         AGAINST ('"design implementation"' IN BOOLEAN MODE)

Example 8.82:

SELECT   BOOKNO, TITLE
FROM     BOOKS
WHERE    MATCH(TITLE) AGAINST ('data*' IN BOOLEAN MODE)

Example 8.83:

SELECT   BOOKNO, TITLE
FROM     BOOKS
WHERE    MATCH(TITLE) AGAINST ('practical'
         IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION)
;
SELECT   BOOKNO, TITLE
FROM     BOOKS
WHERE    MATCH(TITLE) AGAINST ('practical')
;
SELECT   BOOKNO, TITLE
FROM     BOOKS
WHERE    MATCH(TITLE) AGAINST (' DataBase Systems: A Practical
         Approach to Design, Implementation and Management')

Example 8.84:

SELECT   BOOKNO, TITLE
FROM     BOOKS
WHERE    MATCH(TITLE) AGAINST ('sql')

Example 8.85:

SELECT   PLAYERNO, LEAGUENO
FROM     PLAYERS
WHERE    LEAGUENO IS NOT NULL

Example 8.86:

SELECT   NAME, PLAYERNO, LEAGUENO
FROM     PLAYERS
WHERE    LEAGUENO <> '8467'
OR       LEAGUENO IS NULL

Example 8.87:

SELECT   NAME, INITIALS
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PENALTIES)
;
SELECT   NAME, INITIALS
FROM     PLAYERS
WHERE    EXISTS
        (SELECT   *
         FROM     PENALTIES
         WHERE    PLAYERNO = PLAYERS.PLAYERNO)
;
SELECT   *
FROM     PENALTIES
WHERE    PLAYERNO = 6

Example 8.88:

SELECT   NAME, INITIALS
FROM     PLAYERS
WHERE    NOT EXISTS
        (SELECT   *
         FROM     TEAMS
         WHERE    PLAYERNO = PLAYERS.PLAYERNO)
;
SELECT   NAME, INITIALS
FROM     PLAYERS
WHERE    NOT EXISTS
        (SELECT   'nothing'
         FROM     TEAMS
         WHERE    PLAYERNO = PLAYERS.PLAYERNO)

Example 8.89:

SELECT   PLAYERNO, NAME, BIRTH_DATE
FROM     PLAYERS
WHERE    BIRTH_DATE <= ALL
        (SELECT   BIRTH_DATE
         FROM     PLAYERS)

Example 8.90:

SELECT   PLAYERNO, BIRTH_DATE
FROM     PLAYERS
WHERE    BIRTH_DATE < ALL
        (SELECT   BIRTH_DATE
         FROM     PLAYERS AS P INNER JOIN MATCHES AS M
                  ON P.PLAYERNO = M.PLAYERNO
         WHERE    M.TEAMNO = 2)

Example 8.91:

SELECT   DISTINCT TEAMNO, PLAYERNO
FROM     MATCHES AS M1
WHERE    WON <= ALL
        (SELECT   WON
         FROM     MATCHES AS M2
         WHERE    M1.TEAMNO = M2.TEAMNO)

Example 8.92:

SELECT   LEAGUENO, PLAYERNO
FROM     PLAYERS
WHERE    LEAGUENO >= ALL
        (SELECT   LEAGUENO
         FROM     PLAYERS)
;
SELECT   LEAGUENO, PLAYERNO
FROM     PLAYERS
WHERE    LEAGUENO >= ALL
        (SELECT   LEAGUENO
         FROM     PLAYERS
         WHERE    LEAGUENO IS NOT NULL)

Example 8.93:

SELECT   PLAYERNO, TOWN, LEAGUENO
FROM     PLAYERS AS P1
WHERE    LEAGUENO <= ALL
        (SELECT   P2.LEAGUENO
         FROM     PLAYERS AS P2
         WHERE    P1.TOWN = P2.TOWN)
;
SELECT   PLAYERNO, TOWN, LEAGUENO
FROM     PLAYERS AS P1
WHERE    LEAGUENO <= ALL
        (SELECT   P2.LEAGUENO
         FROM     PLAYERS AS P2
         WHERE    P1.TOWN = P2.TOWN
         AND      LEAGUENO IS NOT NULL)

Example 8.94:

SELECT   PLAYERNO, NAME, BIRTH_DATE
FROM     PLAYERS
WHERE    BIRTH_DATE > ANY
        (SELECT   BIRTH_DATE
         FROM     PLAYERS)

Example 8.95:

SELECT   DISTINCT PLAYERNO
FROM     PENALTIES
WHERE    PLAYERNO <> 27
AND      AMOUNT > ANY
        (SELECT   AMOUNT
         FROM     PENALTIES
         WHERE    PLAYERNO = 27)

Example 8.96:

SELECT   PLAYERNO, BIRTH_DATE, TOWN
FROM     PLAYERS AS P1
WHERE    BIRTH_DATE > ANY
        (SELECT   BIRTH_DATE
         FROM     PLAYERS AS P2
         WHERE    P1.TOWN = P2.TOWN)

Example 8.98:

SELECT   TEAMNO, DIVISION
FROM     TEAMS
WHERE    EXISTS
        (SELECT   *
         FROM     MATCHES
         WHERE    PLAYERNO = 44
         AND      TEAMNO = TEAMS.TEAMNO)

Example 8.99:

SELECT   DISTINCT PLAYERNO
FROM     PENALTIES AS PEN
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PENALTIES
         WHERE    PAYMENTNO <> PEN.PAYMENTNO)

Example 8.100:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    1 <> ALL
        (SELECT   TEAMNO
         FROM     MATCHES
         WHERE    PLAYERNO = PLAYERS.PLAYERNO)

Example 8.101:

SELECT   TEAMNO
FROM     TEAMS
WHERE    NOT EXISTS
        (SELECT   *
         FROM     MATCHES
         WHERE    PLAYERNO = 57
         AND      TEAMNO = TEAMS.TEAMNO)

Example 8.102:

SELECT   PLAYERNO
FROM     PLAYERS AS P
WHERE    NOT EXISTS
        (SELECT   *
         FROM     TEAMS AS T
         WHERE    NOT EXISTS
                 (SELECT   *
                  FROM     MATCHES AS M
                  WHERE    T.TEAMNO = M.TEAMNO
                  AND      P.PLAYERNO = M.PLAYERNO))
;
SELECT   *
FROM     TEAMS AS T
WHERE    NOT EXISTS
        (SELECT   *
         FROM     MATCHES AS M
         WHERE    T.TEAMNO = M.TEAMNO
         AND      M.PLAYERNO = 27)

Example 8.103:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    NOT EXISTS
        (SELECT   *
         FROM     MATCHES AS M1
         WHERE    PLAYERNO = 57
         AND      NOT EXISTS
                 (SELECT   *
                  FROM     MATCHES AS M2
                  WHERE    M1.TEAMNO = M2.TEAMNO
                  AND      PLAYERS.PLAYERNO = M2.PLAYERNO))

Example 8.104:

SELECT   PLAYERNO
FROM     MATCHES
WHERE    TEAMNO IN
        (SELECT   TEAMNO
         FROM     TEAMS
         WHERE    TEAMNO NOT IN
                 (SELECT   TEAMNO
                  FROM     MATCHES
                  WHERE    PLAYERNO = 57))
;
SELECT   PLAYERNO
FROM     PLAYERS AS P
WHERE    NOT EXISTS
        (SELECT   *
         FROM     MATCHES AS M1
         WHERE    PLAYERNO = 57
         AND      NOT EXISTS
                 (SELECT   *
                  FROM     MATCHES AS M2
                  WHERE    M1.TEAMNO = M2.TEAMNO
                  AND      P.PLAYERNO = M2.PLAYERNO))
AND      PLAYERNO NOT IN
        (SELECT   PLAYERNO
         FROM     MATCHES
         WHERE    TEAMNO IN
                 (SELECT   TEAMNO
                  FROM     TEAMS
                  WHERE    TEAMNO NOT IN
                          (SELECT   TEAMNO
                           FROM     MATCHES
                           WHERE    PLAYERNO = 57)))

Example 8.105:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    TOWN = 'Stratford'
;
SELECT   PLAYERNO
FROM     PLAYERS
WHERE    NOT (TOWN = 'Stratford')
;
SELECT   PLAYERNO
FROM     PLAYERS
WHERE    TOWN <> 'Stratford'

Example 8.106:

SELECT   PLAYERNO
FROM     PENALTIES
WHERE    AMOUNT = 25
;
SELECT   PLAYERNO
FROM     PENALTIES
WHERE    AMOUNT <> 25
;
SELECT   PLAYERNO
FROM     PLAYERS
WHERE    PLAYERNO NOT IN
        (SELECT   PLAYERNO
         FROM     PENALTIES
         WHERE    AMOUNT = 25)

Example 8.107:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PENALTIES
         WHERE    AMOUNT = 25)

Answer 8.1:

SELECT   PAYMENTNO
FROM     PENALTIES
WHERE    AMOUNT > 60
;
SELECT   PAYMENTNO
FROM     PENALTIES
WHERE    60 < AMOUNT
;
SELECT   PAYMENTNO
FROM     PENALTIES
WHERE    AMOUNT - 60 > 0

Answer 8.5:

SELECT   DISTINCT PLAYERNO
FROM     MATCHES
WHERE    WON + LOST = 5

Answer 8.6:

SELECT   PLAYERNO, NAME, INITIALS
FROM     PLAYERS
WHERE    PLAYERNO =
        (SELECT   PLAYERNO
         FROM     PENALTIES
         WHERE    PAYMENTNO = 4)

Answer 8.7:

SELECT   PLAYERNO, NAME, INITIALS
FROM     PLAYERS
WHERE    PLAYERNO =
        (SELECT   PLAYERNO
         FROM     TEAMS
         WHERE    TEAMNO =
                 (SELECT   TEAMNO
                  FROM     MATCHES
                  WHERE    MATCHNO = 2))

Answer 8.8:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    BIRTH_DATE =
        (SELECT   BIRTH_DATE
         FROM     PLAYERS
         WHERE    NAME = 'Parmenter'
         AND      INITIALS = 'R')
AND      NOT (NAME = 'Parmenter'
              AND INITIALS = 'R')

Answer 8.9:

SELECT   MATCHNO
FROM     MATCHES
WHERE    WON =
        (SELECT   WON
         FROM     MATCHES
         WHERE    MATCHNO = 6)
AND      MATCHNO <> 6
AND      TEAMNO = 2

Answer 8.10:

SELECT   MATCHNO
FROM     MATCHES
WHERE   (WON, LOST) =
       ((SELECT   WON
         FROM     MATCHES
         WHERE    MATCHNO = 2),
        (SELECT   LOST
         FROM     MATCHES
         WHERE    MATCHNO = )

Answer 8.11:

SELECT   PLAYERNO, TOWN, STREET, HOUSENO
FROM     PLAYERS
WHERE   (TOWN, STREET, HOUSENO) <
        (SELECT   TOWN, STREET, HOUSENO
         FROM     PLAYERS
         WHERE    PLAYERNO = 100)
ORDER BY TOWN, STREET, HOUSENO

Answer 8.12:

SELECT   PAYMENTNO
FROM     PENALTIES
WHERE    1965 <
        (SELECT   YEAR(BIRTH_DATE)
         FROM     PLAYERS
         WHERE    PLAYERS.PLAYERNO = PENALTIES.PLAYERNO)

Answer 8.13:

SELECT   PAYMENTNO, PLAYERNO
FROM     PENALTIES
WHERE    PLAYERNO =
        (SELECT   PLAYERNO
         FROM     TEAMS
         WHERE    TEAMS.PLAYERNO = PENALTIES.PLAYERNO)

Answer 8.14:

SELECT   PLAYERNO, NAME, TOWN
FROM     PLAYERS
WHERE    SEX = 'F'
AND      TOWN <> 'Stratford'
;
SELECT   PLAYERNO, NAME, TOWN
FROM     PLAYERS
WHERE    SEX = 'F'
AND      NOT (TOWN = 'Stratford')

Answer 8.15:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    JOINED >= 1970
AND      JOINED <= 1980
;
SELECT   PLAYERNO
FROM     PLAYERS
WHERE    NOT (JOINED < 1970 OR JOINED > 1980)

Answer 8.16:

SELECT   PLAYERNO, NAME, BIRTH_DATE
FROM     PLAYERS
WHERE    MOD(YEAR(BIRTH_DATE), 400) = 0
OR      (MOD(YEAR(BIRTH_DATE), 4) = 0
         AND NOT(MOD(YEAR(BIRTH_DATE), 100) = 0))

Answer 8.17:

SELECT   MATCHNO, NAME, INITIALS, DIVISION
FROM     MATCHES AS M, PLAYERS AS P, TEAMS AS T
WHERE    M.PLAYERNO = P.PLAYERNO
AND      M.TEAMNO = T.TEAMNO
AND      YEAR(BIRTH_DATE) > 1965
AND      WON > LOST

Answer 8.18:

SELECT   PAYMENTNO
FROM     PENALTIES
WHERE    AMOUNT IN (50, 75, 100)

Answer 8.19:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    TOWN NOT IN ('Stratford', 'Douglas')
;
SELECT   PLAYERNO
FROM     PLAYERS
WHERE    NOT (TOWN IN ('Stratford', 'Douglas'))
;
SELECT   PLAYERNO
FROM     PLAYERS
WHERE    TOWN <> 'Stratford'
AND      TOWN <> 'Douglas'

Answer 8.20:

SELECT   PAYMENTNO
FROM     PENALTIES
WHERE    AMOUNT IN
        (100, PAYMENTNO * 5,
        (SELECT   AMOUNT
         FROM     PENALTIES
         WHERE    PAYMENTNO = 2))

Answer 8.21:

SELECT   PLAYERNO, TOWN, STREET
FROM     PLAYERS
WHERE   (TOWN, STREET) IN
       (('Stratford','Haseltine Lane'),
        ('Stratford','Edgecombe Way'))

Answer 8.22:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PENALTIES)

Answer 8.23:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PENALTIES
         WHERE    AMOUNT > 50)

Answer 8.24:

SELECT   TEAMNO, PLAYERNO
FROM     TEAMS
WHERE    DIVISION = 'first'
AND      PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PLAYERS
         WHERE    TOWN = 'Stratford')

Answer 8.25:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PENALTIES)
AND      PLAYERNO NOT IN
        (SELECT   PLAYERNO
         FROM     TEAMS
         WHERE    DIVISION = 'first')
;
SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PENALTIES
         WHERE    PLAYERNO NOT IN
                 (SELECT   PLAYERNO
                  FROM     TEAMS
                  WHERE    DIVISION = 'first'))

Answer 8.27:

SELECT   MATCHNO, PLAYERNO
FROM     MATCHES
WHERE   (WON, LOST) IN
        (SELECT   WON, LOST
         FROM     MATCHES
         WHERE    TEAMNO IN
                 (SELECT   TEAMNO
                  FROM     TEAMS
                  WHERE    DIVISION = 'second'))

Answer 8.28:

SELECT   PLAYERNO, NAME
FROM     PLAYERS AS P1
WHERE   (TOWN, STREET, HOUSENO, POSTCODE) IN
        (SELECT   TOWN, STREET, HOUSENO, POSTCODE
         FROM     PLAYERS AS P2
         WHERE    P1.PLAYERNO <> P2.PLAYERNO)

Answer 8.29:

SELECT   PAYMENTNO
FROM     PENALTIES
WHERE    AMOUNT BETWEEN 50 AND 100

Answer 8.30:

SELECT   PAYMENTNO
FROM     PENALTIES
WHERE    NOT (AMOUNT BETWEEN 50 AND 100)
;
SELECT   PAYMENTNO
FROM     PENALTIES
WHERE    AMOUNT NOT BETWEEN 50 AND 100
;
SELECT   PAYMENTNO
FROM     PENALTIES
WHERE    AMOUNT < 50
OR       AMOUNT > 100

Answer 8.31:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    JOINED BETWEEN
         YEAR(BIRTH_DATE + INTERVAL 16 YEAR + INTERVAL 1 DAY)
         AND YEAR(BIRTH_DATE + INTERVAL 40 YEAR – INTERVAL 1 DAY)

Answer 8.32:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    NAME LIKE '%is%'

Answer 8.33:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    NAME LIKE '______'

Answer 8.34:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    NAME LIKE '______%'
;
SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    NAME LIKE '%______'
;
SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    NAME LIKE '%______%'
;
SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    LENGTH(RTRIM(NAME)) > 6

Answer 8.35:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    NAME LIKE '_r%r_'

Answer 8.36:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    TOWN LIKE '_@%%@%_' ESCAPE '@'

Answer 8.37:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    NAME REGEXP 'en'

Answer 8.38:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    NAME REGEXP '^n.*e$'

Answer 8.39:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    NAME REGEXP '[a-z]{9}'

Answer 8.40:

SELECT   BOOKNO, SUMMARY
FROM     BOOKS
WHERE    MATCH(SUMMARY)
         AGAINST ('students' IN NATURAL LANGUAGE MODE)

Answer 8.41:

SELECT   BOOKNO, SUMMARY
FROM     BOOKS
WHERE    MATCH(SUMMARY)
         AGAINST ('database' IN BOOLEAN MODE)

Answer 8.42:

SELECT   BOOKNO, SUMMARY
FROM     BOOKS
WHERE    MATCH(SUMMARY)
         AGAINST ('database languages'
         IN NATURAL LANGUAGE MODE)

Answer 8.43:

SELECT   BOOKNO, SUMMARY
FROM     BOOKS
WHERE    MATCH(SUMMARY)
         AGAINST ('+database -languages' IN BOOLEAN MODE)

Answer 8.44:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    LEAGUENO IS NULL

Answer 8.46:

SELECT   NAME, INITIALS
FROM     PLAYERS
WHERE    EXISTS
        (SELECT   *
         FROM     TEAMS
         WHERE    PLAYERNO = PLAYERS.PLAYERNO)

Answer 8.47:

SELECT   NAME, INITIALS
FROM     PLAYERS AS P
WHERE    NOT EXISTS
        (SELECT   *
         FROM     TEAMS AS T
         WHERE    T.PLAYERNO = P.PLAYERNO
         AND      EXISTS
                 (SELECT   *
                  FROM     MATCHES AS M
                  WHERE    M.TEAMNO = T.TEAMNO
                  AND      M.PLAYERNO = 112))

Answer 8.48:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    BIRTH_DATE <= ALL
        (SELECT   BIRTH_DATE
         FROM     PLAYERS
         WHERE    TOWN = 'Stratford')
AND      TOWN = 'Stratford'

Answer 8.49:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    PLAYERNO = ANY
        (SELECT   PLAYERNO
         FROM     PENALTIES)

Answer 8.50:

SELECT   PAYMENTNO, AMOUNT, PAYMENT_DATE
FROM     PENALTIES AS PEN1
WHERE    AMOUNT >= ALL
        (SELECT   AMOUNT
         FROM     PENALTIES AS PEN2
         WHERE    YEAR(PEN1.PAYMENT_DATE) =
                  YEAR(PEN2.PAYMENT_DATE))

Answer 8.51:

SELECT  (SELECT   PLAYERNO
         FROM     PLAYERS
         WHERE    PLAYERNO <= ALL
                 (SELECT   PLAYERNO
                  FROM     PLAYERS)),
        (SELECT   PLAYERNO
         FROM     PLAYERS
         WHERE    PLAYERNO >= ALL
                 (SELECT   PLAYERNO
                  FROM     PLAYERS))

Answer 8.53:

SELECT   NAME, INITIALS
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     MATCHES
         WHERE    TEAMNO IN
                 (SELECT   TEAMNO
                  FROM     TEAMS
                  WHERE    DIVISION = 'first'))
AND      PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     MATCHES
         WHERE    WON > LOST)
AND      PLAYERNO NOT IN
        (SELECT   PLAYERNO
         FROM     PENALTIES)

Answer 8.54:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     MATCHES
         WHERE    TEAMNO = 1)
AND      PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     MATCHES
         WHERE    TEAMNO = 2)

Answer 8.55:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    EXISTS
        (SELECT   *
         FROM     PENALTIES
         WHERE    PLAYERNO = PLAYERS.PLAYERNO)

Answer 8.56:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT  PLAYERNO
         FROM    MATCHES AS M1
         WHERE   WON > LOST
         AND     EXISTS
                (SELECT  *
                 FROM    MATCHES AS M2
                 WHERE   M1.PLAYERNO = M2.PLAYERNO
                 AND     WON > LOST
                 AND     M1.MATCHNO <> M2.MATCHNO))
;
SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    1 < (SELECT   COUNT(*)
              FROM     MATCHES
              WHERE    WON > LOST
              AND      PLAYERS.PLAYERNO = PLAYERNO)

Answer 8.57:

SELECT   NAME, INITIALS
FROM     PLAYERS
WHERE    NOT EXISTS
        (SELECT   *
         FROM     PENALTIES
         WHERE    PLAYERS.PLAYERNO = PLAYERNO
         AND      PAYMENT_DATE BETWEEN '1980-01-01'
                  AND '1980-12-31')

Answer 8.58:

SELECT   DISTINCT PLAYERNO
FROM     PENALTIES AS PEN1
WHERE    EXISTS
        (SELECT   *
         FROM     PENALTIES AS PEN2
         WHERE    PEN1.AMOUNT = PEN2.AMOUNT
         AND      PEN1.PAYMENTNO <> PEN2.PAYMENTNO)

Answer 8.59:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    PLAYERNO NOT IN
        (SELECT   PLAYERNO
         FROM     MATCHES WHERE WON = 3)

Answer 8.60:

SELECT   TEAMNO, DIVISION
FROM     TEAMS
WHERE    TEAMNO NOT IN
        (SELECT   TEAMNO
         FROM     MATCHES
         WHERE    PLAYERNO = 6)

Answer 8.61:

SELECT   DISTINCT PLAYERNO
FROM     MATCHES
WHERE    PLAYERNO NOT IN
        (SELECT   PLAYERNO
         FROM     MATCHES
         WHERE    TEAMNO IN
                 (SELECT   TEAMNO
                  FROM     MATCHES
                  WHERE    PLAYERNO = 57))

Example 9.1:

SELECT   *
FROM     PENALTIES
;
SELECT   PAYMENTNO, PLAYERNO, PAYMENT_DATE, AMOUNT
FROM     PENALTIES

Example 9.2:

SELECT   PENALTIES.*
FROM     PENALTIES INNER JOIN TEAMS
         ON PENALTIES.PLAYERNO = TEAMS.PLAYERNO
;
SELECT   PENALTIES.PAYMENTNO, PENALTIES.PLAYERNO,
         PENALTIES.PAYMENT_DATE, PENALTIES.AMOUNT
FROM     PENALTIES INNER JOIN TEAMS
         ON PENALTIES.PLAYERNO = TEAMS.PLAYERNO
;
SELECT   PEN.*
FROM     PENALTIES AS PEN INNER JOIN TEAMS
         ON PEN.PLAYERNO = TEAMS.PLAYERNO

Example 9.3:

SELECT   MATCHNO, 'Tally', WON - LOST,
         WON * 10
FROM     MATCHES

Example 9.4:

SELECT   TOWN
FROM     PLAYERS
;
SELECT   DISTINCT TOWN
FROM     PLAYERS

Example 9.5:

SELECT   STREET, TOWN
FROM     PLAYERS
;
SELECT   DISTINCT STREET, TOWN
FROM     PLAYERS
;
SELECT   TOWN
FROM     PLAYERS
;
SELECT   ALL TOWN
FROM     PLAYERS

Example 9.6:

SELECT   DISTINCT LEAGUENO
FROM     PLAYERS

Example 9.7:

SELECT   DISTINCT *
FROM    (SELECT   1 AS A, 'Hello' AS B, 4 AS C UNION
         SELECT   1, 'Hello', NULL UNION
         SELECT   1, 'Hello', NULL UNION
         SELECT   1, NULL, NULL) AS X

Example 9.8:

SELECT   COUNT(*)
FROM     PLAYERS

Example 9.9:

SELECT   COUNT(*)
FROM     PLAYERS
WHERE    TOWN = 'Stratford'
;
SELECT   COUNT(*), PLAYERNO
FROM     PLAYERS
;
SELECT   'The number of players', COUNT(*)
FROM     PLAYERS

Example 9.10:

SELECT   COUNT(LEAGUENO)
FROM     PLAYERS
;
SELECT   COUNT(ALL LEAGUENO)
FROM     PLAYERS

Example 9.11:

SELECT   COUNT(DISTINCT TOWN)
FROM     PLAYERS

Example 9.12:

SELECT   COUNT(DISTINCT SUBSTR(NAME, 1, 1))
FROM     PLAYERS

Example 9.13:

SELECT   COUNT(DISTINCT YEAR(PAYMENT_DATE))
FROM     PENALTIES

Example 9.14:

SELECT   COUNT(DISTINCT TOWN), COUNT(DISTINCT SEX)
FROM     PLAYERS

Example 9.15:

SELECT   PLAYERNO, NAME
FROM     PLAYERS AS P
WHERE   (SELECT   COUNT(*)
         FROM     PENALTIES AS PEN
         WHERE    P.PLAYERNO = PEN.PLAYERNO)
         >
        (SELECT   COUNT(*)
         FROM     MATCHES AS M
         WHERE    P.PLAYERNO = M.PLAYERNO)

Example 9.16:

SELECT   PLAYERNO, NAME,
        (SELECT   COUNT(*)
         FROM     PENALTIES
         WHERE    PENALTIES.PLAYERNO = PLAYERS.PLAYERNO)
         AS NUMBER
FROM     PLAYERS
WHERE   (SELECT   COUNT(*)
         FROM     PENALTIES
         WHERE    PENALTIES.PLAYERNO = PLAYERS.PLAYERNO) >= 2
;
SELECT   PLAYERNO, NAME, NUMBER
FROM    (SELECT   PLAYERNO, NAME,
                 (SELECT   COUNT(*)
                  FROM     PENALTIES
                  WHERE    PENALTIES.PLAYERNO =
                           PLAYERS.PLAYERNO)
                  AS NUMBER
         FROM     PLAYERS) AS PN
WHERE    NUMBER >= 2

Example 9.17:

SELECT (SELECT   COUNT(*)
        FROM     PENALTIES),
       (SELECT   COUNT(*)
        FROM     MATCHES)

Example 9.18:

SELECT   MAX(AMOUNT)
FROM     PENALTIES

Example 9.19:

SELECT   MIN(AMOUNT)
FROM     PENALTIES
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PLAYERS
         WHERE    TOWN = 'Stratford')

Example 9.20:

SELECT   COUNT(*)
FROM     PENALTIES
WHERE    AMOUNT =
        (SELECT   MIN(AMOUNT)
         FROM     PENALTIES)

Example 9.21:

SELECT   DISTINCT TEAMNO, PLAYERNO
FROM     MATCHES AS M1
WHERE    WON =
        (SELECT   MAX(WON)
         FROM     MATCHES AS M2
         WHERE    M1.TEAMNO = M2.TEAMNO)

Example 9.22:

SELECT   (MAX(AMOUNT) - MIN(AMOUNT)) * 100
FROM     PENALTIES

Example 9.23:

SELECT   SUBSTR(MAX(NAME), 1, 1)
FROM     PLAYERS

Example 9.24:

SELECT   MAX(LEAGUENO)
FROM     PLAYERS
WHERE    TOWN = 'Midhurst'

Example 9.25:

SELECT   CASE WHEN MIN(LEAGUENO) IS NULL
            THEN 'Unknown'
            ELSE MIN(LEAGUENO)
         END
FROM     PLAYERS
WHERE    TOWN = 'Amsterdam'

Example 9.26:

SELECT   PLAYERNO, AMOUNT, PAYMENT_DATE
FROM     PENALTIES AS PEN1
WHERE    AMOUNT =
        (SELECT   MAX(AMOUNT)
         FROM     PENALTIES AS PEN2
         WHERE    PEN2.PLAYERNO = PEN1.PLAYERNO)

Example 9.27:

SELECT   PLAYERNO,
        (SELECT   MAX(AMOUNT)
         FROM     PENALTIES
         WHERE    PENALTIES.PLAYERNO = PLAYERS.PLAYERNO)
         AS HIGHESTPENALTY,
        (SELECT   MAX(WON)
         FROM     MATCHES
         WHERE    MATCHES.PLAYERNO = PLAYERS.PLAYERNO)
         AS NUMBEROFSETS
FROM     PLAYERS

Example 9.28:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE   (SELECT   MIN(AMOUNT)
         FROM     PENALTIES
         WHERE    PENALTIES.PLAYERNO = PLAYERS.PLAYERNO) =
        (SELECT   MAX(AMOUNT)
         FROM     PENALTIES
         WHERE    PENALTIES.PLAYERNO = PLAYERS.PLAYERNO)

Example 9.29:

SELECT   SUM(AMOUNT)
FROM     PENALTIES
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PLAYERS
         WHERE    TOWN = 'Inglewood')
;
SELECT   SUM(DISTINCT AMOUNT)
FROM     PENALTIES
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PLAYERS
         WHERE    TOWN = 'Inglewood')

Example 9.30:

SELECT   AVG(AMOUNT)
FROM     PENALTIES
WHERE    PLAYERNO = 44

Example 9.31:

SELECT   DISTINCT PLAYERNO
FROM     PENALTIES
WHERE    AMOUNT >
        (SELECT   AVG(AMOUNT)
         FROM     PENALTIES)

Example 9.32:

SELECT   AVG(DISTINCT AMOUNT)
FROM     PENALTIES

Example 9.33:

SELECT   AVG(LENGTH(RTRIM(NAME))), MAX(LENGTH(RTRIM(NAME)))
FROM     PLAYERS

Example 9.34:

SELECT   PAYMENTNO, AMOUNT,
         ABS(AMOUNT - (SELECT AVG(AMOUNT)
                       FROM   PENALTIES)) AS DIFFERENCE
FROM     PENALTIES AS P

Example 9.35:

SELECT   VARIANCE(AMOUNT)
FROM     PENALTIES
WHERE    PLAYERNO = 44
;
SELECT   AMOUNT –
        (SELECT   AVG(AMOUNT)
         FROM     PENALTIES
         WHERE    PLAYERNO = 44)
FROM     PENALTIES
WHERE    PLAYERNO = 44
SELECT   SUM(P)
FROM    (SELECT   POWER(AMOUNT -
                 (SELECT   AVG(AMOUNT)
                  FROM     PENALTIES
                  WHERE    PLAYERNO = 44),2) AS P
         FROM     PENALTIES
         WHERE    PLAYERNO = 44) AS POWERS
;
SELECT   SUM(P) /
        (SELECT COUNT(*) FROM PENALTIES WHERE PLAYERNO = 44)
FROM    (SELECT   POWER(AMOUNT -
                  (SELECT   AVG(AMOUNT)
                  FROM     PENALTIES
                  WHERE    PLAYERNO = 44),2) AS P
         FROM     PENALTIES
         WHERE    PLAYERNO = 44) AS POWERS

Example 9.36:

SELECT   STDDEV(AMOUNT)
FROM     PENALTIES
WHERE    PLAYERNO = 44

Example 9.37:

SELECT   VAR_SAMP(AMOUNT), VARIANCE(AMOUNT)
FROM     PENALTIES

Example 9.38:

SELECT   STDDEV_SAMP(AMOUNT), STDDEV(AMOUNT)
FROM     PENALTIES

Example 9.39:

CREATE TABLE BITS
      (BIN_VALUE INTEGER NOT NULL PRIMARY KEY)
;
INSERT INTO BITS
VALUES (CONV(001,2,16)),
       (CONV(011,2,16)),
       (CONV(111,2,16))

Example 9.40:

SELECT   BIN(BIT_OR(BIN_VALUE))
FROM     BITS

Answer 9.4:

SELECT   COUNT(*), MAX(AMOUNT)
FROM     PENALTIES

Answer 9.5:

SELECT   COUNT(DISTINCT POSITION)
FROM     COMMITTEE_MEMBERS

Answer 9.6:

SELECT   COUNT(LEAGUENO)
FROM     PLAYERS
WHERE    TOWN = 'Inglewood'

Answer 9.7:

SELECT   TEAMNO, DIVISION,
        (SELECT   COUNT(*)
         FROM     MATCHES
         WHERE    TEAMS.TEAMNO = MATCHES.TEAMNO)
FROM     TEAMS

Answer 9.8:

SELECT   PLAYERNO, NAME,
        (SELECT   COUNT(*)
         FROM     MATCHES
         WHERE    MATCHES.PLAYERNO = PLAYERS.PLAYERNO
         AND      WON > LOST)
FROM     PLAYERS

Answer 9.9:

SELECT 'Number of players' AS TABLES,
        (SELECT COUNT(*) FROM PLAYERS) AS NUMBERS UNION
SELECT 'Number of teams',
        (SELECT COUNT(*) FROM TEAMS) UNION
SELECT 'Number of matches',
        (SELECT COUNT(*) FROM MATCHES)

Answer 9.10:

SELECT   MIN(WON)
FROM     MATCHES
WHERE    WON > LOST

Answer 9.11:

SELECT   PLAYERNO,
        (SELECT   MAX(AMOUNT)
         FROM     PENALTIES
         WHERE    PENALTIES.PLAYERNO =
                  PLAYERS.PLAYERNO) -
        (SELECT   MIN(AMOUNT)
         FROM     PENALTIES
         WHERE    PENALTIES.PLAYERNO =
                  PLAYERS.PLAYERNO)
FROM     PLAYERS

Answer 9.12:

SELECT   PLAYERNO, BIRTH_DATE
FROM     PLAYERS
WHERE    YEAR(BIRTH_DATE) =
        (SELECT   MAX(YEAR(BIRTH_DATE))
         FROM     PLAYERS
         WHERE    PLAYERNO IN
                 (SELECT   PLAYERNO
                  FROM     MATCHES
                  WHERE    TEAMNO = 1))

Answer 9.14:

SELECT   AVG(AMOUNT)
FROM     PENALTIES
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     MATCHES
         WHERE    TEAMNO = 1)

Answer 9.15:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE   (SELECT   SUM(AMOUNT)
         FROM     PENALTIES
         WHERE    PENALTIES.PLAYERNO = PLAYERS.PLAYERNO)
         > 100

Answer 9.16:

SELECT   NAME, INITIALS
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     MATCHES
         WHERE    WON >
                 (SELECT   SUM(WON)
                  FROM     MATCHES
                  WHERE    PLAYERNO = 27))

Answer 9.17:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE   (SELECT   SUM(WON)
         FROM     MATCHES
         WHERE    MATCHES.PLAYERNO =
                  PLAYERS.PLAYERNO) = 8

Answer 9.18:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    LENGTH(RTRIM(NAME)) >
        (SELECT   AVG(LENGTH(RTRIM(NAME)))
         FROM     PLAYERS)

Answer 9.19:

SELECT   PLAYERNO,
        (SELECT   MAX(AMOUNT)
         FROM     PENALTIES
         WHERE    PENALTIES.PLAYERNO =
                  PLAYERS.PLAYERNO) -
        (SELECT   AVG(AMOUNT)
         FROM     PENALTIES
         WHERE    PENALTIES.PLAYERNO =
                  PLAYERS.PLAYERNO)
FROM     PLAYERS

Answer 9.20:

SELECT   PLAYERNO,
         REPEAT('*',
            CAST((SELECT   AVG(AMOUNT)
                  FROM     PENALTIES
                  WHERE    PENALTIES.PLAYERNO =
                           PLAYERS.PLAYERNO)/10
                  AS SIGNED INTEGER))
FROM     PLAYERS

Answer 9.21:

SELECT   SQRT(SUM(P) /
        (SELECT COUNT(*) FROM PENALTIES WHERE
                         PLAYERNO = 44))
FROM    (SELECT   POWER(AMOUNT -
                  (SELECT   AVG(AMOUNT)
                  FROM     PENALTIES
                  WHERE    PLAYERNO = 44),2) AS P
         FROM     PENALTIES
         WHERE    PLAYERNO = 44) AS POWERS

Example 10.1:

SELECT   TOWN
FROM     PLAYERS
GROUP BY TOWN

Example 10.2:

SELECT   TOWN, COUNT(*)
FROM     PLAYERS
GROUP BY TOWN

Example 10.3:

SELECT   TEAMNO, COUNT(*), SUM(WON)
FROM     MATCHES
GROUP BY TEAMNO

Example 10.4:

SELECT   TEAMNO, COUNT(*)
FROM     MATCHES
WHERE    TEAMNO IN
        (SELECT   TEAMNO
         FROM     TEAMS INNER JOIN PLAYERS
                  ON TEAMS.PLAYERNO = PLAYERS.PLAYERNO
         WHERE    TOWN = 'Eltham')
GROUP BY TEAMNO

Example 10.5:

SELECT   AMOUNT, COUNT(*), SUM(AMOUNT)
FROM     PENALTIES
GROUP BY AMOUNT

Example 10.6:

SELECT   TEAMNO, PLAYERNO
FROM     MATCHES
GROUP BY TEAMNO, PLAYERNO
;
SELECT   TEAMNO, PLAYERNO
FROM     MATCHES
GROUP BY PLAYERNO, TEAMNO
;
SELECT   TEAMNO, PLAYERNO, SUM(WON),
         COUNT(*), MIN(LOST)
FROM     MATCHES
GROUP BY TEAMNO, PLAYERNO

Example 10.7:

SELECT   P.PLAYERNO, NAME, SUM(AMOUNT)
FROM     PLAYERS AS P INNER JOIN PENALTIES AS PEN
         ON P.PLAYERNO = PEN.PLAYERNO
GROUP BY P.PLAYERNO, NAME

Example 10.8:

SELECT   YEAR(PAYMENT_DATE), COUNT(*)
FROM     PENALTIES
GROUP BY YEAR(PAYMENT_DATE)

Example 10.9:

SELECT   TRUNCATE(PLAYERNO/25,0), COUNT(*), MAX(PLAYERNO)
FROM     PLAYERS
GROUP BY TRUNCATE(PLAYERNO/25,0)

Example 10.10:

SELECT   LEAGUENO
FROM     PLAYERS
GROUP BY LEAGUENO

Example 10.11:

SELECT   TEAMNO, COUNT(*)
FROM     MATCHES
GROUP BY TEAMNO
ORDER BY TEAMNO DESC
;
SELECT   TEAMNO, COUNT(*)
FROM     MATCHES
GROUP BY TEAMNO DESC

Example 10.12:

SELECT   CAST(AMOUNT * 100 AS SIGNED INTEGER)
         AS AMOUNT_IN_CENTS
FROM     PENALTIES
GROUP BY AMOUNT

Example 10.13:

SELECT   TEAMNO, GROUP_CONCAT(PLAYERNO)
FROM     MATCHES
GROUP BY TEAMNO

Example 10.14:

SELECT   TEAMNO, GROUP_CONCAT(TEAMNO)
FROM     MATCHES
GROUP BY TEAMNO

Example 10.15:

SELECT   GROUP_CONCAT(PAYMENTNO)
FROM     PENALTIES

Example 10.16:

SET @@GROUP_CONCAT_MAX_LEN=7
;
SELECT   TEAMNO, GROUP_CONCAT(TEAMNO)
FROM     MATCHES
GROUP BY TEAMNO

Example 10.17:

SELECT   AVG(TOTAL)
FROM    (SELECT   PLAYERNO, SUM(AMOUNT) AS TOTAL
         FROM     PENALTIES
         GROUP BY PLAYERNO) AS TOTALS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PLAYERS
         WHERE    TOWN = 'Stratford' OR TOWN = 'Inglewood')

Example 10.18:

SELECT   PLAYERS.PLAYERNO, NAME, NUMBER_OF_PENALTIES,
         NUMBER_OF_TEAMS
FROM     PLAYERS,
        (SELECT   PLAYERNO, COUNT(*) AS NUMBER_OF_PENALTIES
         FROM     PENALTIES
         GROUP BY PLAYERNO) AS NUMBER_PENALTIES,
        (SELECT   PLAYERNO, COUNT(*) AS NUMBER_OF_TEAMS
         FROM     TEAMS
         GROUP BY PLAYERNO) AS NUMBER_TEAMS
WHERE    PLAYERS.PLAYERNO = NUMBER_PENALTIES.PLAYERNO
AND      PLAYERS.PLAYERNO = NUMBER_TEAMS.PLAYERNO
;
SELECT   PLAYERS.PLAYERNO, NAME,
        (SELECT   COUNT(*)
         FROM     PENALTIES
         WHERE    PLAYERS.PLAYERNO =
                  PENALTIES.PLAYERNO) AS NUMBER_OF_PENALTIES,
        (SELECT   COUNT(*)
         FROM     TEAMS
         WHERE    PLAYERS.PLAYERNO =
                  TEAMS.PLAYERNO) AS NUMBER_OF_TEAMS
FROM     PLAYERS

Example 10.19:

SELECT   DISTINCT M.PLAYERNO, NUMBERP
FROM     MATCHES AS M LEFT OUTER JOIN
           (SELECT   PLAYERNO, COUNT(*) AS NUMBERP
            FROM     PENALTIES
            GROUP BY PLAYERNO) AS NP
         ON M.PLAYERNO = NP.PLAYERNO

Example 10.20:

SELECT   GROUPS.PGROUP, SUM(P.AMOUNT)
FROM     PENALTIES AS P,
        (SELECT 1 AS PGROUP, '1980-01-01' AS START,
                '1981-06-30' AS END
         UNION
         SELECT 2, '1981-07-01', '1982-12-31'
         UNION
         SELECT 3, '1983-01-01', '1984-12-31') AS GROUPS
WHERE    P.PAYMENT_DATE BETWEEN START AND END
GROUP BY GROUPS.PGROUP
ORDER BY GROUPS.PGROUP

Example 10.21:

SELECT   P1.PAYMENTNO, P1.AMOUNT, SUM(P2.AMOUNT)
FROM     PENALTIES AS P1, PENALTIES AS P2
WHERE    P1.PAYMENTNO >= P2. PAYMENTNO
GROUP BY P1. PAYMENTNO, P1.AMOUNT
ORDER BY P1. PAYMENTNO

Example 10.22:

SELECT   P1.PAYMENTNO, P1.AMOUNT,
         (P1.AMOUNT * 100) / SUM(P2.AMOUNT)
FROM     PENALTIES AS P1, PENALTIES AS P2
GROUP BY P1.PAYMENTNO, P1.AMOUNT
ORDER BY P1.PAYMENTNO

Example 10.23:

SELECT   PLAYERNO, SUM(AMOUNT)
FROM     PENALTIES
GROUP BY PLAYERNO
UNION
SELECT   NULL, SUM(AMOUNT)
FROM     PENALTIES
;
SELECT   PLAYERNO, SUM(AMOUNT)
FROM     PENALTIES
GROUP BY PLAYERNO WITH ROLLUP

Example 10.24:

SELECT   SEX, TOWN, COUNT(*)
FROM     PLAYERS
GROUP BY SEX, TOWN WITH ROLLUP

Answer 10.1:

SELECT   JOINED
FROM     PLAYERS
GROUP BY JOINED

Answer 10.2:

SELECT   JOINED, COUNT(*)
FROM     PLAYERS
GROUP BY JOINED

Answer 10.3:

SELECT   PLAYERNO, AVG(AMOUNT), COUNT(*)
FROM     PENALTIES
GROUP BY PLAYERNO

Answer 10.4:

SELECT   TEAMNO, COUNT(*), SUM(WON)
FROM     MATCHES
WHERE    TEAMNO IN
        (SELECT   TEAMNO
         FROM     TEAMS
         WHERE    DIVISION = 'first')
GROUP BY TEAMNO

Answer 10.5:

SELECT   WON, LOST, COUNT(*)
FROM     MATCHES
WHERE    WON > LOST
GROUP BY WON, LOST
ORDER BY WON, LOST

Answer 10.6:

SELECT   P.TOWN, T.DIVISION, SUM(WON)
FROM    (MATCHES AS M INNER JOIN PLAYERS AS P
         ON M.PLAYERNO = P.PLAYERNO)
         INNER JOIN TEAMS AS T
         ON M.TEAMNO = T.TEAMNO
GROUP BY P.TOWN, T.DIVISION
ORDER BY P.TOWN

Answer 10.7:

SELECT   NAME, INITIALS, COUNT(*)
FROM     PLAYERS AS P INNER JOIN PENALTIES AS PEN
         ON P.PLAYERNO = PEN.PLAYERNO
WHERE    P.TOWN = 'Inglewood'
GROUP BY P.PLAYERNO, NAME, INITIALS

Answer 10.8:

SELECT   T.TEAMNO, DIVISION, SUM(WON)
FROM     TEAMS AS T, MATCHES AS M
WHERE    T.TEAMNO = M.TEAMNO
GROUP BY T.TEAMNO, DIVISION

Answer 10.9:

SELECT   LENGTH(RTRIM(NAME)), COUNT(*)
FROM     PLAYERS
GROUP BY LENGTH(RTRIM(NAME))

Answer 10.10:

SELECT   ABS(WON - LOST), COUNT(*)
FROM     MATCHES
GROUP BY ABS(WON – LOST)

Answer 10.11:

SELECT   YEAR(BEGIN_DATE), MONTH(BEGIN_DATE), COUNT(*)
FROM     COMMITTEE_MEMBERS
GROUP BY YEAR(BEGIN_DATE), MONTH(BEGIN_DATE)
ORDER BY YEAR(BEGIN_DATE), MONTH(BEGIN_DATE)

Answer 10.14:

SELECT   AVG(NUMBERS)
FROM    (SELECT   COUNT(*) AS NUMBERS
         FROM     PLAYERS
         GROUP BY TOWN) AS TOWNS

Answer 10.15:

SELECT   TEAMS.TEAMNO, DIVISION, NUMBER_PLAYERS
FROM     TEAMS LEFT OUTER JOIN
        (SELECT   TEAMNO, COUNT(*) AS NUMBER_PLAYERS
         FROM     MATCHES
         GROUP BY TEAMNO) AS M
         ON (TEAMS.TEAMNO = M.TEAMNO)

Answer 10.16:

SELECT   PLAYERS.PLAYERNO, NAME, SUM_AMOUNT,
         NUMBER_TEAMS
FROM    (PLAYERS LEFT OUTER JOIN
        (SELECT   PLAYERNO, SUM(AMOUNT) AS SUM_AMOUNT
         FROM     PENALTIES
         GROUP BY PLAYERNO) AS TOTALS
         ON (PLAYERS.PLAYERNO = TOTALS.PLAYERNO))
            LEFT OUTER JOIN
           (SELECT   PLAYERNO, COUNT(*) AS NUMBER_TEAMS
            FROM     TEAMS
            WHERE    DIVISION = 'first'
            GROUP BY PLAYERNO) AS NUMBERS
            ON (PLAYERS.PLAYERNO = NUMBERS.PLAYERNO)

Answer 10.17:

SELECT   TEAMNO, COUNT(DISTINCT PLAYERNO)
FROM     MATCHES
WHERE    TEAMNO IN
        (SELECT   TEAMNO
         FROM     PLAYERS AS P INNER JOIN TEAMS AS T
                  ON P.PLAYERNO = T.PLAYERNO
         AND      TOWN = 'Stratford')
AND      WON > LOST
GROUP BY TEAMNO

Answer 10.18:

SELECT   PLAYERNO, NAME, JOINED - AVERAGE
FROM     PLAYERS,
        (SELECT   AVG(JOINED) AS AVERAGE
         FROM     PLAYERS) AS T

Answer 10.19:

SELECT   PLAYERNO, NAME, JOINED – AVERAGE
FROM     PLAYERS,
        (SELECT   TOWN, AVG(JOINED) AS AVERAGE
         FROM     PLAYERS
         GROUP BY TOWN) AS TOWNS
WHERE    PLAYERS.TOWN = TOWNS.TOWN

Answer 10.20:

SELECT   TEAMNO, COUNT(*)
FROM     MATCHES
GROUP BY TEAMNO WITH ROLLUP

Answer 10.21:

SELECT   P.NAME, T.DIVISION, SUM(WON)
FROM    (MATCHES AS M INNER JOIN PLAYERS AS P
         ON M.PLAYERNO = P.PLAYERNO)
         INNER JOIN TEAMS AS T
         ON M.TEAMNO = T.TEAMNO
GROUP BY P.NAME, T.DIVISION WITH ROLLUP

Example 11.1:

SELECT   PLAYERNO
FROM     PENALTIES
GROUP BY PLAYERNO
HAVING   COUNT(*) > 1

Example 11.2:

SELECT   PLAYERNO
FROM     PENALTIES
GROUP BY PLAYERNO
HAVING   MAX(YEAR(PAYMENT_DATE)) = 1984

Example 11.3:

SELECT   PLAYERNO, SUM(AMOUNT)
FROM     PENALTIES
GROUP BY PLAYERNO
HAVING   SUM(AMOUNT) > 150

Example 11.4:

SELECT   PLAYERNO, SUM(AMOUNT)
FROM     PENALTIES
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     TEAMS)
GROUP BY PLAYERNO
HAVING   SUM(AMOUNT) > 80

Example 11.5:

SELECT   PLAYERNO, SUM(AMOUNT)
FROM     PENALTIES
GROUP BY PLAYERNO
HAVING   SUM(AMOUNT) >= ALL
        (SELECT   SUM(AMOUNT)
         FROM     PENALTIES
         GROUP BY PLAYERNO)

Example 11.6:

SELECT   SUM(AMOUNT)
FROM     PENALTIES
HAVING   SUM(AMOUNT) >= 250

Example 11.7:

SELECT   GROUP_CONCAT(PLAYERNO) AS LIST
FROM     MATCHES
HAVING   TRUE

Answer 11.1:

SELECT   TOWN
FROM     PLAYERS
GROUP BY TOWN
HAVING   COUNT(*) > 4

Answer 11.2:

SELECT   PLAYERNO
FROM     PENALTIES
GROUP BY PLAYERNO
HAVING   SUM(AMOUNT) > 150

Answer 11.3:

SELECT   NAME, INITIALS, COUNT(*)
FROM     PLAYERS INNER JOIN PENALTIES
         ON PLAYERS.PLAYERNO = PENALTIES.PLAYERNO
GROUP BY PLAYERS.PLAYERNO, NAME, INITIALS
HAVING   COUNT(*) > 1

Answer 11.4:

SELECT   TEAMNO, COUNT(*)
FROM     MATCHES
GROUP BY TEAMNO
HAVING   COUNT(*) >= ALL
        (SELECT   COUNT(*)
         FROM     MATCHES
         GROUP BY TEAMNO)

Answer 11.5:

SELECT   TEAMNO, DIVISION
FROM     TEAMS
WHERE    TEAMNO IN
        (SELECT   TEAMNO
         FROM     MATCHES
         GROUP BY TEAMNO
         HAVING   COUNT(DISTINCT PLAYERNO) > 4)

Answer 11.6:

SELECT   NAME, INITIALS
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PENALTIES
         WHERE    AMOUNT > 40
         GROUP BY PLAYERNO
         HAVING   COUNT(*) >= 2)

Answer 11.7:

SELECT   NAME, INITIALS
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PENALTIES
         GROUP BY PLAYERNO
         HAVING   SUM(AMOUNT) >= ALL
                 (SELECT   SUM(AMOUNT)
                  FROM     PENALTIES
                  GROUP BY PLAYERNO))

Answer 11.8:

SELECT   PLAYERNO
FROM     PENALTIES
WHERE    PLAYERNO <> 104
GROUP BY PLAYERNO
HAVING   SUM(AMOUNT)  =
        (SELECT   SUM(AMOUNT) * 2
         FROM     PENALTIES
         WHERE    PLAYERNO = 104)

Answer 11.9:

SELECT   PLAYERNO
FROM     PENALTIES
WHERE    PLAYERNO <> 6
GROUP BY PLAYERNO
HAVING   COUNT(*) =
        (SELECT   COUNT(*)
         FROM     PENALTIES
         WHERE    PLAYERNO = 6)

Answer 11.10:

SELECT   P.PLAYERNO, P.NAME
FROM     PLAYERS AS P, MATCHES AS M1
WHERE    P.PLAYERNO = M1.PLAYERNO
GROUP BY P.PLAYERNO, P.NAME
HAVING   SUM(WON) >
        (SELECT   SUM(LOST)
         FROM     MATCHES AS M2
         WHERE    M2.PLAYERNO = P.PLAYERNO
         GROUP BY M2.PLAYERNO)
Example 12.1:

SELECT   PAYMENTNO, PLAYERNO
FROM     PENALTIES
ORDER BY PLAYERNO

Example 12.2:

SELECT   PLAYERNO, AMOUNT
FROM     PENALTIES
ORDER BY PLAYERNO, AMOUNT

Example 12.3:

SELECT   AMOUNT
FROM     PENALTIES
ORDER BY PLAYERNO, AMOUNT

Example 12.4:

SELECT   NAME, INITIALS, PLAYERNO
FROM     PLAYERS
ORDER BY SUBSTR(NAME, 1, 1)

Example 12.5:

SELECT   PLAYERNO, AMOUNT
FROM     PENALTIES
ORDER BY ABS(AMOUNT - (SELECT AVG(AMOUNT) FROM PENALTIES))

Example 12.6:

SELECT   PLAYERNO, AMOUNT
FROM     PENALTIES AS P1
ORDER BY (SELECT   AVG(AMOUNT)
          FROM     PENALTIES AS P2
          WHERE    P1.PLAYERNO = P2.PLAYERNO)

Example 12.7:

SELECT   PLAYERNO, SUM(AMOUNT)
FROM     PENALTIES
GROUP BY PLAYERNO
ORDER BY 2

Example 12.8:

SELECT   PLAYERNO, NAME,
        (SELECT   SUM(AMOUNT)
         FROM     PENALTIES AS PEN
         WHERE    PEN.PLAYERNO=P.PLAYERNO)
FROM     PLAYERS AS P
ORDER BY 3
;
SELECT   PLAYERNO, NAME,
        (SELECT   SUM(AMOUNT)
         FROM     PENALTIES AS PEN
         WHERE    PEN.PLAYERNO=P.PLAYERNO) AS TOTAL
FROM     PLAYERS AS P
ORDER BY TOTAL

Example 12.9:

SELECT   PLAYERNO, AMOUNT
FROM     PENALTIES
ORDER BY PLAYERNO DESC, AMOUNT ASC

Example 12.10:

CREATE TABLE CODES
      (CODE   CHAR(4) NOT NULL)
;
INSERT INTO CODES VALUES ('abc')
;
INSERT INTO CODES VALUES ('ABC')
;
INSERT INTO CODES VALUES ('-abc')
;
INSERT INTO CODES VALUES ('a bc')
;
INSERT INTO CODES VALUES ('ab')
;
INSERT INTO CODES VALUES ('9abc')
;
SELECT   *
FROM     CODES
ORDER BY CODE

Example 12.11:

SELECT   DISTINCT LEAGUENO
FROM     PLAYERS
ORDER BY LEAGUENO DESC

Answer 12.3:

SELECT   PLAYERNO, TEAMNO, WON - LOST
FROM     MATCHES
ORDER BY 3 ASC

Example 13.1:

SELECT   MAX(PLAYERNO)
FROM     PLAYERS
;
SELECT   PLAYERNO, NAME
FROM     PLAYERS AS P1
WHERE    4 >
        (SELECT   COUNT(*)
         FROM     PLAYERS AS P2
         WHERE    P1.PLAYERNO < P2.PLAYERNO)
ORDER BY PLAYERNO DESC
;
SELECT   PLAYERNO, NAME
FROM     PLAYERS
ORDER BY PLAYERNO DESC
LIMIT    4

Example 13.2:

SELECT   LEAGUENO, PLAYERNO, NAME
FROM     PLAYERS
ORDER BY LEAGUENO ASC
LIMIT    5

Example 13.3:

SELECT   PLAYERNO, COUNT(*) AS NUMBER
FROM     MATCHES
WHERE    WON > LOST
GROUP BY PLAYERNO
ORDER BY NUMBER DESC
LIMIT    3

Example 13.4:

SELECT   PLAYERNO, COUNT(*) AS NUMBER
FROM     MATCHES
WHERE    WON > LOST
GROUP BY PLAYERNO
ORDER BY NUMBER DESC, PLAYERNO DESC
LIMIT    3

Example 13.5:

SELECT   *
FROM    (SELECT   PLAYERNO, COUNT(*) AS NUMBER
         FROM     MATCHES
         WHERE    WON > LOST
         GROUP BY PLAYERNO
         ORDER BY NUMBER DESC, PLAYERNO DESC
         LIMIT    3) AS T
ORDER BY 1

Example 13.6:

SELECT   AVG(AMOUNT)
FROM    (SELECT   AMOUNT
         FROM     PENALTIES
         ORDER BY AMOUNT
         LIMIT    4) AS T

Example 13.7:

SELECT   MIN(AMOUNT)
FROM    (SELECT   AMOUNT
         FROM     PENALTIES
         ORDER BY AMOUNT DESC
         LIMIT    3) AS T

Example 13.8:

SELECT   DISTINCT AMOUNT
FROM     PENALTIES
ORDER BY AMOUNT DESC
LIMIT    3

Example 13.9:

SELECT   PLAYERNO
FROM    (SELECT   PLAYERNO
         FROM     PLAYERS
         WHERE    LEAGUENO IS NOT NULL
         ORDER BY LEAGUENO DESC
         LIMIT    6) AS T
ORDER BY PLAYERNO
LIMIT    3

Example 13.10:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM    (SELECT   PLAYERNO, SUM(AMOUNT) AS TOTAL
                  FROM     PENALTIES
                  GROUP BY PLAYERNO
                  ORDER BY TOTAL DESC
                  LIMIT    3) AS T)

Example 13.11:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PENALTIES)
AND      PLAYERNO NOT IN
        (SELECT   PLAYERNO
         FROM     PENALTIES
         ORDER BY AMOUNT DESC
         LIMIT    2)
AND      PLAYERNO NOT IN
        (SELECT   PLAYERNO
         FROM     PENALTIES
         ORDER BY AMOUNT ASC
         LIMIT    2)
;
SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PENALTIES
         WHERE    PLAYERNO NOT IN
                 (SELECT   PLAYERNO
                  FROM     PENALTIES
                  ORDER BY AMOUNT DESC
                  LIMIT    2)
         AND      PLAYERNO NOT IN
                 (SELECT   PLAYERNO
                  FROM     PENALTIES
                  ORDER BY AMOUNT ASC
                  LIMIT    2))

Example 13.12:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
ORDER BY PLAYERNO ASC
LIMIT    5 OFFSET 3

Example 13.13:

SELECT   SQL_CALC_FOUND_ROWS PAYMENTNO
FROM     PENALTIES
LIMIT    5
;
SELECT   FOUND_ROWS()

Answer 13.1:

SELECT   PAYMENTNO, AMOUNT, PAYMENT_DATE
FROM     PENALTIES
ORDER BY AMOUNT DESC, PAYMENT_DATE DESC
LIMIT    4

Answer 13.2:

(SELECT   MATCHNO
FROM     MATCHES
ORDER BY MATCHNO ASC
LIMIT    2)
UNION
(SELECT   MATCHNO
FROM     MATCHES
ORDER BY MATCHNO DESC
LIMIT    2)

Answer 13.3:

SELECT   PLAYERNO, NAME
FROM    (SELECT   PLAYERNO, NAME
         FROM     PLAYERS
         ORDER BY PLAYERNO ASC
         LIMIT    10) AS S10
ORDER BY NAME DESC
LIMIT    5

Answer 13.4:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM    (SELECT   PLAYERNO, COUNT(*) AS NUMBER
                  FROM     MATCHES
                  WHERE    WON > LOST
                  GROUP BY PLAYERNO) AS WINNERS
         ORDER BY NUMBER DESC, PLAYERNO ASC
         LIMIT    2)

Answer 13.5:

SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PENALTIES.PLAYERNO
         FROM     PENALTIES INNER JOIN PLAYERS
                  ON PENALTIES.PLAYERNO = PLAYERS.PLAYERNO
         ORDER BY AMOUNT DESC, NAME ASC
         LIMIT    4)

Answer 13.6:

SELECT   PAYMENTNO, AMOUNT
FROM     PENALTIES
ORDER BY AMOUNT DESC
LIMIT    1 OFFSET 2

Example 14.1:

SELECT   PLAYERNO, TOWN
FROM     PLAYERS
WHERE    TOWN = 'Inglewood'
UNION
SELECT   PLAYERNO, TOWN
FROM     PLAYERS
WHERE    TOWN = 'Plymouth'
;
SELECT   PLAYERNO, TOWN
FROM     PLAYERS
WHERE    TOWN = 'Inglewood'
OR       TOWN = 'Plymouth'

Example 14.2:

SELECT   BIRTH_DATE AS DATES
FROM     PLAYERS
UNION
SELECT   PAYMENT_DATE
FROM     PENALTIES

Example 14.3:

SELECT   PLAYERNO
FROM     PENALTIES
UNION
SELECT   PLAYERNO
FROM     TEAMS

Example 14.4:

SELECT   PLAYERNO
FROM     PENALTIES
UNION
SELECT   PLAYERNO
FROM     TEAMS
UNION
SELECT   PLAYERNO
FROM     PLAYERS
WHERE    TOWN = 'Stratford'

Example 14.5:

SELECT   CAST(TEAMNO AS CHAR(4)) AS TEAMNO,
         CAST(PLAYERNO AS CHAR(4)) AS PLAYERNO,
         SUM(WON + LOST) AS TOTAL
FROM     MATCHES
GROUP BY TEAMNO, PLAYERNO
UNION
SELECT   CAST(TEAMNO AS CHAR(4)),
         'subtotal',
         SUM(WON + LOST)
FROM     MATCHES
GROUP BY TEAMNO
UNION
SELECT   'total', 'total', SUM(WON + LOST)
FROM     MATCHES
ORDER BY 1, 2

Example 14.6:

SELECT   PLAYERNO
FROM     PENALTIES
UNION ALL
SELECT   PLAYERNO
FROM     TEAMS

Answer 14.1:

SELECT   PLAYERNO
FROM     COMMITTEE_MEMBERS
UNION
SELECT   PLAYERNO
FROM     PENALTIES
GROUP BY PLAYERNO
HAVING   COUNT(*) >= 2

Answer 14.2:

SELECT   MAX(ADATE)
FROM    (SELECT   MAX(BIRTH_DATE) AS ADATE
         FROM     PLAYERS
         UNION
         SELECT   MAX(PAYMENT_DATE) AS ADATE
         FROM     PENALTIES) AS TWODATES

Answer 14.5:

SELECT   SUM(NUMBER)
FROM    (SELECT   COUNT(*) AS NUMBER
         FROM     PLAYERS
         UNION ALL
         SELECT   COUNT(*) AS NUMBER
         FROM     TEAMS) AS NUMBERS

Answer 14.6:

SELECT   POWER(DIGIT,2)
FROM    (SELECT 0 AS DIGIT UNION SELECT 1 UNION
         SELECT 2 UNION SELECT 3 UNION
         SELECT 4 UNION SELECT 5 UNION
         SELECT 6 UNION SELECT 7 UNION
         SELECT 8 UNION SELECT 9) AS DIGITS1
UNION ALL
SELECT   POWER(DIGIT,3)
FROM    (SELECT 0 AS DIGIT UNION SELECT 1 UNION
         SELECT 2 UNION SELECT 3 UNION
         SELECT 4 UNION SELECT 5 UNION
         SELECT 6 UNION SELECT 7 UNION
         SELECT 8 UNION SELECT 9) AS DIGITS2
ORDER BY 1

Example 15.1:

SET @PI = 3.141592654

Example 15.2:

SELECT   @PI

Example 15.3:

SELECT   NAME, TOWN, POSTCODE
FROM     PLAYERS
WHERE    PLAYERNO < @PI

Example 15.4:

SET @ABC = 5, @DEF = 'Inglewood',
    @GHI = DATE('2004-01-01')

Example 15.5:

SET @PI = CAST(22 AS BINARY)/7

Example 15.6:

SET @ANR = (SELECT    PLAYERNO
            FROM      TEAMS
            WHERE     TEAMNO = 1)

Example 15.7:

SELECT   @PLAYERNO := 7

Example 15.8:

SELECT   @NAME := 'Johnson', @TOWN := 'Inglewood',
         @POSTCODE := '1234AB'

Example 15.9:

SELECT   @NAME := NAME, @TOWN := TOWN,
         @POSTCODE := POSTCODE
FROM     PLAYERS
WHERE    PLAYERNO = 2

Example 15.10:

SELECT   @PENALTIESTOTAL := SUM(AMOUNT),
         @NUMBERPENALTIES := COUNT(*)
FROM     PENALTIES

Example 15.11:

SELECT   @PLAYERNO := PLAYERNO
FROM     PLAYERS
ORDER BY PLAYERNO DESC
;
SELECT   @PLAYERNO
;
SELECT   @PNR7 := 7
FROM     PLAYERS
WHERE    PLAYERNO < @PNR7

Example 15.12:

SET @CNO = (SELECT    PLAYERNO
            FROM      TEAMS
            WHERE     TEAMNO = 1)
;
SELECT   NAME
FROM     PLAYERS
WHERE    PLAYERNO = @CNO

Example 15.13:

SET @VAR = (((3/7) * 100)/124)+3
;
SELECT   *
FROM     PENALTIES
WHERE    PAYMENTNO < @VAR
AND      PLAYERNO > @VAR

Example 15.14:

CREATE TABLE VARIABLES
      (VARNAME   CHAR(30) NOT NULL PRIMARY KEY,
       VARVALUE  CHAR(30) NOT NULL)
;
SET @VAR1 = 100, @VAR2 = 'John'
;
INSERT INTO VARIABLES VALUES ('VAR1', @VAR1)
;
INSERT INTO VARIABLES VALUES ('VAR2', @VAR2)
;
SELECT   @VAR1 := VARVALUE
FROM     VARIABLES
WHERE    VARNAME = 'VAR1'
;
SELECT   @VAR2 := VARVALUE
FROM     VARIABLES
WHERE    VARNAME = 'VAR2'
;
SELECT   @VAR1, @VAR2

Example 15.15:

DO CURRENT_DATE + INTERVAL 2 YEAR

Answer 15.1:

SET @TODAY = CURRENT_DATE
;
SELECT @TODAY := CURRENT_DATE

Answer 15.2:

SELECT   *
FROM     PENALTIES
WHERE    PENALTIES_DATE < @TODAY - INTERVAL 5 YEAR

Answer 15.3:

SELECT   @VAR := SUM(AMOUNT)
FROM     PENALTIES

Example 16.1:

HANDLER PENALTIES OPEN
;
HANDLER PENALTIES READ FIRST
;
HANDLER PENALTIES READ NEXT
;
HANDLER PENALTIES CLOSE

Example 16.2:

CREATE INDEX PENALTIES_AMOUNT ON PENALTIES (AMOUNT)

Example 16.3:

HANDLER PENALTIES OPEN AS P
;
HANDLER P READ PENALTIES_AMOUNT FIRST
;
HANDLER P READ PENALTIES_AMOUNT NEXT

Example 16.4:

HANDLER PENALTIES OPEN AS P
;
HANDLER P READ PENALTIES_AMOUNT FIRST WHERE PLAYERNO > 100
;
HANDLER P READ PENALTIES_AMOUNT NEXT WHERE PLAYERNO > 100

Example 16.5:

HANDLER PENALTIES OPEN AS P
;
HANDLER P READ PENALTIES_AMOUNT FIRST LIMIT 3

Example 16.6:

HANDLER PENALTIES OPEN AS P
;
HANDLER P READ PENALTIES_AMOUNT = (30.00)
;
HANDLER P READ PENALTIES_AMOUNT NEXT

Example 16.7:

CREATE INDEX AMOUNT_PLAYERNO ON PENALTIES (AMOUNT, PLAYERNO)

Example 16.8:

HANDLER PENALTIES OPEN AS P
;
HANDLER P READ AMOUNT_PLAYERNO > (30.00, 44) LIMIT 100

Answer 16.1:

HANDLER MATCHES OPEN AS M1
;
HANDLER M1 READ FIRST
;
HANDLER M1 READ NEXT
;
HANDLER M1 CLOSE

Answer 16.2:

HANDLER MATCHES OPEN AS M2
;
HANDLER M2 READ `PRIMARY` FIRST
;
HANDLER M2 READ `PRIMARY` NEXT
;
HANDLER M2 CLOSE

Answer 16.3:

HANDLER MATCHES OPEN AS M3
;
HANDLER M3 READ `PRIMARY` LAST
   WHERE PLAYERNO IN (6, 104, 112)
;
HANDLER M3 READ `PRIMARY` PREV
   WHERE PLAYERNO IN (6, 104, 112)
;
HANDLER M3 CLOSE

Example 17.1:

INSERT INTO TEAMS (TEAMNO, PLAYERNO, DIVISION)
VALUES (3, 100, 'third')
;
INSERT INTO TEAMS
VALUES (3, 100, 'third')
;
INSERT INTO TEAMS (PLAYERNO, DIVISION, TEAMNO)
VALUES (100, 'third', 3)
;
INSERT INTO TEAMS
       (TEAMNO, DIVISION)
VALUES (3, 'third')

Example 17.2:

INSERT INTO PLAYERS
       (PLAYERNO, NAME, INITIALS, SEX,
        JOINED, STREET, TOWN)
VALUES (611, 'Jones', 'GG', 'M', 1977, 'Green Way', 'Stratford')
;
INSERT INTO PLAYERS
       (PLAYERNO, NAME, INITIALS, BIRTH_DATE,
        SEX, JOINED, STREET, HOUSENO, POSTCODE,
        TOWN, PHONENO, LEAGUENO)
VALUES (611, 'Jones', 'GG', NULL, 'M', 1977,
        'Green Way', NULL, NULL, 'Stratford', NULL, NULL)

Example 17.3:

INSERT INTO TEAMS (TEAMNO, PLAYERNO, DIVISION)
VALUES (6, 100, 'third'),
       (7,  27, 'fourth'),
       (8,  39, 'fourth'),
       (9, 112, 'sixth')

Example 17.4:

CREATE TABLE TOTALS
      (NUMBERPLAYERS   INTEGER NOT NULL,
       SUMPENALTIES    DECIMAL(9,2) NOT NULL)
;
INSERT INTO TOTALS (NUMBERPLAYERS, SUMPENALTIES)
VALUES ((SELECT COUNT(*) FROM PLAYERS),
        (SELECT SUM(AMOUNT) FROM PENALTIES))
;
INSERT INTO TEAMS (TEAMNO, PLAYERNO, DIVISION)
VALUES (3, 100, 'third')
;
INSERT INTO TEAMS SET
   TEAMNO = 3, PLAYERNO = 100, DIVISION = 'third'

Example 17.5:

INSERT IGNORE INTO TEAMS VALUES (1, 39, 'second')

Example 17.6:

INSERT INTO TEAMS VALUES (1, 39, 'second')
ON DUPLICATE KEY UPDATE PLAYERNO = 39, DIVISION='second'

Example 17.7:

CREATE TABLE RECR_PLAYERS
      (PLAYERNO   SMALLINT NOT NULL,
       NAME       CHAR(15) NOT NULL,
       TOWN       CHAR(10) NOT NULL,
       PHONENO    CHAR(13),
       PRIMARY KEY (PLAYERNO))
;
INSERT   INTO RECR_PLAYERS
        (PLAYERNO, NAME, TOWN, PHONENO)
SELECT   PLAYERNO, NAME, TOWN, PHONENO
FROM     PLAYERS
WHERE    LEAGUENO IS NULL
;
INSERT   INTO RECR_PLAYERS
SELECT   PLAYERNO, NAME, TOWN, PHONENO
FROM     PLAYERS
WHERE    LEAGUENO IS NULL
;
INSERT   INTO RECR_PLAYERS
        (TOWN, PHONENO, NAME, PLAYERNO)
SELECT   TOWN, PHONENO, NAME, PLAYERNO
FROM     PLAYERS
WHERE    LEAGUENO IS NULL

Example 17.8:

INSERT   INTO RECR_PLAYERS
        (PLAYERNO, NAME, TOWN, PHONENO)
SELECT   PLAYERNO + 1000, NAME, TOWN, PHONENO
FROM     RECR_PLAYERS

Example 17.9:

INSERT   INTO PENALTIES
SELECT   PAYMENTNO + 100, PLAYERNO, PAYMENT_DATE, AMOUNT
FROM     PENALTIES
WHERE    AMOUNT >
        (SELECT   AVG(AMOUNT)
         FROM     PENALTIES)

Example 17.10:

UPDATE   PLAYERS
SET      LEAGUENO = '2000'
WHERE    PLAYERNO = 95
;
UPDATE   PLAYERS AS P
SET      P.LEAGUENO = '2000'
WHERE    P.PLAYERNO = 95

Example 17.11:

UPDATE   PENALTIES
SET      AMOUNT = AMOUNT * 1.05

Example 17.12:

UPDATE   MATCHES
SET      WON = 0
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PLAYERS
         WHERE    TOWN = 'Stratford')

Example 17.13:

UPDATE   PLAYERS
SET      STREET   = 'Palmer Street',
         HOUSENO  = '83',
         TOWN     = 'Inglewood',
         POSTCODE = '1234UU',
         PHONENO  = NULL
WHERE    NAME     = 'Parmenter'
;
UPDATE   PLAYERS
SET      STREET   = TOWN,
         TOWN     = STREET
WHERE    PLAYERNO = 44
;
UPDATE   PLAYERS
SET      STREET   = TOWN
WHERE    PLAYERNO = 44
;
UPDATE   PLAYERS
SET      TOWN     = STREET
WHERE    PLAYERNO = 44

Example 17.14:

CREATE TABLE PLAYERS_DATA
      (PLAYERNO        INTEGER NOT NULL PRIMARY KEY,
       NUMBER_MAT      INTEGER,
       SUM_PENALTIES   DECIMAL(7,2))
;
INSERT INTO PLAYERS_DATA (PLAYERNO)
SELECT PLAYERNO FROM PLAYERS
;
UPDATE   PLAYERS_DATA AS PD
SET      NUMBER_MAT =    (SELECT   COUNT(*)
                          FROM     MATCHES AS M
                          WHERE    M.PLAYERNO = PD.PLAYERNO),
         SUM_PENALTIES = (SELECT   SUM(AMOUNT)
                          FROM     PENALTIES AS PEN
                          WHERE    PEN.PLAYERNO = PD.PLAYERNO)

Example 17.15:

UPDATE   PENALTIES
SET      AMOUNT = AMOUNT – (SELECT   AVG(AMOUNT)
                            FROM     PENALTIES)
;
SET @AVERAGE_AMOUNT = (SELECT AVG(AMOUNT) FROM PENALTIES)
;
UPDATE   PENALTIES
SET      AMOUNT = AMOUNT – @AVERAGE_AMOUNT

Example 17.16:

UPDATE   PENALTIES
SET      AMOUNT = AMOUNT * 1.05
ORDER BY AMOUNT DESC

Example 17.17:

UPDATE   PENALTIES
SET      PAYMENTNO = PAYMENTNO + 1
ORDER BY PAYMENTNO DESC

Example 17.18:

UPDATE   PENALTIES
SET      AMOUNT = AMOUNT * 1.05
ORDER BY AMOUNT DESC, PLAYERNO ASC
LIMIT    4

Example 17.19:

UPDATE   IGNORE MATCHES
SET      MATCHNO = MATCHNO + 1,
         WON = 2,
         LOST = 3
WHERE    MATCHNO = 4

Example 17.20:

UPDATE   MATCHES AS M, TEAMS AS T
SET      WON = 0
WHERE    T.TEAMNO = M.TEAMNO
AND      T.DIVISION = 'first'
;
SELECT   ...
FROM     MATCHES AS M, TEAMS AS T
WHERE    T.TEAMNO = M.TEAMNO
AND      T.DIVISION = 'first'
;
UPDATE   MATCHES
SET      WON = 0
WHERE    TEAMNO IN
        (SELECT   TEAMNO
         FROM     TEAMS
         WHERE    DIVISION = 'first')

Example 17.21:

UPDATE   MATCHES AS M, TEAMS AS T
SET      M.WON = 0,
         T.PLAYERNO = 112
WHERE    T.TEAMNO = M.TEAMNO
AND      T.DIVISION = 'first'

Example 17.22:

UPDATE   PLAYERS AS P,
         TEAMS AS T,
         MATCHES AS M,
         PENALTIES AS PEN,
         COMMITTEE_MEMBERS AS C
SET      P.PLAYERNO   = 1,
         T.PLAYERNO   = 1,
         M.PLAYERNO   = 1,
         PEN.PLAYERNO = 1,
         C.PLAYERNO   = 1
WHERE    P.PLAYERNO   = T.PLAYERNO
AND      T.PLAYERNO   = M.PLAYERNO
AND      M.PLAYERNO   = PEN.PLAYERNO
AND      PEN.PLAYERNO = C.PLAYERNO
AND      C.PLAYERNO   = 2

Example 17.23:

REPLACE INTO PLAYERS
       (PLAYERNO, NAME, INITIALS, SEX,
        JOINED, STREET, TOWN)
VALUES (611, 'Jones', 'GG', 'M', 1977, 'Green Way', 'Stratford')

Example 17.24:

REPLACE INTO TEAMS (TEAMNO, PLAYERNO, DIVISION)
VALUES (6, 100, 'third'),
       (7,  27, 'fourth'),
       (8,  39, 'fourth'),
       (9, 112, 'sixth')

Example 17.25:

REPLACE INTO RECR_PLAYERS
       (PLAYERNO, NAME, TOWN, PHONENO)
SELECT  PLAYERNO + 1000, NAME, TOWN, PHONENO
FROM    RECR_PLAYERS

Example 17.26:

DELETE
FROM     PENALTIES
WHERE    PLAYERNO = 44
;
DELETE
FROM     PENALTIES AS PEN
WHERE    PEN.PLAYERNO = 44

Example 17.27:

DELETE
FROM     PLAYERS
WHERE    JOINED >
        (SELECT   AVG(JOINED)
         FROM     PLAYERS
         WHERE    TOWN = 'Stratford')

Example 17.28:

DELETE
FROM     PENALTIES
ORDER BY AMOUNT DESC, PLAYERNO ASC
LIMIT    4

Example 17.29:

DELETE   IGNORE
FROM     PLAYERS

Example 17.30:

DELETE   MATCHES
FROM     MATCHES, PLAYERS
WHERE    MATCHES.PLAYERNO = PLAYERS.PLAYERNO
AND      PLAYERS.TOWN = 'Inglewood'
;
SELECT   ...
FROM     MATCHES, PLAYERS
WHERE    MATCHES.PLAYERNO = PLAYERS.PLAYERNO
AND      PLAYERS.TOWN = 'Inglewood'
;
DELETE   MATCHES
FROM     MATCHES AS M, PLAYERS
WHERE    M.PLAYERNO = PLAYERS.PLAYERNO
AND      PLAYERS.TOWN = 'Inglewood'

Example 17.31:

DELETE   TEAMS, MATCHES
FROM     TEAMS, MATCHES
WHERE    TEAMS.TEAMNO = MATCHES.TEAMNO
AND      TEAMS.TEAMNO = 1
;
DELETE
FROM     TEAMS, MATCHES
USING    TEAMS, MATCHES
WHERE    TEAMS.TEAMNO = MATCHES.TEAMNO
AND      TEAMS.TEAMNO = 1

Example 17.32:

TRUNCATE TABLE COMMITTEE_MEMBERS

Answer 17.1:

INSERT INTO PENALTIES
VALUES (15, 27, '1985-11-08', 75)

Answer 17.2:

INSERT   INTO PENALTIES
SELECT   PAYMENTNO + 1000, PLAYERNO, PAYMENT_DATE, AMOUNT
FROM     PENALTIES
WHERE    AMOUNT >
        (SELECT   AVG(AMOUNT)
         FROM     PENALTIES)
UNION
SELECT   PAYMENTNO + 2000, PLAYERNO, PAYMENT_DATE, AMOUNT
FROM     PENALTIES
WHERE    PLAYERNO = 27

Answer 17.3:

UPDATE   PLAYERS
SET      SEX = 'W'
WHERE    SEX = 'F'

Answer 17.4:

UPDATE   PLAYERS
SET      SEX = 'X'
WHERE    SEX = 'F'
;
UPDATE   PLAYERS
SET      SEX = 'F'
WHERE    SEX = 'M'
;
UPDATE   PLAYERS
SET      SEX = 'M'
WHERE    SEX = 'X'
;
UPDATE   PLAYERS
SET      SEX = CASE SEX
                       WHEN 'F' THEN 'M'
                       ELSE 'F' END

Answer 17.5:

UPDATE   PENALTIES
SET      AMOUNT = AMOUNT * 1.2
WHERE    AMOUNT >
        (SELECT   AVG(AMOUNT)
         FROM     PENALTIES)

Answer 17.6:

UPDATE   TEAMS AS T, PLAYERS AS P
SET      DIVISION = 'third'
WHERE    T.PLAYERNO = P.PLAYERNO
AND      P.TOWN = 'Stratford'

Answer 17.7:

UPDATE   PENALTIES, TEAMS
SET      AMOUNT = 50,
         DIVISION = 'fourth'

Answer 17.8:

DELETE
FROM     PENALTIES
WHERE    PLAYERNO = 44
AND      YEAR(PAYMENT_DATE) = 1980

Answer 17.9:

DELETE
FROM     PENALTIES
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     MATCHES
         WHERE    TEAMNO IN
                 (SELECT   TEAMNO
                  FROM     TEAMS
                  WHERE    DIVISION = 'second'))

Answer 17.10:

DELETE
FROM     PLAYERS
WHERE    TOWN =
        (SELECT   TOWN
         FROM     PLAYERS
         WHERE PLAYERNO = 44)
AND      PLAYERNO <> 44

Answer 17.11:

DELETE   PEN, M
FROM     PENALTIES AS PEN, MATCHES AS M
WHERE    PEN.PLAYERNO = M.PLAYERNO
AND      PEN.PLAYERNO = 27

Answer 17.12:

DELETE   PEN, M
FROM     PENALTIES AS PEN, MATCHES AS M
WHERE    PEN.PLAYERNO = 27
AND      M.PLAYERNO = 27

Example 18.1:

SELECT   *
FROM     TEAMS
INTO     OUTFILE 'C:/TEAMS.TXT'

Example 18.2:

SELECT   *
FROM     TEAMS
INTO     OUTFILE 'C:/TEAMS.TXT'
         FIELDS TERMINATED BY ','
         LINES TERMINATED BY '?'

Example 18.3:

SELECT   *
FROM     TEAMS
INTO     OUTFILE 'C:/TEAMS.TXT'
         FIELDS TERMINATED BY ','
            OPTIONALLY ENCLOSED BY '"'
         LINES TERMINATED BY '?'

Example 18.4:

SELECT   *
FROM     TEAMS
INTO     OUTFILE 'C:/TEAMS.TXT'
         FIELDS TERMINATED BY ','
            ENCLOSED BY '"'
         LINES TERMINATED BY '?'

Example 18.5:

SELECT   *, NULL
FROM     TEAMS
INTO     OUTFILE 'C:/TEAMS.TXT'
         FIELDS TERMINATED BY ','
            ENCLOSED BY '"'
         LINES TERMINATED BY '?'

Example 18.6:

SELECT   *, NULL
FROM     TEAMS
INTO     OUTFILE 'C:/TEAMS.TXT'
         FIELDS TERMINATED BY ','
            ENCLOSED BY '"'
            ESCAPED BY '*'
         LINES TERMINATED BY '?'

Example 18.7:

SELECT   *
FROM     TEAMS
INTO     OUTFILE 'C:/TEAMS.TXT'
         FIELDS TERMINATED BY ','
            OPTIONALLY ENCLOSED BY '"'
         LINES TERMINATED BY '\n'

Example 18.8:

SELECT   *
FROM     TEAMS
INTO     DUMPFILE 'C:/TEAMS.DUMP'

Example 18.9:

SELECT   *
FROM     TEAMS
WHERE    TEAMNO = 1
INTO     @v1, @v2, @V3
;
SELECT   @V1, @V2, @V3

Example 18.10:

LOAD DATA INFILE 'C:/TEAMS.TXT'
REPLACE
INTO TABLE TEAMS
FIELDS TERMINATED BY ','
LINES TERMINATED BY '?'

Example 18.11:

LOAD DATA INFILE 'C:/TEAMS.TXT'
REPLACE
INTO TABLE TEAMS
FIELDS TERMINATED BY ','
LINES TERMINATED BY '?'
IGNORE 1 LINES

Example 18.12:

LOAD DATA INFILE 'C:/TEAMS.TXT'
REPLACE
INTO TABLE TEAMS
FIELDS TERMINATED BY ','
LINES TERMINATED BY '?'
(PLAYERNO,TEAMNO,DIVISION)
;
SELECT * FROM TEAMS

Example 18.13:

LOAD DATA INFILE 'C:/TEAMS.TXT'
REPLACE
INTO TABLE TEAMS
FIELDS TERMINATED BY ','
LINES TERMINATED BY '?'
SET DIVISION='xxx'
;
SELECT * FROM TEAMS

Example 18.14:

LOAD DATA INFILE 'C:/TEAMS.TXT'
REPLACE
INTO TABLE TEAMS
FIELDS TERMINATED BY ','
LINES TERMINATED BY '?'
(TEAMNO,PLAYERNO,@DIV)
SET DIVISION=SUBSTRING(@DIV,1,1)
;
SELECT * FROM TEAMS

Example 18.15:

LOAD DATA INFILE 'C:/TEAMS2.TXT'
REPLACE
INTO TABLE TEAMS
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r'
      STARTING BY '/*/'
;
SELECT * FROM TEAMS

Example 19.1:

CREATE TABLE XML_MATCHES
      (MATCHNO      INTEGER NOT NULL PRIMARY KEY,
       MATCH_INFO   TEXT)

Example 19.2:

INSERT INTO XML_MATCHES VALUES (1,
'<match number=1>Match info of 1
    <team>Team info of 1
       <number>1</number>
       <division>first</division>
    </team>
    <player>Player info of 6
       <number>6</number>
       <name>The name of 6
          <lastname>Parmenter</lastname>
          <initials>R</initials>
       </name>
       <address>The address of 6
          <street>Haseltine Lane</street>
          <houseno>80</houseno>
          <postcode>1234KK</postcode>
          <town>Stratford</town>
       </address>
    </player>
    <sets>Info about sets of 1
       <won>3</won>
       <lost>1</lost>
    </sets>
</match>')
;
INSERT INTO XML_MATCHES VALUES (9,
'<match number=9>Match info of 9
    <team>Team info of 2
       <number>2</number>
       <division>second</division>
    </team>
    <player>Player info of 27
       <number>27</number>
       <name>The name of 27
          <lastname>Collins</lastname>
          <initials>DD</initials>
       </name>
       <address>The address of 27
          <street>Long Drive</street>
          <houseno>804</houseno>
          <postcode>8457DK</postcode>
          <town>Eltham</town>
       </address>
       <phones>Phone numbers of 27
          <number>1234567</number>
          <number>3468346</number>
          <number>6236984</number>
          <number>6587437</number>
       </phones>
    </player>
    <sets>Info about sets of 9
       <won>3</won>
       <lost>2</lost>
    </sets>
</match>')
;
INSERT INTO XML_MATCHES VALUES (12,
'<match number=12>Match info of 12
    <team>Team info of 2
       <number>2</number>
       <division>second</division>
    </team>
    <player>Player info of 8
       <number>8</number>
       <name>The name of 8
          <lastname>Newcastle</lastname>
          <initials>B</initials>
       </name>
       <address>The first address van 8
          <street>Station Road</street>
          <houseno>4</houseno>
          <postcode>6584RO</postcode>
          <town>Inglewood</town>
       </address>
       <address>The second address of 8
          <street>Trolley Lane</street>
          <houseno>14</houseno>
          <postcode>2728YG</postcode>
          <town>Douglas</town>
       </address>
    </player>
    <sets>Info about sets of 12
       <won>1</won>
       <lost>3</lost>
    </sets>
</match>')

Example 19.3:


SELECT   MATCHNO,
         EXTRACTVALUE(MATCH_INFO, '/match/team/division')
                      AS DIVISION
FROM     XML_MATCHES

Example 19.4:

SELECT   MATCHNO,
         EXTRACTVALUE(MATCH_INFO,
         '/match/player/name/lastname')
         AS PLAYER
FROM     XML_MATCHES
WHERE    EXTRACTVALUE(MATCH_INFO,
         '/match/sets/won') = 3

Example 19.5:

SELECT   EXTRACTVALUE('
            <team>
               <number>2</number>
               <division>second</division>
            </team>'
         ,'/team') = '' AS TEAM

Example 19.6:

SELECT   MATCHNO, EXTRACTVALUE(MATCH_INFO,
         '/match/player/phones/number')
         AS PHONES
FROM     XML_MATCHES
WHERE    MATCHNO = 9

Example 19.7:

SELECT   MATCHNO, EXTRACTVALUE(MATCH_INFO,
         '/match/player')
         AS PLAYERS
FROM     XML_MATCHES
;
SELECT   REPLACE(EXTRACTVALUE(MATCH_INFO,
         '/match/player'), ' ', '#')
         AS PLAYER_INFO
FROM     XML_MATCHES

Example 19.8:

SELECT   MATCHNO, EXTRACTVALUE(MATCH_INFO,
         '/match/*/number')
         AS NUMBERS
FROM     XML_MATCHES

Example 19.9:

SELECT   MATCHNO, EXTRACTVALUE(MATCH_INFO,
         '/match//number')
         AS NUMBERS
FROM     XML_MATCHES
;
SELECT   MATCHNO,
         EXTRACTVALUE(MATCH_INFO, '//number')
         AS NUMBERS
FROM     XML_MATCHES

Example 19.10:

SELECT   EXTRACTVALUE(MATCH_INFO, '/match//*')
         AS EVERYTHING
FROM     XML_MATCHES
WHERE    MATCHNO = 1

Example 19.11:

SELECT   MATCHNO, EXTRACTVALUE(MATCH_INFO,
         '//town|//won')
         AS TOWN_WON
FROM     XML_MATCHES
;
SELECT   MATCHNO,
         CONCAT(EXTRACTVALUE(MATCH_INFO, '//town'),
                ' ',
                EXTRACTVALUE(MATCH_INFO, '//won'))
         AS TOWN_WON
FROM     XML_MATCHES

Example 19.12:

SELECT   MATCHNO, EXTRACTVALUE(MATCH_INFO,
         '/match/@number')
         AS XML_MATCHNO
FROM     XML_MATCHES

Example 19.13:

SELECT   MATCHNO, EXTRACTVALUE(MATCH_INFO,
         '/match/sets/won+10')
         AS WON_PLUS_10
FROM     XML_MATCHES

Example 19.14:

SELECT   MATCHNO, EXTRACTVALUE(MATCH_INFO,
         '/match/player/address[1]/town')
         AS TOWN
FROM     XML_MATCHES

Example 19.15:

SELECT   MATCHNO, EXTRACTVALUE(MATCH_INFO,
         '/match/player/*[1]')
         AS A_VALUE
FROM     XML_MATCHES

Example 19.16:

SELECT   MATCHNO, EXTRACTVALUE(MATCH_INFO,
         '/match/player/phones/number[last()]')
         AS LAST
FROM     XML_MATCHES

Example 19.17:

SELECT   MATCHNO, EXTRACTVALUE(MATCH_INFO,
         '/child::match/child::team/child::number ')
         AS NUMBERS
FROM     XML_MATCHES

Example 19.18:

SELECT   EXTRACTVALUE(MATCH_INFO,
         '/match/player/address/descendant::* ')
         AS ADDRESS_INFO
FROM     XML_MATCHES

Example 19.19:

SELECT   EXTRACTVALUE(MATCH_INFO,
         '/match/player/descendant::* ')
         AS PLAYER_INFO
FROM     XML_MATCHES

Example 19.20:

SELECT   EXTRACTVALUE(MATCH_INFO,
         '/match/player/descendant::* ')
         AS PLAYER_INFO
FROM     XML_MATCHES

Example 19.21:

SELECT   MATCHNO, EXTRACTVALUE(MATCH_INFO,
         '/match/player[number=8]')
         AS PLAYER8
FROM     XML_MATCHES

Example 19.22:

SELECT   MATCHNO, EXTRACTVALUE(MATCH_INFO,
         '/match/player')
         AS PLAYER8
FROM     XML_MATCHES
WHERE    EXTRACTVALUE(MATCH_INFO,
         '/match/player[number=8]') <> ''

Example 19.23:

SELECT   MATCHNO, EXTRACTVALUE(MATCH_INFO,
         '/match/sets')
         AS THREE_AND_ONE
FROM     XML_MATCHES
WHERE    EXTRACTVALUE(MATCH_INFO,
         '/match/sets[won=3 and lost=1]') <>''

Example 19.24:

UPDATE   XML_MATCHES
SET      MATCH_INFO =
         UPDATEXML(MATCH_INFO,
         '/match/sets/lost',
         '<lost>2</lost>')
WHERE    MATCHNO = 1
;
SELECT   EXTRACTVALUE(MATCH_INFO,
         '/match/sets/lost') AS LOST
FROM     XML_MATCHES
WHERE    MATCHNO = 1

Example 19.25:

UPDATE   XML_MATCHES
SET      MATCH_INFO =
         UPDATEXML(MATCH_INFO,
         '/match/player/address',
         '<address>The new address of 8
             <street>Jolly Lane</street>
             <houseno>30</houseno>
             <postcode>5383GH</postcode>
             <town>Douglas</town>
          </address>')
WHERE    MATCHNO = 1
;
SELECT   EXTRACTVALUE(MATCH_INFO,
         '/match/player/address/*') AS NEW_ADDRESS
FROM     XML_MATCHES
WHERE    MATCHNO = 1

Example 20.1:

CREATE   TABLE PLAYERS
        (PLAYERNO     INTEGER NOT NULL PRIMARY KEY,
         NAME         CHAR(15) NOT NULL,
         INITIALS     CHAR(3) NOT NULL,
         BIRTH_DATE   DATE NULL,
         SEX          CHAR(1) NOT NULL,
         JOINED       SMALLINT NOT NULL,
         STREET       VARCHAR(30) NOT NULL,
         HOUSENO      CHAR(4) NULL,
         POSTCODE     CHAR(6) NULL,
         TOWN         VARCHAR(30) NOT NULL,
         PHONENO      CHAR(13) NULL,
         LEAGUENO     CHAR(4) UNIQUE)

Example 20.2:

CREATE   TABLE TEST.PENALTIES
        (PAYMENTNO      INTEGER NOT NULL PRIMARY KEY,
         PLAYERNO       INTEGER NOT NULL,
         PAYMENT_DATE   DATE NOT NULL,
         AMOUNT         DECIMAL(7,2) NOT NULL)

Example 20.3:

CREATE TABLE WIDTH (C4 INTEGER(4))
;
INSERT INTO WIDTH VALUES (1)

Example 20.4:

CREATE TABLE MEASUREMENTS
      (NR INTEGER, MEASUREMENT_VALUE FLOAT(1))
;
INSERT INTO MEASUREMENTS VALUES
   (1, 99.99),
   (2, 99999.99),
   (3, 99999999.99),
   (4, 99999999999.99),
   (5, 99999999999999.99),
   (6, 0.999999),
   (7, 0.9999999),
   (8, 99999999.9999),
   (9, (1.0/3))
;
SELECT * FROM MEASUREMENTS

Example 20.5:

CREATE TABLE MEASUREMENTS
      (NR INTEGER, MEASUREMENT_VALUE FLOAT(10,3))
;
INSERT INTO MEASUREMENTS VALUES
   (1, 99.99),
   (2, 99999.99),
   (3, 99999999.99),
   (4, 99999999999.99),
   (5, 99999999999999.99),
   (6, 0.999999),
   (7, 0.9999999),
   (8, 99999999.9999),
   (9, (1.0/3))
;
SELECT * FROM MEASUREMENTS

Example 20.6:

CREATE TABLE PENALTIESDEF
      (PAYMENTNO     INTEGER UNSIGNED NOT NULL PRIMARY KEY,
       PLAYERNO      INTEGER UNSIGNED NOT NULL,
       PAYMENT_DATE  DATE NOT NULL,
       AMOUNT        DECIMAL(7,2) NOT NULL)

Example 20.7:

CREATE TABLE WIDTH (C4 INTEGER(4) ZEROFILL)
;
INSERT INTO WIDTH VALUES (1)
;
INSERT INTO WIDTH VALUES (200)

Example 20.8:

CREATE   TABLE PENALTIES
        (PAYMENTNO     INTEGER NOT NULL PRIMARY KEY,
         PLAYERNO      INTEGER NOT NULL,
         PAYMENT_DATE  DATE NOT NULL,
         AMOUNT        DECIMAL(7,2) ZEROFILL NOT NULL)
;
SELECT AMOUNT FROM PENALTIES

Example 20.9:

CREATE TABLE MEASUREMENTS (NO INTEGER,
   MEASUREMENT_VALUE FLOAT(19,3) ZEROFILL)
;
INSERT INTO MEASUREMENTS VALUES
   (1, 99.99),
   (2, 99999.99),
   (3, 99999999.99),
   (4, 99999999999.99),
   (5, 99999999999999.99),
   (6, 0.999999),
   (7, 0.9999999),
   (8, 99999999.9999),
   (9, (1.0/3))
;
SELECT * FROM MEASUREMENTS

Example 20.10:

CREATE TABLE CITY_NAMES
      (SEQNO   INTEGER UNSIGNED AUTO_INCREMENT
               NOT NULL PRIMARY KEY,
       NAME    VARCHAR(30) NOT NULL)

Example 20.11:

INSERT INTO CITY_NAMES VALUES (NULL, 'London')
;
INSERT INTO CITY_NAMES VALUES (NULL, 'New York')
;
INSERT INTO CITY_NAMES (NAME) VALUES ('Paris')
;
SELECT * FROM CITY_NAMES

Example 20.12:

INSERT INTO CITY_NAMES VALUES (8, 'Bonn')
;
INSERT INTO CITY_NAMES VALUES (NULL, 'Amsterdam')
;
SELECT * FROM CITY_NAMES

Example 20.13:

DELETE FROM CITY_NAMES
;
INSERT INTO CITY_NAMES VALUES (NULL, 'Phoenix')
;
INSERT INTO CITY_NAMES VALUES (NULL, 'Rome')

Example 20.14:

SET @@AUTO_INCREMENT_OFFSET = 10,
    @@AUTO_INCREMENT_INCREMENT = 10
;
CREATE TABLE T10
      (SEQNO  INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY)
;
INSERT INTO T10 VALUES (NULL),(NULL)
;
SELECT * FROM T10

Example 20.15:

CREATE TEMPORARY TABLE SUMPENALTIES
      (TOTAL DECIMAL(10,2))
;
INSERT INTO SUMPENALTIES
SELECT SUM(AMOUNT)
FROM   PENALTIES

Example 20.16:

CREATE TABLE TESTTABLE (C1 INTEGER)
;
INSERT INTO TESTTABLE VALUES (1)
;
CREATE TEMPORARY TABLE TESTTABLE (C1 INTEGER, C2 INTEGER)
;
INSERT INTO TESTTABLE VALUES (2, 3)
;
SELECT * FROM TESTTABLE

Example 20.17:

CREATE   TABLE IF NOT EXISTS TEAMS
        (TEAMNO      INTEGER NOT NULL PRIMARY KEY,
         PLAYERNO    INTEGER NOT NULL,
         DIVISION    CHAR(6) NOT NULL)

Example 20.18:

CREATE TABLE TEAMS_COPY1 LIKE TEAMS

Example 20.19:

CREATE TABLE TEAMS_COPY2 AS
(SELECT   *
FROM     TEAMS)

Example 20.20:

CREATE TABLE TEAMS_COPY3 AS
(SELECT   TEAMNO AS TNO, PLAYERNO AS PNO, DIVISION
FROM     TEAMS)
;
SELECT   *
FROM     TEAMS_COPY3

Example 20.21:

CREATE TABLE TEAMS_COPY4 AS
(SELECT   TEAMNO, PLAYERNO
FROM     TEAMS
WHERE    PLAYERNO = 27)

Example 20.22:

CREATE TEMPORARY TABLE TEAMS AS
(SELECT   *
  FROM     TEAMS

Example 20.23:

CREATE TABLE TEAMS_COPY5
      (TEAMNO     INTEGER NOT NULL PRIMARY KEY,
       PLAYERNO   INTEGER NULL,
       DIVISION   CHAR(10) NOT NULL) AS
(SELECT   *
FROM     TEAMS)
;
CREATE TABLE TEAMS_COPY5
      (PLAYERNO   INTEGER NULL,
       DIVISION   CHAR(10) NOT NULL) AS
(SELECT   *
FROM     TEAMS)

Example 20.24:

CREATE TABLE TEAMS_COPY6
      (PLAYERNO    INTEGER NULL,
       COMMENT     VARCHAR(100)) AS
(SELECT   *
FROM     TEAMS)
;
SELECT * FROM TEAMS_COPY6

Example 20.25:

CREATE   TABLE TEAMS_COPY7
        (TEAMNO INTEGER NOT NULL PRIMARY KEY)
REPLACE AS
(SELECT   * FROM TEAMS
UNION ALL
SELECT   2, 27, 'third'
ORDER BY 1, 3 DESC)
;
SELECT * FROM TEAMS_COPY7

Example 20.26:

CREATE TABLE PENALTIES
      (PAYMENTNO     INTEGER NOT NULL PRIMARY KEY,
       PLAYERNO      INTEGER NOT NULL,
       PAYMENT_DATE  DATE NOT NULL DEFAULT '1990-01-01',
       AMOUNT        DECIMAL(7,2) NOT NULL DEFAULT 50.00)
;
INSERT   INTO PENALTIES
        (PAYMENTNO, PLAYERNO)
VALUES  (15, 27)
;
INSERT   INTO PENALTIES
        (PAYMENTNO, PLAYERNO, PAYMENT_DATE, AMOUNT)
VALUES  (15, 27, DEFAULT, DEFAULT)

Example 20.27:

UPDATE   PENALTIES
SET      AMOUNT = DEFAULT

Example 20.28:

UPDATE   PENALTIES
SET      AMOUNT = YEAR(DEFAULT(PAYMENT_DATE))*10

Example 20.29:

CREATE TABLE PENALTIES
      (PAYMENTNO  INTEGER  NOT NULL PRIMARY KEY
          COMMENT    'Primary key of the table',
       PLAYERNO      INTEGER  NOT NULL
          COMMENT    'Player who has incurred the penalty',
       PAYMENT_DATE  DATE     NOT NULL
          COMMENT    'Date on which the penalty has been paid',
       AMOUNT        DECIMAL(7,2) NOT NULL
          COMMENT   'Amount of the penalty in dollars')
;
SELECT   COLUMN_NAME, COLUMN_COMMENT
FROM     INFORMATION_SCHEMA.COLUMNS
WHERE    TABLE_NAME = 'PENALTIES'

Example 20.30:

SHOW ENGINES

Example 20.31:

CREATE TABLE SEXES
   (SEX CHAR(1) NOT NULL PRIMARY KEY)
   ENGINE = MYISAM

Example 20.32:

SELECT   TABLE_NAME, ENGINE
FROM     INFORMATION_SCHEMA.TABLES
WHERE    TABLE_NAME IN ('PLAYERS', 'PENALTIES', 'SEXES')

Example 20.33:

CREATE TEMPORARY TABLE SUMPENALTIES
   (TOTAL DECIMAL(10,2))
   ENGINE = MEMORY

Example 20.34:

CREATE TABLE PENALTIES_1990
   (PAYMENTNO INTEGER NOT NULL PRIMARY KEY)
   ENGINE=MYISAM
;
INSERT INTO PENALTIES_1990 VALUES (1),(2),(3)
;
CREATE TABLE PENALTIES_1991
   (PAYMENTNO INTEGER NOT NULL PRIMARY KEY)
   ENGINE=MYISAM
;
INSERT INTO PENALTIES_1991 VALUES (4),(5),(6)
;
CREATE TABLE PENALTIES_1992
   (PAYMENTNO INTEGER NOT NULL PRIMARY KEY)
   ENGINE=MYISAM
;
INSERT INTO PENALTIES_1992 VALUES (7),(8),(9);
;
CREATE TABLE PENALTIES_ALL
   (PAYMENTNO INTEGER NOT NULL PRIMARY KEY)
   ENGINE = MERGE
   UNION  = (PENALTIES_1990,PENALTIES_1991,PENALTIES_1992)
   INSERT_METHOD = NO
;
SELECT * FROM PENALTIES_ALL

Example 20.35:

CREATE VIEW PENALTIES_ALL AS
SELECT * FROM PENALTIES_1990
UNION
SELECT * FROM PENALTIES_1991
UNION
SELECT * FROM PENALTIES_1992

Example 20.36:

CREATE TABLE CITY_NAMES
      (SEQNO   INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY,
       NAME    VARCHAR(30) NOT NULL)
   AUTO_INCREMENT = 10
;
INSERT INTO CITY_NAMES VALUES (NULL, 'London')
;
INSERT INTO CITY_NAMES VALUES (NULL, 'New York')
;
INSERT INTO CITY_NAMES VALUES (NULL, 'Paris')
;
SELECT * FROM CITY_NAMES

Example 20.37:

CREATE TABLE PENALTIES
      (PAYMENTNO     INTEGER  NOT NULL PRIMARY KEY
          COMMENT    'Primary key of the table',
       PLAYERNO      INTEGER  NOT NULL
          COMMENT    'Player who has incurred the penalty',
       PAYMENT_DATE  DATE     NOT NULL
          COMMENT   'Date on which the penalty has been paid',
       AMOUNT        DECIMAL(7,2) NOT NULL
          COMMENT   'Sum of the penalty in Euro''s')
   COMMENT = 'Penalties that have been paid by the tennis club'
;
SELECT   TABLE_NAME, TABLE_COMMENT
FROM     INFORMATION_SCHEMA.TABLES
WHERE    TABLE_NAME = 'PENALTIES'

Example 20.38:

CREATE TABLE MATCHES
   (MATCHNO    INTEGER NOT NULL PRIMARY KEY,
    TEAMNO     INTEGER NOT NULL,
    PLAYERNO   INTEGER NOT NULL,
    WON        SMALLINT NOT NULL,
    LOST       SMALLINT NOT NULL)
   AVG_ROW_LENGTH = 15
   MAX_ROWS = 2000000
   MIN_ROWS = 1000000

Example 20.39:

CREATE   TABLE TEAMS_CSV
        (TEAMNO      INTEGER NOT NULL,
         PLAYERNO    INTEGER NOT NULL,
         DIVISION    CHAR(6) NOT NULL)
   ENGINE = CSV
;
INSERT INTO TEAMS_CSV VALUES (1, 6, 'first')
;
INSERT INTO TEAMS_CSV VALUES (2, 27, 'second')

Example 20.40:

SELECT   *
FROM     MATCHES
INTO     OUTFILE 'C:/MATCHES_EXTERN.TXT'
         FIELDS TERMINATED BY ',' ENCLOSED BY '"'
;
CREATE   TABLE MATCHES_CSV
        (MATCHNO    INTEGER NOT NULL,
         TEAMNO     INTEGER NOT NULL,
         PLAYERNO   INTEGER NOT NULL,
         WON        SMALLINT NOT NULL,
         LOST       SMALLINT NOT NULL)
   ENGINE = CSV
;
FLUSH TABLE MATCHES_CSV
;
SELECT   *
FROM     MATCHES_CSV
WHERE    MATCHNO <= 4

Example 20.41:

SELECT   COLUMN_NAME, DATA_TYPE, CHAR_LENGTH, NULLABLE
FROM     COLUMNS
WHERE    TABLE_NAME = 'PLAYERS'
AND      TABLE_CREATOR = 'TENNIS'
ORDER BY COLUMN_NO

Example 20.42:

SELECT   'PLAYERS' AS TABLE_NAME, COUNT(*) AS NUMBER_ROWS,
        (SELECT   COUNT(*)
         FROM     COLUMNS
         WHERE    TABLE_NAME = 'PLAYERS'
         AND      TABLE_CREATOR = 'TENNIS') AS P
FROM     PLAYERS
UNION
SELECT   'TEAMS', COUNT(*),
        (SELECT   COUNT(*)
         FROM     COLUMNS
         WHERE    TABLE_NAME = 'TEAMS'
         AND      TABLE_CREATOR = 'TENNIS') AS T
FROM     TEAMS
UNION
SELECT   'PENALTIES', COUNT(*),
        (SELECT   COUNT(*)
         FROM     COLUMNS
         WHERE    TABLE_NAME = 'PENALTIES'
         AND      TABLE_CREATOR = 'TENNIS') AS PEN
FROM     PENALTIES
UNION
SELECT   'MATCHES', COUNT(*),
        (SELECT   COUNT(*)
         FROM     COLUMNS
         WHERE    TABLE_NAME = 'MATCHES'
         AND      TABLE_CREATOR = 'TENNIS') AS M
FROM     MATCHES
UNION
SELECT   'COMMITTEE_MEMBERS', COUNT(*),
        (SELECT   COUNT(*)
         FROM     COLUMNS
         WHERE    TABLE_NAME = 'COMMITTEE_MEMBERS'
         AND      TABLE_CREATOR = 'TENNIS') AS CM
FROM     COMMITTEE_MEMBERS
ORDER BY 1

Answer 20.6:

CREATE TABLE DEPARTMENT
     ( DEPNO     CHAR(5) NOT NULL PRIMARY KEY,
       BUDGET    DECIMAL(8,2),
       LOCATION  VARCHAR(30))

Answer 20.7:

CREATE TABLE P_COPY LIKE PLAYERS

Answer 20.8:

CREATE TABLE P2_COPY AS (SELECT * FROM PLAYERS)

Answer 20.9:

CREATE TABLE NUMBERS AS
(SELECT   PLAYERNO
FROM     PLAYERS
WHERE    TOWN = 'Stratford')

Example 21.2:

CREATE   TABLE DIPLOMAS
        (STUDENT     INTEGER NOT NULL,
         COURSE      INTEGER NOT NULL,
         DDATE       DATE NOT NULL,
         SUCCESSFUL  CHAR(1),
         LOCATION    VARCHAR(50),
         PRIMARY KEY (STUDENT, COURSE, DDATE))

Example 21.3:

CREATE   TABLE DIPLOMAS
        (STUDENT     INTEGER NOT NULL,
         COURSE      INTEGER NOT NULL,
         DDATE       DATE NOT NULL,
         SUCCESSFUL  CHAR(1),
         LOCATION    VARCHAR(50),
            PRIMARY KEY INDEX_PRIM (STUDENT, COURSE, DDATE))

Example 21.4:

CREATE   TABLE TEAMS
        (TEAMNO     INTEGER NOT NULL,
         PLAYERNO   INTEGER NOT NULL UNIQUE,
         DIVISION   CHAR(6) NOT NULL,
         PRIMARY KEY (TEAMNO))
;
CREATE   TABLE TEAMS
        (TEAMNO     INTEGER NOT NULL,
         PLAYERNO   INTEGER NOT NULL,
         DIVISION   CHAR(6) NOT NULL,
         PRIMARY KEY (TEAMNO),
         UNIQUE (PLAYERNO))

Example 21.5:

CREATE   TABLE PLAYERS
        (PLAYERNO     INTEGER NOT NULL,
         NAME         CHAR(15) NOT NULL,
         INITIALS     CHAR(3) NOT NULL,
         BIRTH_DATE   DATE,
         SEX          CHAR(1) NOT NULL,
         JOINED       SMALLINT NOT NULL,
         STREET       VARCHAR(30) NOT NULL,
         HOUSENO      CHAR(4),
         POSTCODE     CHAR(6),
         TOWN         VARCHAR(30) NOT NULL,
         PHONENO      CHAR(13),
         LEAGUENO     CHAR(4) UNIQUE,
         PRIMARY KEY  (PLAYERNO))

Example 21.6:

SET @@STORAGE_ENGINE = 'InnoDB'
;
CREATE   TABLE TEAMS
        (TEAMNO      INTEGER NOT NULL,
         PLAYERNO    INTEGER NOT NULL,
         DIVISION    CHAR(6) NOT NULL,
         PRIMARY KEY (TEAMNO),
         FOREIGN KEY (PLAYERNO)
            REFERENCES PLAYERS (PLAYERNO))
;
SELECT   *
FROM     TEAMS
WHERE    PLAYERNO NOT IN
        (SELECT   PLAYERNO
         FROM     PLAYERS)

Example 21.7:

CREATE   TABLE TEAMS
        (TEAMNO     INTEGER NOT NULL,
         PLAYERNO   INTEGER NOT NULL,
         DIVISION   CHAR(6) NOT NULL,
         PRIMARY KEY (TEAMNO),
         FOREIGN KEY (PLAYERNO) REFERENCES PLAYERS (PLAYERNO))

Example 21.8:

CREATE   TABLE MATCHES
        (MATCHNO     INTEGER NOT NULL,
         TEAMNO      INTEGER NOT NULL,
         PLAYERNO    INTEGER NOT NULL,
         WON         INTEGER NOT NULL,
         LOST        INTEGER NOT NULL,
         PRIMARY KEY (MATCHNO),
         FOREIGN KEY (TEAMNO) REFERENCES TEAMS (TEAMNO),
         FOREIGN KEY (PLAYERNO) REFERENCES PLAYERS (PLAYERNO))

Example 21.9:

CREATE   TABLE PENALTIES
        (PAYMENTNO     INTEGER NOT NULL,
         PLAYERNO      INTEGER NOT NULL,
         PAYMENT_DATE  DATE NOT NULL,
         AMOUNT        DECIMAL(7,2) NOT NULL,
         PRIMARY KEY (PAYMENTNO),
         FOREIGN KEY (PLAYERNO) REFERENCES PLAYERS (PLAYERNO))
;
CREATE   TABLE EMPLOYEES
        (EMPLOYEE_NO  CHAR(10) NOT NULL,
         MANAGER_NO   CHAR(10),
         PRIMARY KEY  (EMPLOYEE_NO),
         FOREIGN KEY  (MANAGER_NO)
            REFERENCES EMPLOYEES (EMPLOYEE_NO))

Example 21.10:

CREATE   TABLE PENALTIES
        (PAYMENTNO     INTEGER NOT NULL,
         PLAYERNO      INTEGER NOT NULL,
         PAYMENT_DATE  DATE NOT NULL,
         AMOUNT        DECIMAL(7,2) NOT NULL,
         PRIMARY KEY  (PAYMENTNO),
         FOREIGN KEY  (PLAYERNO) REFERENCES PLAYERS (PLAYERNO)
            ON UPDATE  RESTRICT
            ON DELETE  RESTRICT)

Example 21.11:

CREATE   TABLE PENALTIES
        (PAYMENTNO     INTEGER NOT NULL,
         PLAYERNO      INTEGER NOT NULL,
         PAYMENT_DATE  DATE NOT NULL,
         AMOUNT        DECIMAL(7,2) NOT NULL,
         PRIMARY KEY (PAYMENTNO),
         FOREIGN KEY (PLAYERNO) REFERENCES PLAYERS (PLAYERNO)
            ON DELETE CASCADE)
;
DELETE
FROM      PLAYERS
WHERE     PLAYERNO = 127
;
DELETE
FROM      PENALTIES
WHERE     PLAYERNO = 127

Example 21.12:

CREATE   TABLE PENALTIES
        (PAYMENTNO     INTEGER NOT NULL,
         PLAYERNO      INTEGER NOT NULL,
         PAYMENT_DATE  DATE NOT NULL,
         AMOUNT        DECIMAL(7,2) NOT NULL,
         PRIMARY KEY  (PAYMENTNO),
         FOREIGN KEY  (PLAYERNO) REFERENCES PLAYERS (PLAYERNO)
            ON DELETE SET NULL)

Example 21.13:

CREATE   TABLE PLAYERS_X
        (PLAYERNO  INTEGER NOT NULL,
         SEX     CHAR(1) NOT NULL
                 CHECK(SEX IN ('M', 'F')))

Example 21.14:

CREATE   TABLE PLAYERS_Y
        (PLAYERNO    INTEGER NOT NULL,
         BIRTH_DATE  DATE NOT NULL
                     CHECK(BIRTH_DATE > '1920-01-01'))

Example 21.15:

CREATE   TABLE PLAYERS_Z
        (PLAYERNO    SMALLINT NOT NULL,
         BIRTH_DATE  DATE,
         JOINED      SMALLINT NOT NULL,
         CHECK(YEAR(BIRTH_DATE) < JOINED))
;
CREATE   TABLE PLAYERS_W
        (PLAYERNO    SMALLINT,
         BIRTH_DATE  DATE     NOT NULL,
         JOINED      SMALLINT NOT NULL,
         CHECK(YEAR(BIRTH_DATE) < JOINED),
         CHECK(BIRTH_DATE > '1920-01-01'),
         CHECK(JOINED  < 1880))

Example 21.16:

CREATE   TABLE PLAYERS_V
        (PLAYERNO   SMALLINT NOT NULL,
         SEX        CHAR(1) NOT NULL
                    CHECK(SEX IN
                       (SELECT SEX FROM PLAYERS)))

Example 21.17:

CREATE   TABLE DIPLOMAS
        (STUDENT     INTEGER NOT NULL,
         COURSE      INTEGER NOT NULL,
         DDATE       DATE NOT NULL,
         SUCCESSFUL  CHAR(1),
         LOCATION    VARCHAR(50),
         CONSTRAINT  PRIMARY_KEY_DIPLOMAS
            PRIMARY KEY (STUDENT, COURSE, DDATE))

Example 21.18:

CREATE   TABLE PLAYERS
        (PLAYERNO     INTEGER NOT NULL,
         NAME         CHAR(15) NOT NULL,
         INITIALS     CHAR(3) NOT NULL,
         BIRTH_DATE   DATE,
         SEX          CHAR(1) NOT NULL,
         JOINED       SMALLINT NOT NULL,
         STREET       VARCHAR(30)  NOT NULL,
         HOUSENO      CHAR(4),
         POSTCODE     CHAR(6),
         TOWN         VARCHAR(30) NOT NULL,
         PHONE        CHAR(13),
         LEAGUENO     CHAR(4),
         CONSTRAINT PRIMARY_KEY_PLAYERS
            PRIMARY KEY(PLAYERNO),
         CONSTRAINT JOINED
            CHECK(JOINED > 1969),
         CONSTRAINT POSTCODE_SIX_CHARACTERS_LONG
            CHECK(POSTCODE LIKE '______'),
         CONSTRAINT ALLOWED_VALUES_SEX
            CHECK(SEX IN ('M', 'F')))

Answer 21.3:

CREATE   TABLE MATCHES
        (MATCHNO     INTEGER NOT NULL,
         TEAMNO      INTEGER NOT NULL,
         PLAYERNO    INTEGER NOT NULL,
         WON         INTEGER NOT NULL,
         LOST        INTEGER NOT NULL,
         PRIMARY KEY  (MATCHNO))
;
CREATE   TABLE MATCHES
        (MATCHNO     INTEGER NOT NULL PRIMARY KEY,
         TEAMNO      INTEGER NOT NULL,
         PLAYERNO    INTEGER NOT NULL,
         WON         INTEGER NOT NULL,
         LOST        INTEGER NOT NULL)

Example 22.1:

SHOW CHARACTER SET
;
SELECT   CHARACTER_SET_NAME, DESCRIPTION,
         DEFAULT_COLLATE_NAME, MAXLEN
FROM     INFORMATION_SCHEMA.CHARACTER_SETS

Example 22.2:

SHOW COLLATION LIKE 'utf8%'
;
SELECT   *
FROM     INFORMATION_SCHEMA.COLLATIONS
WHERE    COLLATION_NAME LIKE 'utf8%'

Example 22.3:

CREATE TABLE TABUCS2
      (C1  CHAR(10)     CHARACTER SET ucs2
                        NOT NULL PRIMARY KEY,
       C2  VARCHAR(10)  CHARACTER SET ucs2)

Example 22.4:

CREATE TABLE TABDEFKARSET
      (C1   CHAR(10) NOT NULL,
       C2   VARCHAR(10))
;
SELECT   COLUMN_NAME, CHARACTER_SET_NAME
FROM     INFORMATION_SCHEMA.COLUMNS
WHERE    TABLE_NAME = 'TABDEFKARSET'

Example 22.5:

CREATE TABLE TABUTF8
      (C1   CHAR(10) NOT NULL,
       C2   VARCHAR(10))
   DEFAULT CHARACTER SET utf8
;
SELECT   COLUMN_NAME, CHARACTER_SET_NAME
FROM     INFORMATION_SCHEMA.COLUMNS
WHERE    TABLE_NAME = 'TABUTF8'

Example 22.6:

SELECT   TABLE_NAME, COLUMN_NAME, COLLATION_NAME
FROM     INFORMATION_SCHEMA.COLUMNS
WHERE    TABLE_NAME IN ('TABUCS2', 'TABDEFKARSET')

Example 22.7:

CREATE TABLE TABCOLLATE
      (C1   CHAR(10)
            CHARACTER SET utf8
            COLLATE utf8_romanian_ci NOT NULL,
       C2   VARCHAR(10)
            CHARACTER SET utf8
            COLLATE utf8_spanish_ci)
;
SELECT   COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM     INFORMATION_SCHEMA.COLUMNS
WHERE    TABLE_NAME = 'TABCOLLATE'

Example 22.8:

CREATE TABLE TABDEFCOL
      (C1   CHAR(10) NOT NULL,
       C2   VARCHAR(10))
   CHARACTER SET utf8
   COLLATE utf8_romanian_ci
;
SELECT   COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM     INFORMATION_SCHEMA.COLUMNS
WHERE    TABLE_NAME = 'TABDEFCOL'

Example 22.9:

CREATE TABLE TWOCHARSETS
      (C1   CHAR(10) CHARACTER SET 'latin1' NOT NULL,
       C2   VARCHAR(10) CHARACTER SET 'hp8')
;
INSERT INTO TWOCHARSETS VALUES ('A', 'A')
;
SELECT   *
FROM     TWOCHARSETS
WHERE    C1 = C2

Example 22.10:

CREATE TABLE TWOCOLL
      (C1   CHAR(10) COLLATE  'latin1_general_ci' NOT NULL,
       C2   VARCHAR(10) COLLATE 'latin1_danish_ci')
;
INSERT INTO TWOCOLL VALUES ('A', 'A')
;
SELECT   *
FROM     TWOCOLL
WHERE    C1 = C2
;
SELECT   *
FROM     TWOCOLL
WHERE    C1 COLLATE latin1_danish_ci = C2
;
SELECT   *
FROM     TWOCOLL
WHERE    C1 COLLATE utf8_general_ci = C2

Example 22.11:

SELECT   _utf8'database'

Example 22.12:

SELECT   COLLATION(_utf8'database'),
         COLLATION(_utf8'database' COLLATE utf8_bin),
         COLLATION((SELECT MAX(NAME) FROM PLAYERS))

Example 22.13:

SELECT   CHARSET(_utf8'database'),
         CHARSET((SELECT MAX(NAME) FROM PLAYERS))

Example 22.14:

SELECT _latin1'Muller' AS NAME
UNION
SELECT CONCAT('M', _latin1 x'FC', 'ller')
ORDER BY NAME COLLATE latin1_swedish_ci

Example 22.15:

CREATE TABLE LETTERS
   (SEQNO    INTEGER NOT NULL PRIMARY KEY,
    LETTER   CHAR(1) CHARACTER SET UTF8 NOT NULL)
;
INSERT INTO LETTERS VALUES (1, 'e'), (2, 'é'),(3, 'ë')
;
SELECT   LETTER, COUNT(*)
FROM    (SELECT   LETTER COLLATE latin2_czech_cs AS LETTER
         FROM     LETTERS) AS LATIN2_CZECH_LETTERS
GROUP BY LETTER
;
SELECT   LETTER, COUNT(*)
FROM    (SELECT   LETTER COLLATE latin2_croatian_ci AS LETTER
         FROM     LETTERS) AS LATIN2_CROATIAN_LETTERS
GROUP BY LETTER

Example 22.16:

SELECT   LETTER
FROM     LETTERS
ORDER BY LETTER

Example 22.17:

SELECT   COERCIBILITY('Rick' COLLATE latin1_general_ci) AS C0,
         COERCIBILITY(TEAMNO) AS C2,
         COERCIBILITY(USER()) AS C3,
         COERCIBILITY('Rick') AS C4,
         COERCIBILITY(NULL) AS C5
FROM     TEAMS
WHERE    TEAMNO = 1

Example 22.18:

SELECT @@COLLATION_DATABASE

Example 22.19:

SHOW VARIABLES LIKE 'CHARACTER_SET%'

Answer 22.2:

SELECT   CHARACTER_SET_NAME, COUNT(*)
FROM     INFORMATION_SCHEMA.COLLATIONS
GROUP BY CHARACTER_SET_NAME

Answer 22.3:

SELECT CHARSET((SELECT MAX(TOWN) FROM PLAYERS)),
       COLLATION((SELECT MAX(TOWN) FROM PLAYERS))

Answer 22.4:

SELECT   TOWN
FROM     PLAYERS
ORDER BY TOWN COLLATE latin1_danish_ci

Example 23.1:

CREATE TABLE PLAYERS_SMALL
      (PLAYERNO     INTEGER NOT NULL PRIMARY KEY,
       NAME         CHAR(15) NOT NULL,
       INITIALS     CHAR(3) NOT NULL,
       BIRTH_DATE   DATE,
       SEX          ENUM ('M','F'))

Example 23.2:

INSERT INTO PLAYERS_SMALL
VALUES (24, 'Jones', 'P', '1985-04-22', 'M')
;
INSERT INTO PLAYERS_SMALL
VALUES (25, 'Marx', 'L', '1981-07-01', 'F')
;
INSERT INTO PLAYERS_SMALL
VALUES (111, 'Cruise', 'T', '1982-11-11', 'm')
;
INSERT INTO PLAYERS_SMALL
VALUES (199, 'Schroder', 'L', '1970-02-12', 'X')
;
INSERT INTO PLAYERS_SMALL
VALUES (201, 'Lie', 'T', '1972-02-12', NULL)
;
SELECT * FROM PLAYERS_SMALL

Example 23.3:

SELECT   PLAYERNO, SEX, SEX * 1
FROM     PLAYERS_SMALL

Example 23.4:

SELECT   PLAYERNO, SEX
FROM     PLAYERS_SMALL
ORDER BY SEX

Example 23.5:

CREATE TABLE SEXES
      (SEX        CHAR(1) NOT NULL PRIMARY KEY)
;
INSERT INTO SEXES VALUES ('M'),('F')
;
CREATE TABLE PLAYERS_SMALL2
      (PLAYERNO     INTEGER NOT NULL PRIMARY KEY,
       NAME         CHAR(15) NOT NULL,
       INITIALS     CHAR(3) NOT NULL,
       BIRTH_DATE   DATE,
       SEX          CHAR(1),
       FOREIGN KEY (SEX) REFERENCES SEXES (SEX))

Example 23.6:

CREATE TABLE TEAMS_NEW
      (TEAMNO     INTEGER NOT NULL PRIMARY KEY,
       PLAYERNO   INTEGER NOT NULL,
       DIVISION   SET ('first','second','third','fourth'))

Example 23.7:

INSERT INTO TEAMS_NEW VALUES (1, 27, 'first')
;
INSERT INTO TEAMS_NEW VALUES (2, 27, 'first,third')
;
INSERT INTO TEAMS_NEW VALUES (3, 27, 'first,third,sixth')
;
INSERT INTO TEAMS_NEW VALUES (4, 27, 'first,fifth')
;
INSERT INTO TEAMS_NEW VALUES (5, 27, NULL)
;
INSERT INTO TEAMS_NEW VALUES (6, 27, 7)
;
INSERT INTO TEAMS_NEW VALUES (7, 27, CONV(1001,2,10))
;
SELECT * FROM TEAMS_NEW

Example 23.8:

SELECT    TEAMNO, DIVISION * 1, BIN(DIVISION * 1)
FROM      TEAMS_NEW

Example 23.9:

CREATE TABLE SERIES_NUMBERS
      (NUMBERS SET
          ('1','2','3','4','5','6','7','8','9','10',
           '11','12','13','14','15','16','17','18','19','20',
           '21','22','23','24','25','26','27','28','29','30',
           '31','32','33','34','35','36','37','38','39','40'))
;
INSERT INTO SERIES_NUMBERS VALUES ('1'),('20'),('40')
;
SELECT    NUMBERS, BIN(NUMBERS * 1)
FROM      SERIES_NUMBERS

Example 23.10:

INSERT INTO TEAMS_NEW VALUES (8, 27, 'eighth')
;
INSERT INTO TEAMS_NEW VALUES (9, 27, '')
;
SELECT    TEAMNO, DIVISION, DIVISION * 1, BIN(DIVISION * 1)
FROM      TEAMS_NEW
WHERE     TEAMNO IN (8, 9)

Example 23.11:

SELECT    TEAMNO
FROM      TEAMS_NEW
WHERE     DIVISION = 'first'

Example 23.12:

SELECT   TEAMNO, DIVISION
FROM     TEAMS_NEW
WHERE    DIVISION & POWER(2,3-1) = POWER(2,3-1)

Example 23.13:

SELECT   TEAMNO, DIVISION
FROM     TEAMS_NEW
WHERE    DIVISION & 9 = 9

Example 23.14:

SELECT   TEAMNO,
         LENGTH(REPLACE(CONV((DIVISION * 1),10,2),'0',''))
         AS NUMBER
FROM     TEAMS_NEW

Example 23.15:

SELECT   TEAMNO,
         CASE WHEN (DIVISION & POWER(2,1-1) = POWER(2,1-1)) = 1
            THEN 'YES' ELSE 'NO' END AS FIRST,
         CASE WHEN (DIVISION & POWER(2,2-1) = POWER(2,2-1)) = 1
            THEN 'YES' ELSE 'NO' END AS SECOND,
         CASE WHEN (DIVISION & POWER(2,3-1) = POWER(2,3-1)) = 1
            THEN 'YES' ELSE 'NO' END AS THIRD,
         CASE WHEN (DIVISION & POWER(2,4-1) = POWER(2,4-1)) = 1
            THEN 'YES' ELSE 'NO' END AS FOURTH
FROM     TEAMS_NEW

Example 23.16:

SELECT   DIVISION, COUNT(*)
FROM     TEAMS_NEW
WHERE    DIVISION > 0
OR       DIVISION IS NULL
GROUP BY DIVISION

Example 23.17:

UPDATE   TEAMS_NEW
SET      DIVISION = DIVISION | POWER(2,3-1)
WHERE    TEAMNO = 1

Example 23.18:

UPDATE   TEAMS_NEW
SET      DIVISION = DIVISION & CONV(1011,2,10)

Example 23.19:

UPDATE   TEAMS_NEW
SET      DIVISION = 0

Answer 23.1:

CREATE TABLE MATCHES
      (MATCHNO      INTEGER NOT NULL PRIMARY KEY,
       TEAMNO       INTEGER NOT NULL,
       PLAYERNO     INTEGER NOT NULL,
       WON          ENUM('0','1','2','3') NOT NULL,
       LOST         ENUM('0','1','2','3') NOT NULL)

Example 24.1:

DROP TABLE PLAYERS

Example 24.2:

DROP TABLE DB8.TAB1

Example 24.3:

DROP TABLES COMMITTEE_MEMBERS, MATCHES, TEAMS,
     PENALTIES, PLAYERS

Example 24.4:

RENAME TABLE PLAYERS TO TENNIS_PLAYERS

Example 24.5:

RENAME TABLES PLAYERS TO TENNIS_PLAYERS,
       COMMITTEE_MEMBERS TO MEMBERS

Example 24.6:

ALTER TABLE PLAYERS RENAME TO TENNIS_PLAYERS

Example 24.7:

ALTER TABLE CITY_NAMES
   AUTO_INCREMENT = 10000
   COMMENT = 'New comment'

Example 24.8:

ALTER TABLE PLAYERS
   CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci

Example 24.9:

ALTER TABLE PLAYERS ORDER BY LEAGUENO DESC

Example 24.10:

ALTER   TABLE TEAMS
ADD     TYPE CHAR(1)

Example 24.11:

ALTER   TABLE TEAMS
ADD     TYPE CHAR(1) AFTER TEAMNO

Example 24.12:

ALTER   TABLE TEAMS
ADD    (CATEGORY  VARCHAR(20) NOT NULL,
        IMAGE     INTEGER DEFAULT 10)

Example 24.13:

ALTER   TABLE TEAMS
DROP    TYPE

Example 24.14:

ALTER   TABLE PLAYERS
CHANGE  BIRTH_DATE DATE_OF_BIRTH DATE

Example 24.15:

ALTER   TABLE PLAYERS
CHANGE  TOWN TOWN VARCHAR(40) NOT NULL

Example 24.16:

ALTER   TABLE PLAYERS
CHANGE  TOWN TOWN VARCHAR(5) NOT NULL

Example 24.17:

ALTER   TABLE PLAYERS
CHANGE  PLAYERNO PLAYERNO SMALLINT

Example 24.18:

ALTER   TABLE PLAYERS
CHANGE  TOWN TOWN VARCHAR(5) NOT NULL AFTER PLAYERNO

Example 24.19:

ALTER   TABLE PLAYERS
MODIFY  TOWN VARCHAR(5) NOT NULL AFTER PLAYERNO

Example 24.20:

ALTER   TABLE COMMITTEE_MEMBERS
ALTER   POSITION SET DEFAULT 'Member'
;
ALTER   TABLE COMMITTEE_MEMBERS
MODIFY  POSITION CHAR(20) DEFAULT 'Member'

Example 24.21:

ALTER   TABLE COMMITTEE_MEMBERS
ALTER   POSITION DROP DEFAULT

Example 24.22:

CREATE TABLE T1
      (A INTEGER NOT NULL PRIMARY KEY,
       B INTEGER NOT NULL)
;
CREATE TABLE T2
      (A INTEGER NOT NULL PRIMARY KEY,
       B INTEGER NOT NULL,
       CONSTRAINT C1 CHECK (B > 0),
       CONSTRAINT FK1 FOREIGN KEY (A) REFERENCES T1 (A))
;
ALTER TABLE T1
   ADD CONSTRAINT FK2 FOREIGN KEY (A) REFERENCES T2 (A)

Example 24.23:

ALTER TABLE PLAYERS DROP PRIMARY KEY

Example 24.24:

ALTER TABLE T1 DROP CONSTRAINT FK2

Example 24.25:

ALTER TABLE T2 DROP CONSTRAINT C1

Answer 24.1:

ALTER TABLE TEAMS
   ENGINE = MYISAM

Answer 24.2:

ALTER TABLE COMMITTEE_MEMBERS
   ORDER BY PLAYERNO ASC, POSITION DESC

Answer 24.3:

ALTER TABLE COMMITTEE_MEMBERS
   CHANGE POSITION COMMITTEE_POSITION CHAR(20)

Answer 24.4:

ALTER TABLE COMMITTEE_MEMBERS
   MODIFY COMMITTEE_POSITION CHAR(30)

Answer 24.5:

ALTER TABLE PLAYERS
   ALTER TOWN SET DEFAULT 'Stratford'

Example 25.4:

SELECT   *
FROM     PLAYERS
WHERE    PLAYERNO = 44

Example 25.5:

SELECT   PLAYERNO, TOWN
FROM     PLAYERS
WHERE    PLAYERNO < 10
AND      TOWN = 'Stratford'
ORDER BY PLAYERNO

Example 25.6:

SELECT   NAME, INITIALS
FROM     PLAYERS
WHERE    TOWN =
        (SELECT   TOWN
         FROM     PLAYERS
         WHERE    PLAYERNO = 44)

Example 25.7:

CREATE   INDEX PLAY_PC
ON       PLAYERS (POSTCODE ASC)
;
CREATE   INDEX PLAY_PC USING BTREE
ON       PLAYERS (POSTCODE ASC)

Example 25.8:

CREATE   INDEX PLAY_TOWN USING HASH
ON       PLAYERS (TOWN)

Example 25.9:

CREATE   INDEX MAT_WL
ON       MATCHES (WON, LOST)

Example 25.10:

CREATE   UNIQUE INDEX NAMEINIT
ON       PLAYERS (NAME, INITIALS)

Example 25.11:

ALTER TABLE TEAMS
ADD   INDEX TEAMS_DIVISION USING BTREE (DIVISION)

Example 25.12:

ALTER TABLE PLAYERS
ADD   UNIQUE INDEX TEAMS_DIVISION
      USING HASH (TOWN, STREET, BIRTH_DATE)

Example 25.13:

CREATE TABLE MATCHES
      (MATCHNO     INTEGER NOT NULL PRIMARY KEY,
       TEAMNO      INTEGER NOT NULL,
       PLAYERNO    INTEGER NOT NULL,
       WON         SMALLINT NOT NULL,
       LOST        SMALLINT NOT NULL,
       INDEX MAT_WL (WON, LOST))

Example 25.14:

CREATE   TABLE PLAYERS
        (PLAYERNO     INTEGER NOT NULL PRIMARY KEY,
         NAME         CHAR(15) NOT NULL,
         INITIALS     CHAR(3) NOT NULL,
         BIRTH_DATE   DATE,
         SEX          CHAR(1) NOT NULL,
         JOINED       SMALLINT NOT NULL,
         STREET       VARCHAR(30) NOT NULL,
         HOUSENO      CHAR(4),
         POSTCODE     CHAR(6),
         TOWN         VARCHAR(30) NOT NULL,
         PHONENO      CHAR(13),
         LEAGUENO     CHAR(4),
         UNIQUE INDEX NAMEINIT USING HASH (NAME, INITIALS))

Example 25.15:

DROP INDEX PLAY_PC ON PLAYERS
;
DROP INDEX MATD_WL ON MATCHES
;
DROP INDEX NAMEINIT ON PLAYERS

Example 25.16:

CREATE TABLE T1
      (COL1   INTEGER NOT NULL,
       COL2   DATE NOT NULL UNIQUE,
       COL3   INTEGER NOT NULL,
       COL4   INTEGER NOT NULL,
       PRIMARY KEY (COL1, COL4),
       UNIQUE (COL3, COL4),
       UNIQUE (COL3, COL1))
;
CREATE UNIQUE INDEX "PRIMARY" USING BTREE
ON     T1 (COL1, COL4)
;
CREATE UNIQUE INDEX COL2 USING BTREE
ON     T1 (COL2)
;
CREATE UNIQUE INDEX COL3 USING BTREE
ON     T1 (COL3, COL4)
;
CREATE UNIQUE INDEX COL3_2 USING BTREE
ON     T1 (COL3, COL1)


Example 25.17:

CREATE TABLE PLAYERS_XXL
      (PLAYERNO     INTEGER NOT NULL PRIMARY KEY,
       NAME         CHAR(15) NOT NULL,
       INITIALS     CHAR(3) NOT NULL,
       BIRTH_DATE   DATE,
       SEX          CHAR(1) NOT NULL,
       JOINED       SMALLINT NOT NULL,
       STREET       VARCHAR(30) NOT NULL,
       HOUSENO      CHAR(4),
       POSTCODE     CHAR(6),
       TOWN         VARCHAR(30) NOT NULL,
       PHONENO      CHAR(13),
       LEAGUENO     CHAR(8))

Example 25.18:

CREATE PROCEDURE FILL_PLAYERS_XXL
   (IN NUMBER_PLAYERS INTEGER)
BEGIN
   DECLARE COUNTER INTEGER;
   TRUNCATE TABLE PLAYERS_XXL;
   COMMIT WORK;
   SET COUNTER = 1;
   WHILE COUNTER <= NUMBER_PLAYERS DO
    INSERT INTO PLAYERS_XXL VALUES(
     COUNTER,
     CONCAT('name',CAST(COUNTER AS CHAR(10))),
     CASE MOD(COUNTER,2) WHEN 0 THEN 'vl1' ELSE 'vl2' END,
     DATE('1960-01-01') + INTERVAL (MOD(COUNTER,300)) MONTH,
     CASE MOD(COUNTER,20) WHEN 0 THEN 'F' ELSE 'M' END,
     1980 + MOD(COUNTER,20),
     CONCAT('street',CAST(COUNTER /10 AS UNSIGNED INTEGER)),
     CAST(CAST(COUNTER /10 AS UNSIGNED INTEGER)+1 AS CHAR(4)),
     CONCAT('p',MOD(COUNTER,50)),
     CONCAT('town',MOD(COUNTER,10)),
     '070-6868689',
     CASE MOD(COUNTER,3) WHEN 0
        THEN NULL ELSE cast(COUNTER AS CHAR(8)) END);
    IF MOD(COUNTER,1000) = 0 THEN
     COMMIT WORK;
    END IF;
    SET COUNTER = COUNTER + 1;
   END WHILE;
   COMMIT WORK;
END

Example 25.19:

CALL FILL_PLAYERS_XXL(100000)

Example 25.20:

CREATE INDEX PLAYERS_XXL_INITIALS
   ON PLAYERS_XXL(INITIALS)
;
CREATE INDEX PLAYERS_XXL_POSTCODE
   ON PLAYERS_XXL(POSTCODE)
;
CREATE INDEX PLAYERS_XXL_STREET
   ON PLAYERS_XXL(STREET)

Example 25.21:

SELECT   TABLE_CREATOR, TABLE_NAME, COUNT(*)
FROM     INDEXES
GROUP BY TABLE_CREATOR, TABLE_NAME
HAVING   COUNT(*) > 1

Example 25.22:

SELECT   TABLE_CREATOR, TABLE_NAME
FROM     TABLES AS TAB
WHERE    NOT EXISTS
        (SELECT   *
         FROM     INDEXES AS IDX
         WHERE    TAB.TABLE_CREATOR = IDX.TABLE_CREATOR
         AND      TAB.TABLE_NAME = TAB.TABLE_NAME
         AND      IDX.UNIQUE_ID = 'YES')

Example 25.23:

SHOW INDEX FROM PLAYERS

Example 26.1:

CREATE   VIEW TOWNS AS
SELECT   DISTINCT TOWN
FROM     PLAYERS
;
SELECT   *
FROM     TOWNS

Example 26.2:

CREATE   VIEW CPLAYERS AS
SELECT   PLAYERNO, LEAGUENO
FROM     PLAYERS
WHERE    LEAGUENO IS NOT NULL
;
SELECT   *
FROM     CPLAYERS

Example 26.3:

SELECT   *
FROM     CPLAYERS
WHERE    PLAYERNO BETWEEN 6 AND 44
;
SELECT   PLAYERNO, LEAGUENO
FROM     PLAYERS
WHERE    LEAGUENO IS NOT NULL
AND      PLAYERNO BETWEEN 6 AND 44

Example 26.4:

DELETE
FROM     CPLAYERS
WHERE    LEAGUENO = '7060'

Example 26.5:

CREATE   VIEW SEVERAL AS
SELECT   *
FROM     CPLAYERS
WHERE    PLAYERNO BETWEEN 6 AND 27
;
SELECT   *
FROM     SEVERAL

Example 26.6:

CREATE VIEW DIGITS AS
SELECT 0 DIGIT UNION SELECT 1 UNION
SELECT 2 UNION SELECT 3 UNION
SELECT 4 UNION SELECT 5 UNION
SELECT 6 UNION SELECT 7 UNION
SELECT 8 UNION SELECT 9
;
SELECT * FROM DIGITS

Example 26.7:

CREATE   VIEW STRATFORDERS (PLAYERNO, NAME, INIT, BORN) AS
SELECT   PLAYERNO, NAME, INITIALS, BIRTH_DATE
FROM     PLAYERS
WHERE    TOWN = 'Stratford'
;
SELECT   *
FROM     STRATFORDERS
WHERE    PLAYERNO > 90

Example 26.8:

CREATE   VIEW RESIDENTS AS
SELECT   TOWN, COUNT(*)
FROM     PLAYERS
GROUP BY TOWN
;
SELECT   TOWN, "COUNT(*)"
FROM     RESIDENTS

Example 26.9:

CREATE   VIEW VETERANS AS
SELECT   *
FROM     PLAYERS
WHERE    BIRTH_DATE < '1960-01-01'
;
UPDATE   VETERANS
SET      BIRTH_DATE = '1970-09-01'
WHERE    PLAYERNO = 2
;
CREATE   VIEW VETERANS AS
SELECT   *
FROM     PLAYERS
WHERE    BIRTH_DATE < '1960-01-01'
WITH     CHECK OPTION

Example 26.10:

CREATE   VIEW INGLEWOOD_VETERANS AS
SELECT   *
FROM     VETERANS
WHERE    TOWN = 'Inglewood'
WITH     CASCADED CHECK OPTION

Example 26.11:

CREATE   DEFINER = 'JACO'@'%' VIEW JACO_VIEW AS
SELECT   *
FROM     PLAYERS
WHERE    PLAYERNO > 100

Example 26.12:

CREATE   SQL SECURITY INVOKER
         ALGORITHM = MERGE
         VIEW SIMPLE_VIEW AS
SELECT   PLAYERNO
FROM     PLAYERS
WHERE    PLAYERNO > 100

Example 26.13:

DROP VIEW CPLAYERS

Example 26.14:

SELECT   TABLE_NAME
FROM     TABLES
WHERE    TABLE_NAME = 'STOCK'
AND      TABLE_CREATOR = 'TENNIS'
UNION
SELECT   VIEW_NAME
FROM     VIEWS
WHERE    VIEW_NAME = 'STOCK'
AND      VIEW_CREATOR = 'TENNIS'

Example 26.15:

CREATE   VIEW COST_RAISERS AS
SELECT   *
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PENALTIES)
;
SELECT   PLAYERNO
FROM     COST_RAISERS
WHERE    TOWN = 'Stratford'
;
SELECT   PLAYERNO
FROM    (SELECT   *
         FROM     PLAYERS
         WHERE    PLAYERNO IN
                 (SELECT   PLAYERNO
                  FROM     PENALTIES)) AS VIEWFORMULA
WHERE    TOWN = 'Stratford'

Example 26.16:

DELETE
FROM     STRATFORDERS
WHERE    BORN > '1965-12-31'
;
DELETE
FROM     PLAYERS
WHERE    BIRTH_DATE > '1965-12-31'
AND      TOWN = 'Stratford'
;
SELECT   *
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PENALTIES)

Example 26.17:

CREATE   VIEW EXPENSIVE_PLAYERS AS
         ALORITHM = TEMPTABLE
SELECT   *
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PENALTIES)

Example 26.18:

SELECT   *
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PENALTIES)
AND      TOWN = 'Stratford'
;
SELECT   TOWN, COUNT(*)
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PENALTIES)
GROUP BY TOWN
;
CREATE   VIEW PPLAYERS AS
SELECT   *
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     PENALTIES)
;
SELECT   *
FROM     PPLAYERS
WHERE    TOWN = 'Stratford'
;
SELECT   TOWN, COUNT(*)
FROM     PPLAYERS
GROUP BY TOWN

Example 26.20:

SELECT   DISTINCT NAME, INITIALS, DIVISION
FROM     PLAYERS AS P, MATCHES AS M, TEAMS AS T
WHERE    P.PLAYERNO = M.PLAYERNO
AND      M.TEAMNO = T.TEAMNO
;
CREATE   VIEW TEAMS (TEAMNO, PLAYERNO, DIVISION) AS
SELECT   DISTINCT TEAMNO, CAPTAIN, DIVISION
FROM     RESULT
;
CREATE   VIEW MATCHES AS
SELECT   MATCHNO, TEAMNO, PLAYERNO,
         WON, LOST
FROM     RESULT

Example 26.21:

CREATE   VIEW PLAYERSS AS
SELECT   *
FROM     PLAYERS
WHERE    SEX IN ('M', 'F')
WITH     CHECK OPTION

Answer 26.1:

CREATE   VIEW NUMBERPLS (TEAMNO, NUMBER) AS
SELECT   TEAMNO, COUNT(*)
FROM     MATCHES
GROUP BY TEAMNO

Answer 26.2:

CREATE   VIEW WINNERS AS
SELECT   PLAYERNO, NAME
FROM     PLAYERS
WHERE    PLAYERNO IN
        (SELECT   PLAYERNO
         FROM     MATCHES
         WHERE    WON > LOST)

Answer 26.3:

CREATE   VIEW TOTALS (PLAYERNO, SUM_PENALTIES) AS
SELECT   PLAYERNO, SUM(AMOUNT)
FROM     PENALTIES
GROUP BY PLAYERNO

Answer 26.5.1:

SELECT   YEAR(BORN) – 1900 AS DIFFERENCE, COUNT(*)
FROM    (SELECT   PLAYERNO, NAME,
                  INITIALS, BIRTH_DATE AS BORN
         FROM     PLAYERS
         WHERE    TOWN = 'Stratford') AS STRATFORDERS
GROUP BY DIFFERENCE

Answer 26.5.2:

SELECT   EXPENSIVE.PLAYERNO
FROM    (SELECT   *
         FROM     PLAYERS
         WHERE    PLAYERNO IN
                 (SELECT   PLAYERNO
                  FROM     PENALTIES)) AS EXPENSIVE,
        (SELECT   PLAYERNO, NAME,
                  INITIALS, BIRTH_DATE AS BORN
         FROM     PLAYERS
         WHERE    TOWN = 'Stratford') AS STRATFORDERS
WHERE    EXPENSIVE.PLAYERNO = STRATFORDERS.PLAYERNO

Answer 26.5.3:

UPDATE   PLAYERS
SET      BIRTH_DATE = '1950-04-04'
WHERE    PLAYERNO = 7

Example 27.1:

SELECT   SCHEMA_NAME
FROM     INFORMATION_SCHEMA.SCHEMATA

Example 27.2:

SELECT   TABLE_NAME
FROM     INFORMATION_SCHEMA.TABLES
WHERE    TABLE_SCHEMA = 'TENNIS'
ORDER BY TABLE_NAME

Example 27.3:

CREATE DATABASE TENNIS2
   DEFAULT CHARACTER SET utf8
   DEFAULT COLLATE utf8_general_ci

Example 27.4:

SELECT   SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME,
         DEFAULT_COLLATION_NAME
FROM     INFORMATION_SCHEMA.SCHEMATA

Example 27.5:

ALTER DATABASE TENNIS2
   DEFAULT CHARACTER SET sjis
   DEFAULT COLLATE sjis_japanese_ci

Example 27.6:

ALTER DATABASE TENNIS CHARACTER SET hp8
;
CREATE TABLE CHARSETHP8
      (C1  CHAR(10) NOT NULL,
       C2  VARCHAR(10))
;
SELECT   COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM     INFORMATION_SCHEMA.COLUMNS
WHERE    TABLE_NAME = 'CHARSETHP8'

Example 27.7:

ALTER DATABASE TENNIS COLLATE hp8_bin

Example 27.8:

DROP DATABASE TENNIS2

Example 28.1:

CREATE USER
   'CHRIS'@'localhost' IDENTIFIED BY 'CHRISSEC',
   'PAUL'@'localhost' IDENTIFIED BY 'LUAP'

Example 28.2:

CREATE USER
   'CHRIS1'@'sql.r20.com' IDENTIFIED BY 'CHRISSEC1',
   'CHRIS2'@'%' IDENTIFIED BY 'CHRISSEC2',
   'CHRIS3'@'%.r20.com' IDENTIFIED BY 'CHRISSEC3'
;
SELECT   *
FROM     USERS
WHERE    USER_NAME LIKE '''CHRIS%'
ORDER    BY 1

Example 28.3:

DROP USER JIM

Example 28.4:

RENAME USER
   'CHRIS1'@'sql.r20.com' TO 'COMBO1'@'sql.r20.com',
   'CHRIS2'@'%' TO 'COMBO2'@'sql.r20.com'
;
SELECT   *
FROM     USERS
WHERE    USER_NAME LIKE '''COMBO%'
ORDER    BY 1

Example 28.5:

SET PASSWORD FOR 'JOHN'= PASSWORD('JOHN1')

Example 28.6:

SET PASSWORD FOR ROB = PASSWORD('ROBSEC')

Example 28.7:

GRANT   SELECT
ON      PLAYERS
TO      JAMIE

Example 28.8:

GRANT   SELECT
ON      PLAYERS
TO      'JAMIE'@'localhost' IDENTIFIED BY 'JAMIEPASS'

Example 28.9:

GRANT   INSERT, UPDATE
ON      TEAMS
TO      JAMIE, PIET

Example 28.10:

GRANT   UPDATE (PLAYERNO, DIVISION)
ON      TEAMS
TO      PETE

Example 28.11:

GRANT   SELECT
ON      TENNIS.*
TO      PETE

Example 28.12:

GRANT   CREATE, ALTER, DROP, CREATE VIEW
ON      TENNIS.*
TO      JIM

Example 28.13:

GRANT   SELECT
ON      INFORMATION_SCHEMA.*
TO      PETE

Example 28.14:

GRANT   SELECT, INSERT
ON      *
TO      ALYSSA

Example 28.15:

GRANT   CREATE, ALTER, DROP
ON      *.*
TO      MAX

Example 28.16:

GRANT   CREATE USER
ON      *.*
TO      ALYSSA
;
GRANT   ALL PRIVILEGES
ON      *.*
TO      ROOT

Example 28.17:

GRANT   REFERENCES
ON      TEAMS
TO      JOHN
WITH    GRANT OPTION
;
GRANT   REFERENCES
ON      TEAMS
TO      PETE

Example 28.18:

GRANT   INSERT
ON      COMMITTEE_MEMBERS
TO      MARC
;
GRANT   SELECT
ON      COMMITTEE_MEMBERS
TO      MARC
WITH    GRANT OPTION

Example 28.19:

GRANT   SELECT
ON      *.*
TO      SAM
WITH    GRANT OPTION

Example 28.20:

GRANT   SELECT
ON      *
TO      JIM
WITH    MAX_QUERIES_PER_HOUR 1

Example 28.21:

SELECT   GRANTEE
FROM     USER_AUTHS
WHERE    PRIVILEGE = 'SELECT'
UNION
SELECT   GRANTEE
FROM     DATABASE_AUTHS
WHERE    DATABASE_NAME = 'TENNIS'
AND      PRIVILEGE = 'SELECT'
UNION
SELECT   GRANTEE
FROM     TABLE_AUTHS
WHERE    TABLE_CREATOR = 'TENNIS'
AND      PRIVILEGE = 'SELECT'
AND      TABLE_NAME = 'PLAYERS'

Example 28.22:

REVOKE   SELECT
ON       PLAYERS
FROM     JIM

Example 28.23:

REVOKE   REFERENCES
ON       TEAMS
FROM     JIM

Example 28.24:

REVOKE  INSERT, SELECT
ON      COMMITTEE_MEMBERS
FROM    MARC
;
REVOKE  GRANT OPTION
ON      COMMITTEE_MEMBERS
FROM    MARC

Example 28.25:

CREATE USER 'DIANE'@'localhost' IDENTIFIED BY 'SECRET'
;
CREATE   VIEW NAME_ADDRESS AS
SELECT   NAME, INITIALS, STREET, HOUSENO,
         TOWN
FROM     PLAYERS
WHERE    LEAGUENO IS NULL
;
GRANT   SELECT
ON      NAME_ADDRESS
TO      DIANE

Example 28.26:

CREATE USER 'GERARD'@'localhost' IDENTIFIED BY 'XYZ1234'
;
CREATE   VIEW RESIDENTS (TOWN, NUMBER_OF) AS
SELECT   TOWN, COUNT(*)
FROM     PLAYERS
GROUP BY TOWN
;
GRANT   SELECT
ON      RESIDENTS
TO      GERARD

Answer 28.1:

CREATE  USER RONALDO IDENTIFIED BY 'NIKE'

Answer 28.2:

DROP    USER RONALDO

Answer 28.3:

GRANT   SELECT, INSERT
ON      PLAYERS
TO      RONALDO

Answer 28.4:

GRANT   UPDATE(STREET, HOUSENO, POSTCODE, TOWN)
ON      PLAYERS
TO      RONALDO

Answer 28.5:

GRANT   INSERT
ON      TENNIS.*
TO      JACO, DIANE

Example 29.1:

SHOW INDEX FROM PLAYERS

Example 29.2:

CREATE INDEX PLAYERS_TOWN
    ON PLAYERS (TOWN)
;
SHOW INDEX FROM PLAYERS

Example 29.3:

ANALYZE TABLE PLAYERS
;
SHOW INDEX FROM PLAYERS

Example 29.4:

CHECKSUM TABLE PLAYERS

Example 29.5:

OPTIMIZE TABLE PLAYERS

Example 29.6:

CHECK TABLE PLAYERS

Example 29.7:

SELECT   TABLE_NAME, CHECK_TIME
FROM     INFORMATION_SCHEMA.TABLES
WHERE    TABLE_NAME = 'PLAYERS'
AND      TABLE_SCHEMA = 'TENNIS'

Example 29.8:

REPAIR TABLE PLAYERS

Example 29.9:

BACKUP TABLE PLAYERS TO 'C:/WORKING_AREA'

Example 29.10:

RESTORE TABLE PLAYERS FROM 'C:/WORKING_AREA'

Example 31.1:

CREATE PROCEDURE DELETE_MATCHES
   (IN P_PLAYERNO INTEGER)
BEGIN
   DELETE
   FROM   MATCHES
   WHERE  PLAYERNO = P_PLAYERNO;
END

Example 31.2:

CALL DELETE_MATCHES (8)

Example 31.5:

CREATE PROCEDURE TEST
   (OUT NUMBER1 INTEGER)
BEGIN
   DECLARE NUMBER2 INTEGER DEFAULT 100;
   SET NUMBER1 = NUMBER2;
END
;
CALL TEST (@NUMBER)
;
SELECT @NUMBER

Example 31.6:

CREATE PROCEDURE TEST
   (OUT NUMBER1 INTEGER)
BEGIN
   DECLARE NUMBER2 INTEGER
      DEFAULT (SELECT COUNT(*) FROM PLAYERS);
   SET NUMBER1 = NUMBER2;
END

Example 31.7:

CREATE PROCEDURE DIFFERENCE
   (IN P1 INTEGER,
    IN P2 INTEGER,
    OUT P3 INTEGER)
BEGIN
   IF P1 > P2 THEN
      SET P3 = 1;
   ELSEIF P1 = P2 THEN
      SET P3 = 2;
   ELSE
      SET P3 = 3;
   END IF;
END

Example 31.8:

CREATE PROCEDURE FIBONNACI
   (INOUT NUMBER1 INTEGER,
    INOUT NUMBER2 INTEGER,
    INOUT NUMBER3 INTEGER)
BEGIN
   SET NUMBER3 = NUMBER1 + NUMBER2;
   IF NUMBER3 > 10000 THEN
      SET NUMBER3 = NUMBER3 - 10000;
   END IF;
   SET NUMBER1 = NUMBER2;
   SET NUMBER2 = NUMBER3;
END
;
SET @A=16, @B=27
;
SELECT @C
;
SELECT @C
;
SELECT @C

Example 31.9:

CREATE PROCEDURE LARGEST
   (OUT T CHAR(10))
BEGIN
   IF (SELECT COUNT(*) FROM PLAYERS) >
      (SELECT COUNT(*) FROM PENALTIES) THEN
      SET T = 'PLAYERS';
   ELSEIF (SELECT COUNT(*) FROM PLAYERS) =
          (SELECT COUNT(*) FROM PENALTIES) THEN
      SET T = 'EQUAL';
   ELSE
      SET T = 'PENALTIES';
   END IF;
END

Example 31.10:

CREATE PROCEDURE AGE
   (IN  START_DATE  DATE,
    IN  END_DATE    DATE,
    OUT YEARS       INTEGER,
    OUT MONTHS      INTEGER,
    OUT DAYS        INTEGER)
BEGIN
   DECLARE NEXT_DATE, PREVIOUS_DATE DATE;
   SET YEARS = 0;
   SET PREVIOUS_DATE = START_DATE;
   SET NEXT_DATE = START_DATE + INTERVAL 1 YEAR;
   WHILE NEXT_DATE < END_DATE DO
      SET YEARS = YEARS + 1;
      SET PREVIOUS_DATE = NEXT_DATE;
      SET NEXT_DATE = NEXT_DATE + INTERVAL 1 YEAR;
   END WHILE;
   SET MONTHS = 0;
   SET NEXT_DATE = PREVIOUS_DATE + INTERVAL 1 MONTH;
   WHILE NEXT_DATE < END_DATE DO
      SET MONTHS = MONTHS + 1;
      SET PREVIOUS_DATE = NEXT_DATE;
      SET NEXT_DATE = NEXT_DATE + INTERVAL 1 MONTH;
   END WHILE;
   SET DAYS = 0;
   SET NEXT_DATE = PREVIOUS_DATE + INTERVAL 1 DAY;
   WHILE NEXT_DATE <= END_DATE DO
      SET DAYS = DAYS + 1;
      SET PREVIOUS_DATE = NEXT_DATE;
      SET NEXT_DATE = NEXT_DATE + INTERVAL 1 DAY;
   END WHILE;
END
;
SET @START = '1991-01-12'
;
SET @END = '1999-07-09'
;
CALL AGE (@START, @END, @YEAR, @MONTH, @DAY)
;
SELECT @START, @END, @YEAR, @MONTH, @DAY

Example 31.11:

CREATE PROCEDURE SMALL_EXIT
   (OUT P1 INTEGER, OUT P2 INTEGER)
BEGIN
   SET P1 = 1;
   SET P2 = 1;
   BLOCK1 : BEGIN
      LEAVE BLOCK1;
      SET P2 = 3;
   END;
   SET P1 = 4;
END

Example 31.12:

CREATE PROCEDURE WAIT
   (IN WAIT_SECONDS INTEGER)
BEGIN
   DECLARE END_TIME INTEGER
      DEFAULT NOW() + INTERVAL WAIT_SECONDS SECOND;
   WAIT_LOOP: LOOP
      IF NOW() > END_TIME THEN
         LEAVE WAIT_LOOP;
      END IF;
   END LOOP WAIT_LOOP;
END

Example 31.13:

CREATE PROCEDURE AGAIN
   (OUT RESULT INTEGER)
BEGIN
   DECLARE COUNTER INTEGER DEFAULT 1;
   SET RESULT = 0;
   LOOP1: WHILE COUNTER <= 1000 DO
      SET COUNTER = COUNTER + 1;
      IF COUNTER > 100 THEN
         LEAVE LOOP1;
      ELSE
         ITERATE LOOP1;
      END IF;
      SET RESULT = COUNTER * 10;
   END WHILE LOOP1;
END

Example 31.14:

CALL WAIT ((SELECT COUNT(*) FROM PENALTIES))


Example 31.15:

CREATE TABLE PLAYERS_WITH_PARENTS
      (PLAYERNO         INTEGER NOT NULL PRIMARY KEY,
       FATHER_PLAYERNO  INTEGER,
       MOTHER_PLAYERNO  INTEGER)
;
ALTER TABLE PLAYERS_WITH_PARENTS ADD
   FOREIGN KEY (FATHER_PLAYERNO)
      REFERENCES PLAYERS_WITH_PARENTS (PLAYERNO)
;
ALTER TABLE PLAYERS_WITH_PARENTS ADD
   FOREIGN KEY (MOTHER_PLAYERNO)
      REFERENCES PLAYERS_WITH_PARENTS (PLAYERNO)
;
INSERT INTO PLAYERS_WITH_PARENTS VALUES
   (9,NULL,NULL), (8,NULL,NULL), (7,NULL,NULL), (6,NULL,NULL),
   (5,NULL,NULL), (4,8,9), (3,6,7), (2,4,5), (1,2,3)
;
CREATE PROCEDURE TOTAL_NUMBER_OF_PARENTS
   (IN P_PLAYERNO INTEGER,
    INOUT NUMBER INTEGER)
BEGIN
   DECLARE V_FATHER, V_MOTHER INTEGER;
   SET V_FATHER =
      (SELECT   FATHER_PLAYERNO
       FROM     PLAYERS_WITH_PARENTS
       WHERE    PLAYERNO = P_PLAYERNO);
   SET V_MOTHER =
      (SELECT   MOTHER_PLAYERNO
       FROM     PLAYERS_WITH_PARENTS
       WHERE    PLAYERNO = P_PLAYERNO);
   IF V_FATHER IS NOT NULL THEN
      CALL TOTAL_NUMBER_OF_PARENTS (V_FATHER, NUMBER);
      SET NUMBER = NUMBER + 1;
   END IF;
   IF V_MOTHER IS NOT NULL THEN
      CALL TOTAL_NUMBER_OF_PARENTS (V_MOTHER, NUMBER);
      SET NUMBER = NUMBER + 1;
   END IF;
END
;
SET @NUMBER = 0
;
CALL TOTAL_NUMBER_OF_PARENTS (1, @NUMBER)
;
SELECT @NUMBER

Example 31.16:

CREATE PROCEDURE TOTAL_PENALTIES_PLAYER
   (IN P_PLAYERNO INTEGER,
    OUT TOTAL_PENALTIES DECIMAL(8,2))
BEGIN
   SELECT SUM(AMOUNT)
   INTO   TOTAL_PENALTIES
   FROM   PENALTIES
   WHERE  PLAYERNO = P_PLAYERNO;
END
;
CALL TOTAL_PENALTIES_PLAYER (27, @TOTAL)
;
SELECT @TOTAL
;
SELECT   FATHER_PLAYERNO, MOTHER_PLAYERNO
INTO     V_FATHER, V_MOTHER
FROM     PLAYERS_WITH_PARENTS
WHERE    PLAYERNO = P_PLAYERNO

Example 31.17:

CREATE PROCEDURE GIVE_ADDRESS
   (IN  P_PLAYERNO SMALLINT,
    OUT P_STREET   VARCHAR(30),
    OUT P_HOUSENO  CHAR(4),
    OUT P_TOWN     VARCHAR(30),
    OUT P_POSTCODE CHAR(6))
BEGIN
   SELECT TOWN, STREET, HOUSENO, POSTCODE
   INTO   P_TOWN, P_STREET, P_HOUSENO, P_POSTCODE
   FROM   PLAYERS
   WHERE  PLAYERNO = P_PLAYERNO;
END

Example 31.18:

CREATE TABLE FIBON
      (NUMBER1   INTEGER NOT NULL PRIMARY KEY,
       NUMBER2   INTEGER NOT NULL)
;
CREATE PROCEDURE FIBONNACI_START()
BEGIN
   DELETE FROM FIBON;
   INSERT INTO FIBON (NUMBER, NUMBER2) VALUES (16, 27);
END
;
CREATE PROCEDURE FIBONNACI_GIVE
   (INOUT NUMBER INTEGER)
BEGIN
   DECLARE N1, N2 INTEGER;
   SELECT NUMBER1, NUMBER2
   INTO   N1, N2
   FROM   FIBON;
   SET NUMBER = N1 + N2;
   IF NUMBER > 10000 THEN
      SET NUMBER = NUMBER - 10000;
   END IF;
   SET N1 = N2;
   SET N2 = NUMBER;
   UPDATE FIBON
   SET    NUMBER1 = N1,
          NUMBER2 = N2;
END
;
CALL FIBONNACI_START()
;
CALL FIBONNACI_GIVE(@C)
;
SELECT @C
;
CALL FIBONNACI_GIVE(@C)
;
SELECT @C
;
CALL FIBONNACI_GIVE(@C)
;
SELECT @C

Example 31.19:

CREATE PROCEDURE DELETE_PLAYER
   (IN P_PLAYERNO INTEGER)
BEGIN
   DECLARE NUMBER_OF_ PENALTIES INTEGER;
   DECLARE NUMBER_OF_TEAMS  INTEGER;
   SELECT COUNT(*)
   INTO   NUMBER_OF_PENALTIES
   FROM   PENALTIES
   WHERE  PLAYERNO = P_PLAYERNO;
   SELECT COUNT(*)
   INTO   NUMBER_OF_TEAMS
   FROM   TEAMS
   WHERE  PLAYERNO = P_PLAYERNO_;
   IF NUMBER_OF_PENALTIES = 0 AND NUMBER_OF_TEAMS = 0 THEN
      CALL DELETE_MATCHES (P_PLAYERNO);
      DELETE FROM PLAYERS
      WHERE  PLAYERNO = P_PLAYERNO;
   END IF;
END

Example 31.20:

CREATE PROCEDURE DUPLICATE
   (OUT P_PROCESSED SMALLINT)
BEGIN
   SET P_PROCESSED = 1;
   INSERT INTO TEAMS VALUES (2,27,'third');
   SET P_PROCESSED = 2;
END
;
CALL DUPLICATE(PROCESSED)

Example 31.21:

CREATE PROCEDURE SMALL_MISTAKE1
   (OUT ERROR CHAR(5))
BEGIN
   DECLARE CONTINUE HANDLER FOR SQLSTATE '23000'
      SET ERROR = '23000';
   SET ERROR = '00000';
   INSERT INTO TEAMS VALUES (2,27,'third');
END

Example 31.22:

CREATE PROCEDURE SMALL_MISTAKE2
   (OUT ERROR CHAR(5))
BEGIN
   DECLARE CONTINUE HANDLER FOR SQLSTATE '23000'
      SET ERROR = '23000';
   DECLARE CONTINUE HANDLER FOR SQLSTATE '21S01'
      SET ERROR = '21S01';
   SET ERROR = '00000';
   INSERT INTO TEAMS VALUES (2,27,'third',5);
END

Example 31.23:

CREATE PROCEDURE SMALL_MISTAKE3
   (OUT ERROR CHAR(5))
BEGIN
   DECLARE CONTINUE HANDLER FOR SQLWARNING, NOT FOUND,
      SQLEXCEPTION SET ERROR = 'XXXXX';
   SET ERROR = '00000';
   INSERT INTO TEAMS VALUES (2,27,'third');
END

Example 31.24:

CREATE PROCEDURE SMALL_MISTAKE4
   (OUT ERROR CHAR(5))
BEGIN
   DECLARE NON_UNIQUE CONDITION FOR SQLSTATE '23000';
   DECLARE CONTINUE HANDLER FOR NON_UNIQUE
      SET ERROR = '23000';
   SET ERROR = '00000';
   INSERT INTO TEAMS VALUES (2,27,'third');
END

Example 31.25:

CREATE PROCEDURE SMALL_MISTAKE5
   (OUT ERROR CHAR(5))
BEGIN
   DECLARE NON_UNIQUE CONDITION FOR SQLSTATE '23000';
   DECLARE CONTINUE HANDLER FOR NON_UNIQUE
      SET ERROR = '23000';
   BEGIN
      DECLARE CONTINUE HANDLER FOR NON_UNIQUE
         SET ERROR = '23000';
   END;
   BEGIN
      DECLARE CONTINUE HANDLER FOR NON_UNIQUE
         SET ERROR = '00000';
      INSERT INTO TEAMS VALUES (2,27,'third');
   END;
END
;
CREATE PROCEDURE SMALL_MISTAKE6 ()
BEGIN
   DECLARE CONTINUE HANDLER FOR SQLSTATE '23000'
      SET @PROCESSED = 100;
   BEGIN
      DECLARE CONTINUE HANDLER FOR SQLSTATE '23000'
         SET @PROCESSED = 200;
      INSERT INTO TEAMS VALUES (2,27,'third');
   END;
END

Example 31.26:

CREATE PROCEDURE NUMBER_OF_PLAYERS
   (OUT NUMBER INTEGER)
BEGIN
   DECLARE A_PLAYERNO INTEGER;
   DECLARE FOUND BOOLEAN DEFAULT TRUE;
   DECLARE C_PLAYERS CURSOR FOR
      SELECT PLAYERNO FROM PLAYERS;
   DECLARE CONTINUE HANDLER FOR NOT FOUND
      SET FOUND = FALSE;
   SET NUMBER = 0;
   OPEN C_PLAYERS;
   FETCH C_PLAYERS INTO A_PLAYERNO;
   WHILE FOUND DO
      SET NUMBER = NUMBER + 1;
      FETCH C_PLAYERS INTO A_PLAYERNO;
   END WHILE;
   CLOSE C_PLAYERS;
END

Example 31.27:

CREATE PROCEDURE DELETE_OLDER_THAN_30()
BEGIN
   DECLARE V_AGE, V_PLAYERNO,V_YEARS,
      V_MONTHS, V_DAYS INTEGER;
   DECLARE V_BIRTH_DATE DATE;
   DECLARE FOUND BOOLEAN DEFAULT TRUE;
   DECLARE C_PLAYERS CURSOR FOR
      SELECT PLAYERNO, BIRTH_DATE
      FROM   PLAYERS;
   DECLARE CONTINUE HANDLER FOR NOT FOUND
      SET FOUND = FALSE;
   OPEN C_PLAYERS;
   FETCH C_PLAYERS INTO V_PLAYERNO, V_BIRTH_DATE;
   WHILE FOUND DO
      CALL AGE (V_BIRTH_DATE, NOW(), V_YEARS,
         V_MONTHS, V_DAYS);
      IF V_YEARS > 30 THEN
         DELETE FROM PENALTIES WHERE PLAYERNO = V_PLAYERNO;
      END IF;
      FETCH C_PLAYERS INTO V_PLAYERNO, V_BIRTH_DATE;
   END WHILE;
   CLOSE C_PLAYERS;
END

Example 31.28:

CREATE PROCEDURE TOP_THREE
   (IN P_PLAYERNO INTEGER,
    OUT OK BOOLEAN)
BEGIN
   DECLARE A_PLAYERNO, BALANCE, SEQNO INTEGER;
   DECLARE FOUND BOOLEAN;
   DECLARE BALANCE_PLAYERS CURSOR FOR
      SELECT   PLAYERNO, SUM(WON) - SUM(LOST)
      FROM     MATCHES
      GROUP BY PLAYERNO
      ORDER BY 2;
   DECLARE CONTINUE HANDLER FOR NOT FOUND
      SET FOUND = FALSE;
   SET SEQNO = 0;
   SET FOUND = TRUE;
   SET OK = FALSE;
   OPEN BALANCE_PLAYERS;
   FETCH BALANCE_PLAYERS INTO A_PLAYERNO, BALANCE;
   WHILE FOUND AND SEQNO < 3 AND OK = FALSE DO
      SET SEQNO = SEQNO + 1;
      IF A_PLAYERNO = P_PLAYERNO THEN
         SET OK = TRUE;
      END IF;
      FETCH BALANCE_PLAYERS INTO A_PLAYERNO, BALANCE;
   END WHILE;
   CLOSE BALANCE_PLAYERS;
END

Example 31.29:

CREATE PROCEDURE NUMBER_PENALTIES
   (IN  V_PLAYERNO INTEGER,
    OUT NUMBER INTEGER)
BEGIN
   DECLARE A_PLAYERNO INTEGER;
   DECLARE FOUND BOOLEAN DEFAULT TRUE;
   DECLARE C_PLAYERS CURSOR FOR
      SELECT PLAYERNO
      FROM   PENALTIES
      WHERE  PLAYERNO = V_PLAYERNO;
   DECLARE CONTINUE HANDLER FOR NOT FOUND
      SET FOUND = FALSE;
   SET NUMBER = 0;
   OPEN C_PLAYERS;
   FETCH C_PLAYERS INTO A_PLAYERNO;
   WHILE FOUND DO
      SET NUMBER = NUMBER + 1;
      FETCH C_PLAYERS INTO A_PLAYERNO;
   END WHILE;
   CLOSE C_PLAYERS;
END

Example 31.30:

CREATE PROCEDURE ALL_TEAMS()
BEGIN
   SELECT * FROM TEAMS;
END
;
CALL ALL_TEAMS()


Example 31.31:

CREATE PROCEDURE NUMBERS_OF_ROWS()
BEGIN
   SELECT COUNT(*) FROM TEAMS;
   SELECT COUNT(*) FROM PENALTIES;
END
;
CALL NUMBER_OF_ROWS()

Example 31.32:

CREATE PROCEDURE USER_VARIABLE ()
BEGIN
   SET @VAR1 = 1;
END
;
CALL USER_VARIABLE ()
;
SELECT @VAR1

Example 31.33:

CREATE DEFINER = 'CHRIS3'@'%' PROCEDURE PIPOWER
   (OUT VAR1 DECIMAL(10,5))
BEGIN
   SET VAR1 = POWER(PI(),2);
END

Example 31.34:

CREATE PROCEDURE POWERPOWER
   (IN P1 INTEGER, OUT P2 INTEGER)
   DETERMINISTIC
BEGIN
   SET P2 = POWER(POWER(P1,2),2);
END

Example 31.35:

CREATE PROCEDURE CLEANUP ()
    NO SQL
BEGIN
   DELETE FROM PENALTIES;
END

Example 31.36:

SELECT   COLUMN_NAME
FROM     INFORMATION_SCHEMA.COLUMNS
WHERE    TABLE_SCHEMA = 'INFORMATION_SCHEMA'
AND      TABLE_NAME = 'ROUTINES'
ORDER BY ORDINAL_POSITION

Example 31.37:

SHOW PROCEDURE STATUS LIKE 'FIBONNACI'

Example 31.38:

SHOW CREATE PROCEDURE FIBONNACI

Example 31.39:

DROP PROCEDURE DELETE_PLAYER

Example 31.40:

GRANT EXECUTE
ON    PROCEDURE DELETE_MATCHES
TO    JOHN

Example 32.1:

CREATE FUNCTION DOLLARS(AMOUNT DECIMAL(7,2))
   RETURNS DECIMAL(7,2)
BEGIN
   RETURN AMOUNT * (1 / 0.8);
END
;
SELECT   PAYMENTNO, AMOUNT, DOLLARS(AMOUNT)
FROM     PENALTIES
WHERE    PAYMENTNO <= 3

Example 32.2:

CREATE FUNCTION NUMBER_OF_PLAYERS()
   RETURNS INTEGER
BEGIN
   RETURN (SELECT COUNT(*) FROM PLAYERS);
END
;
SELECT NUMBER_OF_PLAYERS()

Example 32.3:

CREATE FUNCTION NUMBER_OF_PENALTIES
   (P_PLAYERNO INTEGER)
   RETURNS INTEGER
BEGIN
   RETURN (SELECT   COUNT(*)
           FROM     PENALTIES
           WHERE    PLAYERNO = P_PLAYERNO);
END
;
CREATE FUNCTION NUMBER_OF_MATCHES
   (P_PLAYERNO INTEGER)
   RETURNS INTEGER
BEGIN
   RETURN (SELECT   COUNT(*)
           FROM     MATCHES
           WHERE    PLAYERNO = P_PLAYERNO);
END
;
SELECT   PLAYERNO, NAME, INITIALS
FROM     PLAYERS
WHERE    NUMBER_OF_PENALTIES(PLAYERNO) >
         NUMBER_OF_MATCHES(PLAYERNO)

Example 32.4:

SELECT   TEAMNO, DIVISION
FROM     TEAMS_NEW
WHERE    DIVISION & POWER(2,3-1) = POWER(2,3-1)
;
CREATE FUNCTION POSITION_IN_SET
   (P_COLUMN BIGINT, POSITION SMALLINT)
   RETURNS BOOLEAN
BEGIN
   RETURN (P_COLUMN & POWER(2, POSITION-1) =
          POWER(2,POSITION-1));
END
;
SELECT   TEAMNO, DIVISION
FROM     TEAMS_NEW
WHERE    POSITION_IN_SET(DIVISION, 3)

Example 32.5:

CREATE FUNCTION NUMBER_OF_DAYS
   (START_DATE DATE,
    END_DATE DATE)
    RETURNS INTEGER
BEGIN
   DECLARE DAYS INTEGER;
   DECLARE NEXT_DATE, PREVIOUS_DATE DATE;
   SET DAYS = 0;
   SET NEXT_DATE = START_DATE + INTERVAL 1 DAY;
   WHILE NEXT_DATE <= END_DATE DO
      SET DAYS = DAYS + 1;
      SET PREVIOUS_DATE = NEXT_DATE;
      SET NEXT_DATE = NEXT_DATE + INTERVAL 1 DAY;
   END WHILE;
   RETURN DAYS;
END

Example 32.6:

CREATE FUNCTION DELETE_PLAYER
   (P_PLAYERNO INTEGER)
   RETURNS BOOLEAN
BEGIN
   DECLARE NUMBER_OF_PENALTIES INTEGER;
   DECLARE NUMBER_OF_TEAMS  INTEGER;
   DECLARE EXIT HANDLER FOR SQLWARNING RETURN FALSE;
   DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN FALSE;
   SELECT COUNT(*)
   INTO   NUMBER_OF_PENALTIES
   FROM   PENALTIES
   WHERE  PLAYERNO = P_PLAYERNO;
   SELECT COUNT(*)
   INTO   NUMBER_OF_TEAMS
   FROM   TEAMS
   WHERE  PLAYERNO = P_PLAYERNO;
   IF NUMBER_OF_PENALTIES = 0 AND NUMBER_OF_TEAMS = 0 THEN
      DELETE FROM MATCHES
      WHERE  PLAYERNO = P_PLAYERNO;
      DELETE FROM PLAYERS
      WHERE  PLAYERNO = P_PLAYERNO;
   END IF;
   RETURN TRUE;
END

Example 32.7:

CREATE FUNCTION GET_NUMBER_OF_PLAYERS()
   RETURNS INTEGER
BEGIN
   DECLARE NUMBER INTEGER;
   CALL NUMBER_OF_PLAYERS(NUMBER);
   RETURN NUMBER;
END

Example 32.8:

CREATE FUNCTION OVERLAP_BETWEEN_PERIODS
   (PERIOD1_START DATETIME,
    PERIOD1_END DATETIME,
    PERIOD2_START DATETIME,
    PERIOD2_END DATETIME)
    RETURNS BOOLEAN
BEGIN
   DECLARE TEMPORARY_DATE DATETIME;
   IF PERIOD1_START > PERIOD1_END THEN
      SET TEMPORARY_DATE = PERIOD1_START;
      SET PERIOD1_START = PERIOD1_END;
      SET PERIOD1_END = TEMPORARY_DATE;
   END IF;
   IF PERIOD2_START > PERIOD2_END THEN
      SET TEMPORARY_DATE = PERIOD2_START;
      SET PERIOD2_START = PERIOD2_END;
      SET PERIOD2_END = TEMPORARY_DATE;
   END IF;
   RETURN NOT(PERIOD1_END < PERIOD2_START OR
              PERIOD2_END < PERIOD1_START);
END

Example 32.9:

SELECT   *
FROM     COMMITTEE_MEMBERS
WHERE    OVERLAP_BETWEEN_PERIODS(BEGIN_DATE,END_DATE,
         '1991-06-30','1992-06-30')
ORDER BY 1, 2

Example 32.10:

DROP FUNCTION PLACE_IN_SET

Example 33.1:

CREATE TABLE CHANGES
      (USER               CHAR(30) NOT NULL,
       CHA_TIME           TIMESTAMP NOT NULL,
       CHA_PLAYERNO       SMALLINT NOT NULL,
       CHA_TYPE           CHAR(1) NOT NULL,
       CHA_PLAYERNO_NEW   INTEGER,
       PRIMARY KEY        (USER, CHA_TIME,
                          CHA_PLAYERNO, CHA_TYPE))

Example 33.2:

CREATE TRIGGER INSERT_PLAYERS
   AFTER
   INSERT ON PLAYERS FOR EACH ROW
   BEGIN
      INSERT INTO CHANGES
         (USER, CHA_TIME, CHA_PLAYERNO,
          CHA_TYPE, CHA_PLAYERNO_NEW)
      VALUES (USER, CURDATE(), NEW.PLAYERNO, 'I', NULL);
   END
;
CREATE PROCEDURE INSERT_CHANGE
   (IN CPNO       INTEGER,
    IN CTYPE      CHAR(1),
    IN CPNO_NEW   INTEGER)
BEGIN
   INSERT INTO CHANGES (USER, CHA_TIME, CHA_PLAYERNO,
                        CHA_TYPE, CHA_PLAYERNO_NEW)
   VALUES (USER, CURDATE(), CPNO, CTYPE, CPNO_NEW);
END
;
CREATE TRIGGER INSERT_PLAYER
   AFTER INSERT ON PLAYERS FOR EACH ROW
   BEGIN
      CALL INSERT_CHANGE(NEW.PLAYERNO, 'I', NULL);
   END

Example 33.3:

CREATE TRIGGER DELETE_PLAYER
   AFTER DELETE ON PLAYERS FOR EACH ROW
   BEGIN
      CALL INSERT_CHANGE (OLD.PLAYERNO, 'D', NULL);
   END

Example 33.4:

CREATE TRIGGER UPDATE_PLAYER
   AFTER UPDATE ON PLAYERS FOR EACH ROW
   BEGIN
      CALL INSERT_CHANGES
         (NEW.PLAYERNO, 'U', OLD.PLAYERNO);
   END

Example 33.5:

CREATE TABLE PLAYERS_MAT
     (PLAYERNO INTEGER NOT NULL PRIMARY KEY,
      NUMBER_OF_MATCHES INTEGER NOT NULL)
;
INSERT INTO PLAYERS_MAT (PLAYERNO, NUMBER_OF_MATCHES)
SELECT   PLAYERNO,
        (SELECT   COUNT(*)
         FROM     MATCHES AS M
         WHERE    P.PLAYERNO = M.PLAYERNO)
FROM     PLAYERS AS P

Example 33.6:

CREATE TRIGGER INSERT_PLAYERS
   AFTER INSERT ON PLAYERS FOR EACH ROW
   BEGIN
      INSERT INTO PLAYERS_MAT
      VALUES(NEW.PLAYERNO, 0);
   END

Example 33.7:

CREATE TRIGGER DELETE_PLAYERS
   AFTER DELETE ON PLAYERS FOR EACH ROW
   BEGIN
      DELETE FROM PLAYERS_MAT
      WHERE PLAYERNO = OLD.PLAYERNO;
   END

Example 33.8:

CREATE TRIGGER INSERT_MATCHES
   AFTER INSERT ON MATCHES FOR EACH ROW
   BEGIN
      UPDATE PLAYERS_MAT
      SET    NUMBER_OF_MATCHES = NUMBER_OF_MATCHES + 1
      WHERE  PLAYERNO = NEW.PLAYERNO;
   END

Example 33.9:

CREATE TRIGGER DELETE_MATCHES
   AFTER DELETE ON MATCHES FOR EACH ROW
   BEGIN
      UPDATE PLAYERS_MAT
      SET    NUMBER_OF_MATCHES = NUMBER_OF_MATCHES - 1
      WHERE  PLAYERNO = OLD.PLAYERNO;
   END

Example 33.10:

CREATE TRIGGER SUM_PENALTIES_INSERT
   AFTER INSERT ON PENALTIES FOR EACH ROW
   BEGIN
      DECLARE TOTAL DECIMAL(8,2);
      SELECT   SUM(AMOUNT)
      INTO     TOTAL
      FROM     PENALTIES
      WHERE    PLAYERNO = NEW.PLAYERNO;
      UPDATE   PLAYERS
      SET      SUM_PENALTIES = TOTAL
      WHERE    PLAYERNO = NEW.PLAYERNO
   END
;
CREATE TRIGGER SUM_PENALTIES_DELETE
   AFTER DELETE, UPDATE ON PENALTIES FOR EACH ROW
   BEGIN
      DECLARE TOTAL DECIMAL(8,2);
      SELECT   SUM(AMOUNT)
      INTO     TOTAL
      FROM     PENALTIES
      WHERE    PLAYERNO = OLD.PLAYERNO;
      UPDATE   PLAYERS
      SET      SUM_PENALTIES = TOTAL
      WHERE    PLAYERNO = OLD.PLAYERNO
   END
;
UPDATE   PLAYERS
SET      SUM_PENALTIES = (SELECT   SUM(AMOUNT)
                          FROM     PENALTIES
                          WHERE    PLAYERNO = NEW.PLAYERNO)
WHERE    PLAYERNO = NEW.PLAYERNO

Example 33.11:

CREATE TRIGGER BORN_VS_JOINED
   BEFORE INSERT, UPDATE ON PLAYERS FOR EACH ROW
   BEGIN
      IF YEAR(NEW.BIRTH_DATE) >= NEW.JOINED) THEN
         ROLLBACK WORK;
      END IF;
   END

Example 33.12:

CREATE TRIGGER FOREIGN_KEY1
   BEFORE INSERT, UPDATE ON PENALTIES FOR EACH ROW
   BEGIN
      IF (SELECT COUNT(*) FROM PLAYERS
          WHERE PLAYERNO = NEW.PLAYERNO) = 0 THEN
         ROLLBACK WORK;
      END IF;
   END
;
CREATE TRIGGER FOREIGN_KEY2
   BEFORE DELETE, UPDATE ON PLAYERS FOR EACH ROW
   BEGIN
      DELETE
      FROM     PENALTIES
      WHERE    PLAYERNO = OLD.PLAYERNO;
   END

Example 33.13:

DROP TRIGGER BORN_VS_JOINED

Answer 33.2:

CREATE TRIGGER MAX1
   AFTER INSERT, UPDATE(POSITION) OF COMMITTEE_MEMBERS
      FOR EACH ROW
   BEGIN
      SELECT   COUNT(*)
      INTO     NUMBER_MEMBERS
      FROM     COMMITTEE_MEMBERS
      WHERE    PLAYERNO IN
              (SELECT   PLAYERNO
               FROM     COMMITTEE_MEMBERS
               WHERE    CURRENT DATE BETWEEN
                        BEGIN_DATE AND END_DATE
               GROUP BY POSITION
               HAVING   COUNT(*) > 1)
      IF NUMBER_MEMBERS > 0 THEN
         ROLLBACK WORK;
      ENDIF;
   END

Answer 33.3:

CREATE TRIGGER SUM_PENALTIES_250
   AFTER INSERT, UPDATE(AMOUNT) OF PENALTIES
      FOR EACH ROW
   BEGIN
      SELECT   COUNT(*)
      INTO     NUMBER_PENALTIES
      FROM     PENALTIES
      WHERE    PLAYERNO IN
              (SELECT   PLAYERNO
               FROM     PENALTIES
               GROUP BY PLAYERNO
               HAVING   SUM(AMOUNT) > 250);
      IF NUMBER_PENALTIES > 0 THEN
         ROLLBACK WORK;
      ENDIF;
   END

Answer 33.4:

CREATE TRIGGER NUMBER_MATCHES_INSERT
   AFTER INSERT OF MATCHES FOR EACH ROW
   BEGIN
      UPDATE   TEAMS
      SET      NUMBER_MATCHES =
              (SELECT   COUNT(*)
               FROM     MATCHES
               WHERE    PLAYERNO = NEW.PLAYERNO)
      WHERE    PLAYERNO = NEW.PLAYERNO
END
;
CREATE TRIGGER NUMBER_MATCHES_DELETE
   AFTER DELETE, UPDATE OF MATCHES FOR EACH ROW
   BEGIN
      UPDATE   TEAMS
      SET      NUMBER_MATCHES =
              (SELECT   COUNT(*)
               FROM     MATCHES
               WHERE    PLAYERNO = OLD.PLAYERNO)
      WHERE    PLAYERNO = OLD.PLAYERNO
END

Example 34.1:

SET GLOBAL EVENT_SCHEDULER = TRUE
;
SET GLOBAL EVENT_SCHEDULER = FALSE
;
CREATE TABLE EVENTS_INVOKED
      (EVENT_NAME      VARCHAR(20) NOT NULL,
       EVENT_STARTED   TIMESTAMP NOT NULL)

Example 34.2:

CREATE EVENT DIRECT
   ON SCHEDULE AT NOW()
   DO INSERT INTO EVENTS_INVOKED VALUES ('DIRECT', NOW())
;
SELECT   *
FROM     EVENTS_INVOKED
WHERE    EVENT_NAME = 'DIRECT'
;
CREATE EVENT TENNIS.DIRECT
   ON SCHEDULE AT NOW()
   DO INSERT INTO EVENTS_INVOKED VALUES ('DIRECT', NOW())

Example 34.3:

CREATE EVENT END2010
   ON SCHEDULE AT '2010-12-31 11:00:00'
   DO INSERT INTO EVENTS_INVOKED VALUES ('END2010', NOW())

Example 34.4:

CREATE EVENT THREEDAYS
   ON SCHEDULE AT NOW() + INTERVAL 3 DAY
   DO INSERT INTO EVENTS_INVOKED VALUES ('THREEDAYS', NOW())

Example 34.5:

CREATE EVENT NEXT_SUNDAY
   ON SCHEDULE AT
      CASE DAYNAME(NOW())
         WHEN 'Sunday'    THEN NOW() + INTERVAL 7 DAY
         WHEN 'Monday'    THEN NOW() + INTERVAL 6 DAY
         WHEN 'Tuesday'   THEN NOW() + INTERVAL 5 DAY
         WHEN 'Wednesday' THEN NOW() + INTERVAL 4 DAY
         WHEN 'Thursday'  THEN NOW() + INTERVAL 3 DAY
         WHEN 'Friday'    THEN NOW() + INTERVAL 2 DAY
         WHEN 'Saturday'  THEN NOW() + INTERVAL 1 DAY
      END
   DO INSERT INTO EVENTS_INVOKED
         VALUES ('NEXT_SUNDAY',NOW())
;
CREATE EVENT NEXT_SUNDAY
   ON SCHEDULE AT
      NOW() + INTERVAL (8 - DAYOFWEEK(NOW())) DAY
   DO INSERT INTO EVENTS_INVOKED
         VALUES ('NEXT_SUNDAY',NOW())

Example 34.6:

CREATE EVENT MORNING11
   ON SCHEDULE AT TIMESTAMP(CURDATE() +
                            INTERVAL 1 DAY, '11:00:00')
   DO INSERT INTO EVENTS_INVOKED VALUES ('MORNING11', NOW())

Example 34.7:

CREATE EVENT EVERY2HOUR
   ON SCHEDULE EVERY 2 HOUR
      STARTS NOW() + INTERVAL 3 HOUR
      ENDS   CURDATE() + INTERVAL 23 HOUR
   DO INSERT INTO EVENTS_INVOKED VALUES ('EVERY2HOUR', NOW())

Example 34.8:

CREATE EVENT SIXTIMES
   ON SCHEDULE EVERY 1 MINUTE
      STARTS TIMESTAMP(CURDATE() + INTERVAL 1 DAY,'12:00:00')
      ENDS   TIMESTAMP(CURDATE() + INTERVAL 1 DAY,'12:00:00')
             + INTERVAL 5 MINUTE
   DO INSERT INTO EVENTS_INVOKED
      VALUES ('SIXTIMES', NOW())

Example 34.9:

CREATE EVENT FIVESUNDAYS
   ON SCHEDULE EVERY 1 WEEK
      STARTS CASE DAYNAME(NOW())
         WHEN 'Sunday'    THEN NOW()
         WHEN 'Monday'    THEN NOW() + INTERVAL 6 DAY
         WHEN 'Tuesday'   THEN NOW() + INTERVAL 5 DAY
         WHEN 'Wednesday' THEN NOW() + INTERVAL 4 DAY
         WHEN 'Thursday'  THEN NOW() + INTERVAL 3 DAY
         WHEN 'Friday'    THEN NOW() + INTERVAL 2 DAY
         WHEN 'Saturday'  THEN NOW() + INTERVAL 1 DAY
      END
      ENDS CASE DAYNAME(NOW())
         WHEN 'Sunday'    THEN NOW()
         WHEN 'Monday'    THEN NOW() + INTERVAL 6 DAY
         WHEN 'Tuesday'   THEN NOW() + INTERVAL 5 DAY
         WHEN 'Wednesday' THEN NOW() + INTERVAL 4 DAY
         WHEN 'Thursday'  THEN NOW() + INTERVAL 3 DAY
         WHEN 'Friday'    THEN NOW() + INTERVAL 2 DAY
         WHEN 'Saturday'  THEN NOW() + INTERVAL 1 DAY
      END + INTERVAL 4 WEEK
   DO INSERT INTO EVENTS_INVOKED
      VALUES ('FIVESUNDAYS',NOW())

Example 34.10:

CREATE EVENT SUNDAYS
   ON SCHEDULE EVERY 1 WEEK
      STARTS TIMESTAMP(CASE DAYNAME(NOW())
         WHEN 'Sunday'    THEN NOW()
         WHEN 'Monday'    THEN NOW() + INTERVAL 6 DAY
         WHEN 'Tuesday'   THEN NOW() + INTERVAL 5 DAY
         WHEN 'Wednesday' THEN NOW() + INTERVAL 4 DAY
         WHEN 'Thursday'  THEN NOW() + INTERVAL 3 DAY
         WHEN 'Friday'    THEN NOW() + INTERVAL 2 DAY
         WHEN 'Saturday'  THEN NOW() + INTERVAL 1 DAY
      END, '15:00:00')
      ENDS TIMESTAMP(
         CASE DAYNAME(CONCAT(YEAR(CURDATE()),'-12-31'))
         WHEN 'Sunday'    THEN
            CONCAT(YEAR(CURDATE()),'-12-31')
         WHEN 'Monday'    THEN
            CONCAT(YEAR(CURDATE()),'-12-31') - INTERVAL 1 DAY
         WHEN 'Tuesday'   THEN
            CONCAT(YEAR(CURDATE()),'-12-31') - INTERVAL 2 DAY
         WHEN 'Wednesday' THEN
            CONCAT(YEAR(CURDATE()),'-12-31') - INTERVAL 3 DAY
         WHEN 'Thursday'  THEN
            CONCAT(YEAR(CURDATE()),'-12-31') - INTERVAL 4 DAY
         WHEN 'Friday'    THEN
            CONCAT(YEAR(CURDATE()),'-12-31') - INTERVAL 5 DAY
         WHEN 'Saturday'  THEN
            CONCAT(YEAR(CURDATE()),'-12-31') - INTERVAL 6 DAY
       END, '15:00:00')
   DO INSERT INTO EVENTS_INVOKED VALUES ('SUNDAYS', NOW())

Example 34.11:

CREATE EVENT STARTMONTH
   ON SCHEDULE EVERY 1 MONTH
      STARTS CURDATE() + INTERVAL 1 MONTH -
             INTERVAL (DAYOFMONTH(CURDATE()) - 1) DAY
      ENDS   TIMESTAMP(CONCAT(YEAR(CURDATE()),'-12-31'))
   DO INSERT INTO EVENTS_INVOKED
      VALUES ('STARTMONTH', NOW())

Example 34.12:

CREATE EVENT QUARTERS
   ON SCHEDULE EVERY 3 MONTH
      STARTS (CURDATE() - INTERVAL (DAYOFMONTH(CURDATE())
      - 1) DAY) - INTERVAL (MOD(MONTH(CURDATE()
      - INTERVAL (DAYOFMONTH(CURDATE()) - 1) DAY)+2,3)) MONTH
      + INTERVAL 3 MONTH
   DO INSERT INTO EVENTS_INVOKED VALUES ('QUARTERS', NOW())

Example 34.13:

CREATE EVENT END_OF_YEAR
   ON SCHEDULE EVERY 1 YEAR
      STARTS ((NOW() - INTERVAL (DAYOFYEAR(NOW()) - 1) DAY)
                     + INTERVAL 1 YEAR)
                     - INTERVAL 1 DAY
      ENDS   '2025-12-31'
   DO INSERT INTO EVENTS_INVOKED VALUES ('END_OF_YEAR', NOW())

Example 34.14:

CREATE EVENT NOT2020
   ON SCHEDULE EVERY 1 YEAR
      STARTS ((NOW() - INTERVAL (DAYOFYEAR(NOW()) - 1) DAY)
                     + INTERVAL 1 YEAR)
                     - INTERVAL 1 DAY
      ENDS   '2025-12-31'
   DO BEGIN
         IF YEAR(CURDATE()) <> 2020 THEN
            INSERT INTO EVENTS_INVOKED
               VALUES ('NOT2020', NOW());
         END IF;
      END

Example 34.15:

CREATE TABLE MATCHES_ANNUALREPORT
      (PLAYERNO    INTEGER NOT NULL,
       YEAR        INTEGER NOT NULL,
       NUMBER      INTEGER NOT NULL,
       PRIMARY KEY (PLAYERNO, YEAR),
       FOREIGN KEY (PLAYERNO) REFERENCES PLAYERS (PLAYERNO))

Example 34.16:

CREATE EVENT YEARBALANCING
   ON SCHEDULE EVERY 1 YEAR
      STARTS ((NOW() - INTERVAL (DAYOFYEAR(NOW()) - 1) DAY)
                     + INTERVAL 1 YEAR)
                     - INTERVAL 1 DAY
   DO INSERT INTO MATCHES_ANNUALREPORT
      SELECT   PLAYERNO, YEAR, COUNT(*)
      FROM     MATCHES
      WHERE    YEAR(DATE) = YEAR(CURDATE())
      GROUP BY PLAYERNO, YEAR

Example 34.17:

CREATE EVENT DIRECT
   ON SCHEDULE AT NOW()
   ON COMPLETION PRESERVE
   DO INSERT INTO EVENTS_INVOKED VALUES ('DIRECT', NOW())

Example 34.18:

CREATE EVENT DIRECT_WITH_COMMENT
   ON SCHEDULE AT NOW()
   ON COMPLETION PRESERVE
   COMMENT 'This event starts directly'
   DO INSERT INTO EVENTS_INVOKED
      VALUES ('DIRECT_WITH_COMMENT', NOW())

Example 34.19:

CREATE EVENT DIRECT_INACTIVE
   ON SCHEDULE AT NOW()
   ON COMPLETION PRESERVE
   DISABLE
   COMMENT 'This event is inactive'
   DO INSERT INTO EVENTS_INVOKED
      VALUES ('DIRECT_INACTIVE', NOW())

Example 34.20:

ALTER EVENT STARTMONTH
   ON SCHEDULE EVERY 1 MONTH
      STARTS CURDATE() + INTERVAL 1 MONTH -
             INTERVAL (DAYOFMONTH(CURDATE()) - 1) DAY
      ENDS   TIMESTAMP('2025-12-31')

Example 34.21:

ALTER EVENT STARTMONTH
      RENAME TO FIRST_OF_THE_MONTH

Example 34.22:

ALTER EVENT DIRECT_INACTIVE
      ENABLE

Example 34.23:

DROP EVENT FIRST_OF_THE_MONTH

Example 34.24:

GRANT EVENT
ON    TENNIS.*
TO    SAM

Example 34.25:

SHOW CREATE EVENT TOMORROW11

Example 35.1:

<HTML>
<HEAD>
<TITLE>Logging on</TITLE>
</HEAD>
<BODY>
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$conn = mysql_connect($host, $user, $pass)
        or die ("<p>Logging on has not succeeded.</p>");
echo "<p>Logging on has succeeded.</p>\n";
mysql_close($conn);
?>
</BODY>
</HTML>

Example 35.2:

<HTML>
<HEAD>
<TITLE>Current database</TITLE>
</HEAD>
<BODY>
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$conn = mysql_connect($host, $user, $pass)
        or die ("<p>Logging on has not succeeded.\n");
echo "<p>Logging on has succeeded.\n";
$db = mysql_select_db("TENNIS")
      or die ("<br>Database unknown.\n");
echo "<br>TENNIS is the current database now.\n";
mysql_close($conn);
?>
</BODY>
</HTML>

Example 35.3:

<HTML>
<HEAD>
<TITLE>Create Index</TITLE>
</HEAD>
<BODY>
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$conn = mysql_connect($host, $user, $pass)
        or die ("<p>Logging on has not succeeded.\n");
echo "<p>Logging on has succeeded.\n";
$db = mysql_select_db("TENNIS")
      or die ("<br>Database unknown.\n");
echo "<br>TENNIS is the current database now.\n";
$result = mysql_query("CREATE UNIQUE INDEX PLAY
                       ON PLAYERS (PLAYERNO)");
if (!$result)
{
   echo "<br>Index PLAY is not created!\n";
}
else
{
   echo "<br>Index PLAY is created!\n";
};
mysql_close($conn);
?>
</BODY>
</HTML>

Example 35.4:

<HTML>
<HEAD>
<TITLE>Create Index plus response</TITLE>
</HEAD>
<BODY>
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$conn = mysql_connect($host, $user, $pass)
        or die ("<p>Logging on has not succeeded.\n");
echo "<p>Logging on has succeeded.\n";
$db = mysql_select_db("TENNIS")
      or die ("<br>Database unknown.\n");
echo "<br>TENNIS is the current database now.\n";
$result = mysql_query("CREATE UNIQUE INDEX PLAY
                       ON PLAYERS (PLAYERNO)");
if (!$result)
{
   echo "<br>Index PLAY is not created!\n";
}
else
{
   echo "<br>Index PLAY is created!\n";
};
echo "<br>mysql_info=".mysql_info($conn);
mysql_close($conn);
?>
</BODY>
</HTML>

Example 35.5:

<HTML>
<HEAD>
<TITLE>Error messages</TITLE>
</HEAD>
<BODY>
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$conn = mysql_connect($host, $user, $pass)
        or die ("<p>Logging on has not succeeded.\n");
echo "<p>Logging on has succeeded.\n";
$db = mysql_select_db("TENNIS")
      or die ("<br>Database unknown.\n");
echo "<br>TENNIS is the current database now.\n";
$result = mysql_query("CREATE UNIQUE INDEX PLAY
                       ON PLAYERS (PLAYERNO)");
if (!$result)
{
   echo "<br>Index PLAY is not created!\n";
   $error_number = mysql_errno();
   $error_message = mysql_error();
   echo "<br>Fout: $error_number: $error_message\n";
}
else
{
   echo "<br>Index PLAY is created!\n";
}
mysql_close($conn);
?>
</BODY>
</HTML>

Example 35.6:

<HTML>
<HEAD>
<TITLE>Two connections</TITLE>
</HEAD>
<BODY>
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$conn1 = mysql_connect($host, $user, $pass)
         or die ("<p>Logging on has not succeeded.\n");
echo "<p>Logging on has succeeded.\n";
$host = "localhost";
$user = "BOOKSQL";
$pass = "BOOKSQLPW";
$conn2 = mysql_connect($host, $user, $pass)
         or die ("<p>Logging on has not succeeded.\n");
echo "<p>Logging on has succeeded.\n";
$db = mysql_select_db("TENNIS", $conn1)
      or die ("<br>Database unknown.\n");
echo "<br>Connection 1 is started.\n";
$db = mysql_select_db("TENNIS", $conn2)
      or die ("<br>Database unknown.\n");
echo "<br>Connection 2 is started.\n";
mysql_close($conn1);
mysql_close($conn2);
?>
</BODY>
</HTML>

Example 35.7:

<HTML>
<HEAD>
<TITLE>Parameters</TITLE>
</HEAD>
<BODY>
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$conn = mysql_connect($host, $user, $pass)
        or die ("<p>Logging on has not succeeded.\n");
echo "<p>Logging on has succeeded.\n";
$db = mysql_select_db("TENNIS")
      or die ("<br>Database unknown.\n");
echo "<br>TENNIS is the current database now.\n";
$wnr = 22;
$result = mysql_query("UPDATE MATCHES
          SET WON = WON + 1 WHERE MATCHNO = $mno");
if (!$result)
{
   echo "<br>Update not executed!\n";
   $error_number = mysql_errno();
   $error_message = mysql_error();
   echo "<br>Error: $error_number: $error_message\n";
}
else
{
   echo "<br>WON column has increased for match $mno.\n";
}
mysql_close($conn);
?>
</BODY>
</HTML>

Example 35.8:

<HTML>
<HEAD>
<TITLE>Query with a row</TITLE>
</HEAD>
<BODY>
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$conn = mysql_connect($host, $user, $pass)
        or die ("<p>Logging on has not succeeded.\n");
echo "<p>Logging on has succeeded.\n";
$db = mysql_select_db("TENNIS")
      or die ("<br>Database unknown.\n");
echo "<br>TENNIS is the current database now.\n";
$query = "SELECT COUNT(*) AS NUMBER FROM PLAYERS";
$result = mysql_query($query)
          or die ("<br>Query is incorrect.\n");
$row = mysql_fetch_assoc($result)
       or die ("<br>Query had no result.\n");
echo "<br>The number of players ".$row['NUMBER'].".\n";
mysql_close($conn);
?>
</BODY>
</HTML>

Example 35.9:

<HTML>
<HEAD>
<TITLE>SELECT statement with multiple rows</TITLE>
</HEAD>
<BODY>
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$conn = mysql_connect($host, $user, $pass)
        or die ("<p>Logging on has not succeeded.\n");
echo "<p>Logging on has not succeeded.\n";
$db = mysql_select_db("TENNIS")
      or die ("<br>Database unknown.\n");
echo "<br>TENNIS is the current database now.\n";
$query = "SELECT PLAYERNO FROM PLAYERS ORDER BY 1 DESC";
$result = mysql_query($query)
          or die ("<br>Query is incorrect.\n");
if (mysql_num_rows($result) > 0)
{
   while ($row=mysql_fetch_assoc($result))
   {
      echo "<br>Player number ".$row['PLAYERNO'].".\n";
   }
}
else
{
   echo "<br>No players found.\n";
}
mysql_free_result($result);
mysql_close($conn);
?>
</BODY>
</HTML>

Example 35.10:

<HTML>
<HEAD>
<TITLE>MYSQL_FETCH_ROW function</TITLE>
</HEAD>
<BODY>
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$conn = mysql_connect($host, $user, $pass)
        or die ("<p>Logging on has not succeeded.\n");
echo "<p>Logging on has succeeded.\n";
$db = mysql_select_db("TENNIS")
      or die ("<br>Database unknown.\n");
echo "<br>TENNIS is the current database now.\n";
$query = "SELECT PLAYERNO FROM PLAYERS ORDER BY 1 DESC";
$result = mysql_query($query)
          or die ("<br>Query is incorrect.\n");
while ($row=mysql_fetch_row($result))
{
   echo "<br>Player number ".$row[0].".\n";
};
mysql_free_result($result);
mysql_close($conn);
?>
</BODY>
</HTML>

Example 35.11:

<HTML>
<HEAD>
<TITLE>MYSQL_DATA_SEEK function</TITLE></HEAD>
<BODY>
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$conn = mysql_connect($host, $user, $pass)
        or die ("<p>Logging on has not succeeded.\n");
echo "<p>Logging on has succeeded.\n";
$db = mysql_select_db("TENNIS")
      or die ("<br>Database unknown.\n");
echo "<br>TENNIS is the current database now.\n";
$query = "SELECT PLAYERNO FROM PLAYERS ORDER BY 1 DESC";
$result = mysql_query($query)
          or die ("<br>Query is incorrect.\n");
mysql_data_seek($result, 3);
$row=mysql_fetch_row($result);
echo "<br>Player number ".$row[0].".\n";
mysql_close($conn);
?>
</BODY>
</HTML>

Example 35.12:

<HTML>
<HEAD>
<TITLE>Working with objects</TITLE>
</HEAD>
<BODY>
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$conn = mysql_connect($host, $user, $pass)
        or die ("<p>Logging on has not succeeded.\n");
echo "<p>Logging on has succeeded.\n";
$db = mysql_select_db("TENNIS")
      or die ("<br>Database unknown.\n");
echo "<br>TENNIS is the current database now.\n";
$query = "SELECT PLAYERNO FROM PLAYERS ORDER BY 1 DESC";
$result = mysql_query($query)
          or die ("<br>Query is incorrect.\n");
while ($row=mysql_fetch_object($result))
{
   echo "<br>Player number ".$row->PLAYERNO.".\n";
};
mysql_free_result($result);
mysql_close($conn);
?>
</BODY>
</HTML>

Example 35.13:

<HTML>
<HEAD>
<TITLE>Query with null values</TITLE>
</HEAD>
<BODY>
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$conn = mysql_connect($host, $user, $pass)
        or die ("<p>Logging on has not succeeded.\n");
echo "<p>Logging on has succeeded.\n";
$db = mysql_select_db("TENNIS")
      or die ("<br>Database unknown.\n");
echo "<br>TENNIS is the current database now.\n";
$query = "SELECT LEAGUENO FROM PLAYERS";
$result = mysql_query($query)
          or die ("<br>Query is incorrect.\n");
if (mysql_num_rows($result) > 0)
{
   while ($row=mysql_fetch_assoc($result))
   {  
      if ($row['LEAGUENO'] === NULL)
      {
         echo "<br>Player number is unknown.\n";
      }
      else
      {
         echo "<br>Player number ".$row['LEAGUENO'].".\n";
      }
   }
}
else
{
   echo "<br>No players found.\n";
}
mysql_close($conn);
?>
</BODY>
</HTML>

Example 35.14:

<HTML>
<HEAD>
<TITLE>Characteristics of expressions</TITLE>
</HEAD>
<BODY>
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$conn = mysql_connect($host, $user, $pass)
        or die ("<p>Logging on has not succeeded.\n");
echo "<p>Logging on has succeeded.\n";
$db = mysql_select_db("TENNIS")
      or die ("<br>Database unknown.\n");
echo "<br>TENNIS is the current database now.\n";
$query = "SELECT * FROM PLAYERS WHERE PLAYERNO = 27";
$result = mysql_query($query)
          or die ("<br>Query is incorrect.\n");
while ($field=mysql_fetch_field($result))
{
   echo "<br>".$field->name."  ".$field->type."  ".
        $field->max_length."  ".$field->primary_key."\n";
}
mysql_close($conn);
?>
</BODY>
</HTML>

Example 35.15:

<HTML>
<HEAD>
<TITLE>Characteristics of expressions</TITLE>
</HEAD>
<BODY>
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$conn = mysql_connect($host, $user, $pass)
        or die ("<p>Logging on has not succeeded.\n");
echo "<p>Logging on has succeeded.\n";
$db = mysql_select_db("TENNIS")
      or die ("<br>Database unknown.\n");
echo "<br>TENNIS is the current database now.\n";
$query = "SELECT * FROM PLAYERS WHERE PLAYERNO = 27";
$result = mysql_query($query)
          or die ("<br>Query is incorrect.\n");
$exp = 0;
while ($field=mysql_fetch_field($result))
{
   echo "<br>Name=".mysql_field_name($result, $exp)."\n";
   echo "<br>Data type=".mysql_field_type($result, $exp)."\n";
   echo "<br>Length=".mysql_field_len($result, $exp)."\n";
   echo "<br>Table=".mysql_field_table($result, $exp)."\n";
   $exp += 1;
}
mysql_close($conn);
?>
</BODY>
</HTML>

Example 35.16:

<HTML>
<HEAD>
<TITLE>Catalog tables</TITLE>
</HEAD>
<BODY>
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$conn = mysql_connect($host, $user, $pass)
        or die ("<p>Logging on has not succeeded.\n");
echo "<p>Logging on has succeeded.\n";
$db = mysql_select_db("TENNIS")
      or die ("<br>Database unknown.\n");
echo "<br>TENNIS is the current database now.\n";
$query1 = "SELECT TABLE_NAME, COLUMN_NAME
           FROM   INFORMATION_SCHEMA.COLUMNS
           WHERE  TABLE_NAME IN
                  ('COMMITTEE_MEMBERS','PENALTIES','PLAYERS',
                   'TEAMS','MATCHES')
           ORDER BY TABLE_NAME, ORDINAL_POSITION";
$tables = mysql_query($query1)
          or die ("<br>Query1 is incorrect.\n");
while ($tablerow=mysql_fetch_assoc($tables))
{
   $query2 = "SELECT COUNT(DISTINCT ";
   $query2 .= $tablerow['COLUMN_NAME'].") AS A, ";
   $query2 .= "MIN( ".$tablerow['COLUMN_NAME'].") AS B, ";
   $query2 .= "MAX( ".$tablerow['COLUMN_NAME'].") AS C ";
   $query2 .= "FROM ".$tablerow['TABLE_NAME'];
   $columns = mysql_query($query2)
              or die ("<br>Query2 is incorrect.\n");
   $columnrow=mysql_fetch_assoc($columns);
   echo "<br>".$tablerow['TABLE_NAME'].".".
        $tablerow['COLUMN_NAME'].
        "  Different=".$columnrow['A'].
        "  Minimum=".$columnrow['B'].
        "  Maximum=".$columnrow['C']."\n";
   mysql_free_result($columns);
};
mysql_free_result($tables);
mysql_close($conn);
?>
</BODY>
</HTML>

Example 36.1:

PREPARE S1 FROM 'SELECT * FROM TEAMS'
;
EXECUTE S1
;
SET @SQL_STATEMENT = 'SELECT * FROM TEAMS'
;
PREPARE S1 FROM @SQL_STATEMENT

Example 36.2:

DEALLOCATE PREPARE S1

Example 36.3:

PREPARE S2 FROM 'SELECT * FROM TEAMS WHERE TEAMNO = @TNO'
;
SET @TNO = 1
;
EXECUTE S2
;
SET @TNO = 2
;
EXECUTE S2

Example 36.4:

PREPARE S3 FROM
   'SELECT * FROM TEAMS WHERE TEAMNO BETWEEN ? AND ?'
;
SET @FROM_TNO = 1, @TO_TNO = 4
;
EXECUTE S3 USING @FROM_TNO, @TO_TNO
;
DEALLOCATE PREPARE S3

Example 36.5:

CREATE PROCEDURE DROP_TABLE
   (IN TABLENAME VARCHAR(64))
BEGIN
   SET @SQL_STATEMENT = CONCAT('DROP TABLE ', TABLENAME);
   PREPARE S1 FROM @SQL_STATEMENT;
   EXECUTE S1;
   DEALLOCATE PREPARE S1;
END

Example 36.6:

CREATE PROCEDURE DYNAMIC_SELECT
   (IN  SELECT_STATEMENT VARCHAR(64),
    OUT NUMBER_OF_ROWS INTEGER)
BEGIN
   DECLARE FOUND BOOLEAN DEFAULT TRUE;
   DECLARE VAR1,VAR2,VAR3 VARCHAR(100);
   DECLARE C_RESULT CURSOR FOR
      SELECT * FROM SELECT_TABLE;
   DECLARE CONTINUE HANDLER FOR NOT FOUND
      SET FOUND = FALSE;
   SET @CREATE_STATEMENT =
      CONCAT('CREATE TEMPORARY TABLE SELECT_TABLE AS (',
              SELECT_STATEMENT, ')');
   PREPARE S1 FROM @CREATE_STATEMENT;
   EXECUTE S1;
   DEALLOCATE PREPARE S1;
   SET NUMBER_OF_ROWS = 0;
   OPEN C_RESULT;
   FETCH C_RESULT INTO VAR1, VAR2, VAR3;
   WHILE FOUND DO
      SET NUMBER_OF_ROWS = NUMBER_OF_ROWS + 1;
      FETCH C_RESULT INTO VAR1, VAR2, VAR3;
   END WHILE;
   CLOSE C_RESULT;
   DROP TEMPORARY TABLE SELECT_TABLE;
END
;
CALL DYNAMIC_SELECT('SELECT PAYMENTNO, PAYMENT_DATE, PLAYERNO
                     FROM PENALTIES', @NUMBER_OF_ROWS)
;
SELECT @NUMBER_OF_ROWS

Example 37.1:

DELETE
FROM     PENALTIES
WHERE    PLAYERNO = 44
;
SELECT   *
FROM     PENALTIES
;
ROLLBACK WORK
;
COMMIT WORK

Example 37.3:

DELETE FROM PLAYERS WHERE PLAYERNO = 6
;
DELETE FROM PENALTIES WHERE PLAYERNO = 6
;
DELETE FROM MATCHES WHERE PLAYERNO = 6
;
DELETE FROM COMMITTEE_MEMBERS WHERE PLAYERNO = 6
;
UPDATE TEAMS SET PLAYERNO = 83 WHERE PLAYERNO = 6
;
SHOW GLOBAL VARIABLES LIKE 'COMPLETION_TYPE'

Example 37.5:

CREATE PROCEDURE NEW_TEAM ()
BEGIN
   INSERT INTO TEAMS VALUES (100,27,'first');
END
;
SET AUTOCOMMIT = 1
;
START TRANSACTION
;
INSERT INTO TEAMS VALUES (200,27,'first')
;
CALL NEW_TEAM()
;
ROLLBACK WORK

Example 37.6:

UPDATE   PENALTIES
SET      AMOUNT = AMOUNT + 25
WHERE    PAYMENTNO = 4
;
SELECT   *
FROM     PENALTIES
WHERE    PAYMENTNO = 4

Example 37.7:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    TOWN = 'Stratford'
;
UPDATE   PLAYERS
SET      TOWN = 'Eltham'
WHERE    PLAYERNO = 7
;
SELECT   PLAYERNO, NAME, INITIALS,
         STREET, HOUSENO, POSTCODE, TOWN
FROM     PLAYERS
WHERE    PLAYERNO IN (6, 83, 2, 7, 57, 39, 100)

Example 37.8:

SELECT   PLAYERNO
FROM     PLAYERS
WHERE    TOWN = 'Stratford'

Example 37.9:

UPDATE   PENALTIES
SET      AMOUNT = AMOUNT + 25
WHERE    PAYMENTNO = 4
;
UPDATE   PENALTIES
SET      AMOUNT = AMOUNT + 30
WHERE    PAYMENTNO = 4

Example 37.10:

LOCK TABLE PLAYERS READ

Example 37.11:

DO GET_LOCK('lock1',0)
;
SELECT GET_LOCK('lock1',0)

Example 37.12:

SELECT IS_FREE_LOCK('lock1')

Example 37.13:

SELECT IS_USED_LOCK('lock1')

Example 37.14:

SELECT RELEASE_LOCK('lock1')

猜你喜欢

转载自wangxiaoxu.iteye.com/blog/2193941
今日推荐