SQL Server/T-SQL Tutorial/Transact SQL/Select statement — различия между версиями

Материал из SQL эксперт
Перейти к: навигация, поиск
м (1 версия)
 
м (1 версия)
 
(нет различий)

Текущая версия на 10:22, 26 мая 2010

Join tables in a procedure

3>
4>
5> CREATE TABLE authors(
6>    au_id          varchar(11),
7>    au_lname       varchar(40)       NOT NULL,
8>    au_fname       varchar(20)       NOT NULL,
9>    phone          char(12)          NOT NULL DEFAULT ("UNKNOWN"),
10>    address        varchar(40)           NULL,
11>    city           varchar(20)           NULL,
12>    state          char(2)               NULL,
13>    zip            char(5)               NULL,
14>    contract       bit               NOT NULL
15> )
16> GO
1> insert authors values("1",  "Joe",   "Abra",   "111 111-1111", "6 St.", "Berkeley",  "CA", "11111", 1)
2> insert authors values("2",  "Jack",  "Majo",   "222 222-2222", "3 St.", "Oakland" ,  "CA", "22222", 1)
3> insert authors values("3",  "Pink",  "Cherry", "333 333-3333", "5 Ln.", "Vancouver", "BC", "33333", 1)
4> insert authors values("4",  "Blue",  "Albert", "444 444-4444", "7 Av.", "Vancouver", "BC", "44444", 1)
5> insert authors values("5",  "Red",   "Anne",   "555 555-5555", "6 Av.", "Regina",    "SK", "55555", 1)
6> insert authors values("6",  "Black", "Michel", "666 666-6666", "3 Pl.", "Regina",    "SK", "66666", 1)
7> insert authors values("7",  "White", "Sylvia", "777 777-7777", "1 Pl.", "Rockville", "MD", "77777", 1)
8> insert authors values("8",  "Yellow","Heather","888 888-8888", "3 Pu",  "Vacaville", "CA", "88888", 0)
9> insert authors values("9",  "Gold",  "Dep",    "999 999-9999", "5 Av.", "Oakland",   "CA", "99999", 0)
10> insert authors values("10", "Siler", "Dean",   "000 000-0000", "4 Av.", "Oakland",   "CA", "00000", 1)
11> GO
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
1>
2> CREATE TABLE titles(
3>    title_id       varchar(20),
4>    title          varchar(80)       NOT NULL,
5>    type           char(12)          NOT NULL,
6>    pub_id         char(4)               NULL,
7>    price          money                 NULL,
8>    advance        money                 NULL,
9>    royalty        int                   NULL,
10>    ytd_sales      int                   NULL,
11>    notes          varchar(200)          NULL,
12>    pubdate        datetime          NOT NULL
13> )
14> GO
1>
2> insert titles values ("1", "Secrets",   "popular_comp", "1389", $20.00, $8000.00, 10, 4095,"Note 1","06/12/94")
3> insert titles values ("2", "The",       "business",     "1389", $19.99, $5000.00, 10, 4095,"Note 2","06/12/91")
4> insert titles values ("3", "Emotional", "psychology",   "0736", $7.99,  $4000.00, 10, 3336,"Note 3","06/12/91")
5> insert titles values ("4", "Prolonged", "psychology",   "0736", $19.99, $2000.00, 10, 4072,"Note 4","06/12/91")
6> insert titles values ("5", "With",      "business",     "1389", $11.95, $5000.00, 10, 3876,"Note 5","06/09/91")
7> insert titles values ("6", "Valley",    "mod_cook",     "0877", $19.99, $0.00,    12, 2032,"Note 6","06/09/91")
8> insert titles values ("7", "Any?",      "trad_cook",    "0877", $14.99, $8000.00, 10, 4095,"Note 7","06/12/91")
9> insert titles values ("8", "Fifty",     "trad_cook",    "0877", $11.95, $4000.00, 14, 1509,"Note 8","06/12/91")
10> GO
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
1>
2> CREATE TABLE titleauthor(
3>    au_id          varchar(20),
4>    title_id       varchar(20),
5>    au_ord         tinyint               NULL,
6>    royaltyper     int                   NULL
7> )
8> GO
1>
2> insert titleauthor values("1", "2", 1, 60)
3> insert titleauthor values("2", "3", 1, 100)
4> insert titleauthor values("3", "4", 1, 100)
5> insert titleauthor values("4", "5", 1, 100)
6> insert titleauthor values("5", "6", 1, 100)
7> insert titleauthor values("6", "7", 2, 40)
8> insert titleauthor values("7", "8", 1, 100)
9> insert titleauthor values("8", "9", 1, 100)
10> GO
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
1>
2>
3>     CREATE PROC prSelEarningAuthors
4>     AS
5>     SELECT     t.title_id,
6>                a.au_lname,
7>                a.au_fname,
8>                advance  =   t.advance * ta.royaltyper/100,
9>                royalies =   (t.royalty * t.ytd_sales * t.price/100 - t.advance) * ta.royaltyper/100
10>     FROM       authors      a,
11>                titleauthor  ta,
12>                titles       t
13>     WHERE      ta.title_id =   t.title_id
14>     AND        a.au_id     =   ta.au_id
15>     AND        (t.royalty * t.ytd_sales * t.price/100 - t.advance)  * ta.royaltyper/100 > 0
16>     ORDER BY   t.title_id,
17>                au_lname,
18>                au_fname
19>     GO
1>
2>
3>     drop PROC prSelEarningAuthors;
4>     GO
1>
2>
3>     drop table authors;
4>     drop table titleauthor;
5>     drop table titles;
6>     GO


Optimized procedure to select earning authors.

9>
10> CREATE TABLE authors(
11>    au_id          varchar(11),
12>    au_lname       varchar(40)       NOT NULL,
13>    au_fname       varchar(20)       NOT NULL,
14>    phone          char(12)          NOT NULL DEFAULT ("UNKNOWN"),
15>    address        varchar(40)           NULL,
16>    city           varchar(20)           NULL,
17>    state          char(2)               NULL,
18>    zip            char(5)               NULL,
19>    contract       bit               NOT NULL
20> )
21> GO
1> insert authors values("1",  "Joe",   "Abra",   "111 111-1111", "6 St.", "Berkeley",  "CA", "11111", 1)
2> insert authors values("2",  "Jack",  "Majo",   "222 222-2222", "3 St.", "Oakland" ,  "CA", "22222", 1)
3> insert authors values("3",  "Pink",  "Cherry", "333 333-3333", "5 Ln.", "Vancouver", "BC", "33333", 1)
4> insert authors values("4",  "Blue",  "Albert", "444 444-4444", "7 Av.", "Vancouver", "BC", "44444", 1)
5> insert authors values("5",  "Red",   "Anne",   "555 555-5555", "6 Av.", "Regina",    "SK", "55555", 1)
6> insert authors values("6",  "Black", "Michel", "666 666-6666", "3 Pl.", "Regina",    "SK", "66666", 1)
7> insert authors values("7",  "White", "Sylvia", "777 777-7777", "1 Pl.", "Rockville", "MD", "77777", 1)
8> insert authors values("8",  "Yellow","Heather","888 888-8888", "3 Pu",  "Vacaville", "CA", "88888", 0)
9> insert authors values("9",  "Gold",  "Dep",    "999 999-9999", "5 Av.", "Oakland",   "CA", "99999", 0)
10> insert authors values("10", "Siler", "Dean",   "000 000-0000", "4 Av.", "Oakland",   "CA", "00000", 1)
11> GO
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
1>
2> CREATE TABLE titles(
3>    title_id       varchar(20),
4>    title          varchar(80)       NOT NULL,
5>    type           char(12)          NOT NULL,
6>    pub_id         char(4)               NULL,
7>    price          money                 NULL,
8>    advance        money                 NULL,
9>    royalty        int                   NULL,
10>    ytd_sales      int                   NULL,
11>    notes          varchar(200)          NULL,
12>    pubdate        datetime          NOT NULL
13> )
14> GO
1>
2> insert titles values ("1", "Secrets",   "popular_comp", "1389", $20.00, $8000.00, 10, 4095,"Note 1","06/12/94")
3> insert titles values ("2", "The",       "business",     "1389", $19.99, $5000.00, 10, 4095,"Note 2","06/12/91")
4> insert titles values ("3", "Emotional", "psychology",   "0736", $7.99,  $4000.00, 10, 3336,"Note 3","06/12/91")
5> insert titles values ("4", "Prolonged", "psychology",   "0736", $19.99, $2000.00, 10, 4072,"Note 4","06/12/91")
6> insert titles values ("5", "With",      "business",     "1389", $11.95, $5000.00, 10, 3876,"Note 5","06/09/91")
7> insert titles values ("6", "Valley",    "mod_cook",     "0877", $19.99, $0.00,    12, 2032,"Note 6","06/09/91")
8> insert titles values ("7", "Any?",      "trad_cook",    "0877", $14.99, $8000.00, 10, 4095,"Note 7","06/12/91")
9> insert titles values ("8", "Fifty",     "trad_cook",    "0877", $11.95, $4000.00, 14, 1509,"Note 8","06/12/91")
10> GO
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
1>
2> CREATE TABLE titleauthor(
3>    au_id          varchar(20),
4>    title_id       varchar(20),
5>    au_ord         tinyint               NULL,
6>    royaltyper     int                   NULL
7> )
8> GO
1>
2> insert titleauthor values("1", "2", 1, 60)
3> insert titleauthor values("2", "3", 1, 100)
4> insert titleauthor values("3", "4", 1, 100)
5> insert titleauthor values("4", "5", 1, 100)
6> insert titleauthor values("5", "6", 1, 100)
7> insert titleauthor values("6", "7", 2, 40)
8> insert titleauthor values("7", "8", 1, 100)
9> insert titleauthor values("8", "9", 1, 100)
10> GO
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
1>
2>     CREATE PROC prSelEarningAuthors
3>     AS
4>     SELECT t.title_id, a.au_lname, a.au_fname,
5>            advance = t.advance * ta.royaltyper/100,
6>            royalies = (t.royalty * t.ytd_sales * t.price/100 - t.advance) *
7>         ta.royaltyper/100
8>     FROM authors a, titleauthor ta, titles t
9>     WHERE ta.title_id = t.title_id
10>     AND a.au_id   = ta.au_id
11>     AND (t.royalty * t.ytd_sales * t.price/100 - t.advance) * ta.royaltyper/100 > 0
12>     ORDER BY t.title_id, au_lname, au_fname
13>     GO
1>
2>     drop PROC prSelEarningAuthors;
3>     GO
1>
2>     drop table authors;
3>     drop table titleauthor;
4>     drop table titles;
5>     GO


remove data based upon criteria specified through arguments.

7>
8>
9> CREATE TABLE stores(
10>    stor_id        char(4)           NOT NULL,
11>    stor_name      varchar(40)           NULL,
12>    stor_address   varchar(40)           NULL,
13>    city           varchar(20)           NULL,
14>    state          char(2)               NULL,
15>    zip            char(5)               NULL
16> )
17> GO
1> insert stores values("1","B","567 Ave.","Tustin",   "CA","92789")
2> insert stores values("2","N","577 St.", "Los Gatos","CA","96745")
3> insert stores values("3","T","679 St.", "Portland", "OR","89076")
4> insert stores values("4","F","89  St.", "Fremont",  "CA","90019")
5> GO
(1 rows affected)
(1 rows affected)
(1 rows affected)
(1 rows affected)
1>
2>
3>     CREATE PROCEDURE prDeleteData    @chvTable VARCHAR(30),
4>                                       @chvWhereField VARCHAR(30) = NULL,
5>                                       @chvWhereFieldDataType VARCHAR(30) = "CHAR",
6>                                       @chvOperator VARCHAR(2) = "=",
7>                                       @chvValue VARCHAR(30) = NULL
8>     AS
9>     DECLARE @chvSQL VARCHAR(255), @chvQuotes CHAR(1)
10>     SELECT @chvSQL = "DELETE " + @chvTable
11>     IF NOT @chvWhereField IS NULL
12>             BEGIN
13>               SELECT @chvSQL = @chvSQL + " WHERE " + @chvWhereField + " " + @chvOperator + " "
14>               SELECT @chvWhereFieldDataType = LOWER(RTRIM(@chvWhereFieldDataType))
15>               SELECT @chvQuotes = CASE @chvWhereFieldDataType
16>                      WHEN "char" THEN "y"
17>                      WHEN "datetime" THEN "y"
18>                      WHEN "datetimn" THEN "y"
19>                      WHEN "smalldatetime" THEN "y"
20>                      WHEN "text" THEN "y"
21>                      WHEN "varchar" THEN "y"
22>                      ELSE "n"
23>               END
24>               IF @chvQuotes = "y"
25>                      SELECT @chvSQL = @chvSQL + """" + @chvValue + """"
26>               ELSE
27>                      SELECT @chvSQL = @chvSQL + @chvValue
28>            END
29>     EXEC (@chvSQL)
30>     GO
1>
2>
3>     EXEC prDeleteData     @chvTable = "stores",
4>             @chvWhereField = "stor_name",
5>             @chvWhereFieldDataType = "CHAR",
6>             @chvOperator = "=",
7>             @chvValue = "News & Brews"
8>     GO
(0 rows affected)
1>
2>
3>     drop PROCEDURE prDeleteData;
4>     GO
1>
2> drop table stores;
3> GO


Stored Procedure to Retrieve a Customer"s Most Recent Order

4>  CREATE TABLE employee(
5>     id          INTEGER NOT NULL PRIMARY KEY,
6>     first_name  VARCHAR(10),
7>     last_name   VARCHAR(10),
8>     salary      DECIMAL(10,2),
9>     start_Date  DATETIME,
10>     region      VARCHAR(10),
11>     city        VARCHAR(20),
12>     managerid   INTEGER
13>  );
14>  GO
1>
2> INSERT INTO employee VALUES (1, "Jason" ,  "Martin", 5890,"2005-03-22","North","Vancouver",3);
3> GO
(1 rows affected)
1> INSERT INTO employee VALUES (2, "Alison",  "Mathews",4789,"2003-07-21","South","Utown",4);
2> GO
(1 rows affected)
1> INSERT INTO employee VALUES (3, "James" ,  "Smith",  6678,"2001-12-01","North","Paris",5);
2> GO
(1 rows affected)
1> INSERT INTO employee VALUES (4, "Celia" ,  "Rice",   5567,"2006-03-03","South","London",6);
2> GO
(1 rows affected)
1> INSERT INTO employee VALUES (5, "Robert",  "Black",  4467,"2004-07-02","East","Newton",7);
2> GO
(1 rows affected)
1> INSERT INTO employee VALUES (6, "Linda" ,  "Green" , 6456,"2002-05-19","East","Calgary",8);
2> GO
(1 rows affected)
1> INSERT INTO employee VALUES (7, "David" ,  "Larry",  5345,"2008-03-18","West","New York",9);
2> GO
(1 rows affected)
1> INSERT INTO employee VALUES (8, "James" ,  "Cat",    4234,"2007-07-17","West","Regina",9);
2> GO
(1 rows affected)
1> INSERT INTO employee VALUES (9, "Joan"  ,  "Act",    6123,"2001-04-16","North","Toronto",10);
2> GO
(1 rows affected)
1>
2> select * from employee;
3> GO
id          first_name last_name  salary       start_Date              region     city                 managerid
----------- ---------- ---------- ------------ ----------------------- ---------- -------------------- -----------
          1 Jason      Martin          5890.00 2005-03-22 00:00:00.000 North      Vancouver                      3
          2 Alison     Mathews         4789.00 2003-07-21 00:00:00.000 South      Utown                          4
          3 James      Smith           6678.00 2001-12-01 00:00:00.000 North      Paris                          5
          4 Celia      Rice            5567.00 2006-03-03 00:00:00.000 South      London                         6
          5 Robert     Black           4467.00 2004-07-02 00:00:00.000 East       Newton                         7
          6 Linda      Green           6456.00 2002-05-19 00:00:00.000 East       Calgary                        8
          7 David      Larry           5345.00 2008-03-18 00:00:00.000 West       New York                       9
          8 James      Cat             4234.00 2007-07-17 00:00:00.000 West       Regina                         9
          9 Joan       Act             6123.00 2001-04-16 00:00:00.000 North      Toronto                       10
(9 rows affected)
1>
2>
3>
4> CREATE PROC MyProc
5> (
6>   @ID nchar (5)
7> )
8> AS
9> SELECT TOP 1
10>    *
11>  FROM
12>    Employee
13>  WHERE
14>      ID = @ID
15>  ORDER BY
16>    Start_Date DESC
17>  GO
1>
2>
3> exec MyProc "1"
4> GO
id          first_name last_name  salary       start_Date              region     city                 managerid
----------- ---------- ---------- ------------ ----------------------- ---------- -------------------- -----------
          1 Jason      Martin          5890.00 2005-03-22 00:00:00.000 North      Vancouver                      3
(1 rows affected)
1>
2> drop procedure MyProc
3> GO
1>
2>
3> drop table employee;
4> GO