+ All Categories
Home > Technology > Common SQL Programming Mistakes

Common SQL Programming Mistakes

Date post: 06-Dec-2014
Category:
Upload: plamen-ratchev
View: 2,607 times
Download: 0 times
Share this document with a friend
Description:
Common SQL programming mistakes and solutions
37
Transcript
Page 1: Common SQL Programming Mistakes
Page 2: Common SQL Programming Mistakes
Page 3: Common SQL Programming Mistakes
Page 4: Common SQL Programming Mistakes
Page 5: Common SQL Programming Mistakes

color

Black

Blue

Green

Red

sku product_description color

1 Ball Red

2 Bike Blue

3 Tent NULL

SELECT C.color

FROM Colors AS C

WHERE C.color NOT IN (SELECT P.color

FROM Products AS P);

color

----------

(0 row(s) affected)

Page 6: Common SQL Programming Mistakes

/* EXISTS */

SELECT C.color

FROM Colors AS C

WHERE NOT EXISTS(SELECT *

FROM Products AS P

WHERE C.color = P.color);

/* IS NOT NULL in the subquery */

SELECT C.color

FROM Colors AS C

WHERE C.color NOT IN (SELECT P.color

FROM Products AS P

WHERE P.color IS NOT NULL);

/* EXCEPT */

SELECT color

FROM Colors

EXCEPT

SELECT color

FROM Products;

/* LEFT OUTER JOIN */

SELECT C.color

FROM Colors AS C

LEFT OUTER JOIN Products AS P

ON C.color = P.color

WHERE P.color IS NULL;

Page 7: Common SQL Programming Mistakes
Page 8: Common SQL Programming Mistakes

SELECT customer_name

FROM Customers

WHERE LEFT(customer_name, 1) = 'L';

SELECT SUM(sale_amount) AS total_sales

FROM Sales

WHERE DATEPART(YEAR, sale_date) = 2009

AND DATEPART(MONTH, sale_date) = 1;

/* Exception: SQL Server 2008 only */

SELECT SUM(sale_amount) AS total_sales

FROM Sales

WHERE CAST(sale_date AS DATE) = '20090101';

Page 9: Common SQL Programming Mistakes

SELECT customer_name

FROM Customers

WHERE customer_name LIKE 'L%';

SELECT SUM(sale_amount) AS

total_sales

FROM Sales

WHERE sale_date >= '20090101'

AND sale_date < '20090201';

Page 10: Common SQL Programming Mistakes
Page 11: Common SQL Programming Mistakes

sale_date sale_amount

2009-01-01 120.50

2009-01-02 115.00

2009-01-03 140.80

2009-01-04 100.50

calendar_date holiday_name

2009-01-01 New Year’s Day

2009-01-02 NULL

2009-01-03 NULL

2009-01-04 NULL

2009-01-05 NULL

SELECT sale_date, sale_amount

FROM Sales AS S

WHERE sale_date IN

(SELECT sale_date

FROM Calendar AS C

WHERE holiday_name IS NOT NULL);

Page 12: Common SQL Programming Mistakes

SELECT sale_date, sale_amount

FROM Sales AS S

WHERE sale_date IN

(SELECT C.calendar_date

FROM Calendar AS C

WHERE C.holiday_name IS NOT NULL);

Page 13: Common SQL Programming Mistakes
Page 14: Common SQL Programming Mistakes
Page 15: Common SQL Programming Mistakes

CREATE TABLE Customers (

customer_nbr INT NOT NULL PRIMARY KEY,

first_name VARCHAR(35) NOT NULL,

last_name VARCHAR(35) NOT NULL);

SELECT first_name, last_name

FROM Customers

WHERE last_name = N'Brown';

/*

StmtText

-----------------------------------

|--Clustered Index Scan(OBJECT:(

[dbo].[Customers].[PK_Customer]),

WHERE:(CONVERT_IMPLICIT(nvarchar(35),

[dbo].[Customers].[last_name],0)=[@1]))

*/

Page 16: Common SQL Programming Mistakes

SELECT first_name, last_name

FROM Customers

WHERE last_name = 'Brown';

Page 17: Common SQL Programming Mistakes
Page 18: Common SQL Programming Mistakes

account_nbr account_type account_reference

1 Personal abc

2 Business Basic 101

3 Personal def

4 Business Plus 5

SELECT account_nbr, account_reference AS account_ref_nbr

FROM Accounts

WHERE account_type LIKE 'Business%'

AND CAST(account_reference AS INT) > 20;

SELECT account_nbr, account_ref_nbr

FROM (SELECT account_nbr,

CAST(account_reference AS INT)

AS account_ref_nbr

FROM Accounts

WHERE account_type LIKE 'Business%') AS A

WHERE account_ref_nbr > 20;

Page 19: Common SQL Programming Mistakes

SELECT account_nbr,

account_reference AS account_ref_nbr

FROM Accounts

WHERE account_type LIKE 'Business%'

AND CASE WHEN account_reference NOT LIKE '%[^0-9]%'

THEN CAST(account_reference AS INT)

END > 20;

Page 20: Common SQL Programming Mistakes
Page 21: Common SQL Programming Mistakes

SELECT C.customer_name,

SUM(COALESCE(O.order_amt, 0)) AS total_2009

FROM Customers AS C

LEFT OUTER JOIN Orders AS O

ON C.customer_nbr = O.customer_nbr

WHERE O.order_date >= '20090101'

GROUP BY C.customer_name;

SELECT C.customer_name, O.order_amt, D.qty

FROM Customers AS C

LEFT OUTER JOIN Orders AS O

ON C.customer_nbr = O.customer_nbr

INNER JOIN OrderDetails AS D

ON D.order_nbr = O.order_nbr

AND D.sku = 101;

Page 22: Common SQL Programming Mistakes

-- Correct predicate in join conditions

SELECT C.customer_name,

SUM(COALESCE(O.order_amt, 0)) AS total_2009

FROM Customers AS C

LEFT OUTER JOIN Orders AS O

ON C.customer_nbr = O.customer_nbr

AND O.order_date >= '20090101'

GROUP BY C.customer_name;

-- Correct with OUTER join

SELECT C.customer_name, O.order_amt, D.qty

FROM Customers AS C

LEFT OUTER JOIN Orders AS O

ON C.customer_nbr = O.customer_nbr

LEFT OUTER JOIN OrderDetails AS D

ON D.order_nbr = O.order_nbr

AND D.sku = 101;

Page 23: Common SQL Programming Mistakes
Page 24: Common SQL Programming Mistakes
Page 25: Common SQL Programming Mistakes

SELECT sku, product_description,

(SELECT plant_nbr

FROM ProductPlants AS B

WHERE B.sku = A.sku) AS plant_nbr

FROM Products AS A;

SELECT A.sku, A.product_description, B.plant_nbr

FROM Products AS A

JOIN ProductPlants AS B

ON A.sku = B.sku

WHERE B.sku =

(SELECT C.sku

FROM NewProducts AS C

WHERE C.product_description LIKE '%guitar%');

Page 26: Common SQL Programming Mistakes

SELECT A.sku,

A.product_description,

B.plant_nbr

FROM Products AS A

JOIN ProductPlants AS B

ON A.sku = B.sku;

Page 27: Common SQL Programming Mistakes
Page 28: Common SQL Programming Mistakes

INSERT INTO PlasticProducts

SELECT *

FROM Products

WHERE material_type = 'plastic';

CREATE VIEW MetalProducts

AS

SELECT *

FROM Products

WHERE material_type = 'metal';

Page 29: Common SQL Programming Mistakes

INSERT INTO PlasticProducts

(sku, product_description, material_type)

SELECT sku, product_description, material_type

FROM Products

WHERE material_type = 'plastic';

Page 30: Common SQL Programming Mistakes
Page 31: Common SQL Programming Mistakes

CREATE FUNCTION dbo.GetTotalSales(@sku INT)

RETURNS DECIMAL(15, 2)

AS

BEGIN

RETURN(SELECT SUM(sale_amount)

FROM Sales

WHERE sku = @sku);

END

SELECT sku,

product_description,

dbo.GetTotalSales(sku) AS total_sales

FROM Products;

Page 32: Common SQL Programming Mistakes

-- direct calculation in the query

SELECT P.sku, P.product_description,

SUM(S.sale_amount) As total_sales

FROM Products AS P

JOIN Sales AS S

ON P.sku = S.sku

GROUP BY P.sku, P.product_description;

-- table-valued function

CREATE FUNCTION dbo.GetTotalSales(@sku INT)

RETURNS TABLE

AS

RETURN(SELECT SUM(sale_amount) AS total_sales

FROM Sales

WHERE sku = @sku);

-- query using table-valued function with CROSS APPLY

SELECT sku, product_description, total_sales

FROM Products AS P

CROSS APPLY dbo.GetTotalSales(P.sku) AS S;

Page 33: Common SQL Programming Mistakes
Page 34: Common SQL Programming Mistakes

DECLARE PriceUpdates

CURSOR LOCAL

FORWARD_ONLY

STATIC

READ_ONLY

FOR SELECT sku, price

FROM NewPrices;

OPEN PriceUpdates;

FETCH NEXT FROM PriceUpdates

INTO @sku, @price;

WHILE @@FETCH_STATUS = 0

BEGIN

UPDATE ProductPrices

SET price = @price,

effective_start_date = CURRENT_TIMESTAMP

WHERE sku = @sku;

FETCH NEXT FROM PriceUpdates

INTO @sku, @price;

END

Page 35: Common SQL Programming Mistakes

UPDATE ProductPrices

SET price = (SELECT N.price

FROM NewPrices AS N

WHERE N.sku = ProductPrices.sku),

effective_start_date = CURRENT_TIMESTAMP

WHERE EXISTS(SELECT *

FROM NewPrices AS N

WHERE N.sku = ProductPrices.sku);

Page 36: Common SQL Programming Mistakes
Page 37: Common SQL Programming Mistakes

Recommended