Here is the SQL that goes with the demo.
-- Database by Doug -- get code card up here -- Douglas Kline -- 4/8/2016 -- DELETE - how to remove records from table USE Northwind -- might want to review the SELECT statement -- before using DELETE -- in particular, review the WHERE clause, -- because DELETE uses the WHERE clause -- public service announcement :-) /* ***WARNING!*** ***************** *INSERT, UPDATE and DELETE are *data modifying* commands *INSERT, UPDATE and DELETE can do set-at-a-time operations **this means that a seemingly simple statement ** can potentially change millions of records * the database engine will not ask "Are you sure?" * there is no simple "Undo" * professionals normally don't, at the command line, * execute INSERT, UPDATE, and DELETE commands * on a production database * treat these statements with respect! *************************************/ -- the DELETE statement removes *entire* existing rows -- if you want to remove *values* in a row, use UPDATE -- (that is consider a change to a row) -- let's look at the Orders table SELECT * FROM Orders ORDER BY orderID desc -- note the descending order -- now insert a bogus row to play with: INSERT INTO Orders (ShipCity, CustomerID) VALUES ('Akron', 'VINET') -- see what happened, and note the OrderID SELECT * FROM Orders ORDER BY orderID desc -- OrderID=11109 for the new record -- now that we have a row, here's a simple DELETE statement DELETE FROM ORDERS WHERE orderID = 11109 -- NOTE: there is no "are you sure" -- or "you are about to delete a million records, okay" -- and SSMS doesn't have an "undo delete" button -- now check the record SELECT * FROM Orders ORDER BY orderID desc -- note that one record was affected -- because the primary key was set to a single number -- the most possible damage is a single record -- let's put that record back in... INSERT INTO Orders (ShipCity, CustomerID) VALUES ('Akron', 'VINET') -- see what happened, and note the OrderID SELECT * FROM Orders ORDER BY orderID desc -- OrderID=11110 for the new record -- I like to do this before I do a DELETE: SELECT * FROM Orders WHERE Shipcity='Akron' AND CustomerID = 'VINET' -- OK, that's the one (or more) records I want to get rid of -- copy the statement down, and change to delete DELETE FROM Orders WHERE Shipcity='Akron' AND CustomerID = 'VINET' -- and check the results SELECT * FROM Orders ORDER BY orderID desc -- the general format for the DELETE statement is: /* DELETE FROMWHERE */ -- notice that the DELETE statement is very similar to SELECT -- except you don't specify any columns... -- because DELETE operates on *records*, not on columns -- but what if you want to specify records to be deleted, -- based on relationships with other tables, -- in other words, a join -- put the record back in: INSERT INTO Orders (ShipCity, CustomerID) VALUES ('Akron', 'VINET') -- and another INSERT INTO Orders (ShipCity, CustomerID) VALUES ('Cleveland', 'RATTC') -- and another INSERT INTO Orders (ShipCity, CustomerID) VALUES ('San Diego', 'BONAP') -- consider this: SELECT * FROM Orders LEFT JOIN [Order Details] ON Orders.OrderID = [Order Details].orderID WHERE [order details].orderID IS NULL -- this is a classic "find unmatched" -- in other words, this shows the orders -- without any lines on them - no related [order details] records -- "widow" records because there are no "related" records, -- and there *should* be, orders don't make sense without lines -- btw, -- you might want to check out my -- video on outer joins if you don't know this -- so how do I delete widow records? -- copy down, and change to DELETE... DELETE FROM Orders LEFT JOIN [Order Details] ON Orders.OrderID = [Order Details].orderID WHERE [order details].orderID IS NULL -- darn, there's an error -- this is because I can only DELETE from one table at a time -- and I've got two tables specified -- which table's records are to be deleted? -- so here's the syntax: DELETE Orders -- this is the changed part FROM Orders LEFT JOIN [Order Details] ON Orders.OrderID = [Order Details].orderID WHERE [order details].orderID IS NULL -- and check the results SELECT * FROM Orders ORDER BY orderID desc -- so the more general syntax is /* DELETE FROM WHERE */ -- where the table-expression normally includes -- the table-name, with joins -- so, do professionals normally *DELETE* data? --- -- -- -- -- -- -- NO. -- they normally *move* it somewhere, -- after they make sure it made it to the new location safely -- they remove it from where it was -- and of course, they do a backup first -- -- -- Database by Doug -- Douglas Kline -- 4/8/2016 -- DELETE - how to remove records from table
No comments:
Post a Comment