SELECT stkcode, stkfirm, stkprice*stkqty*exchrate FROM stock JOIN nation ON stock.natcode = nation.natcode WHERE natname = 'Australia';
SELECT stkcode, stkfirm, stkdiv*stkqty*exchrate FROM stock JOIN nation ON stock.natcode = nation.natcode;
stkfirm |
expr1001 |
---|---|
Freedonia Copper | 19373.36 |
Patagonian Tea | 31587.5 |
Abyssinian Ruby | 29053.2 |
Sri Lankan Gold | 88086.24 |
Indian Lead & Zinc | 19170 |
Burmese Elephant | 1547.13 |
Bolivian Sheep | 412386.84 |
Nigerian Geese | 20702.64 |
Canadian Sugar | 11790 |
Royal Ostrich Farms | 3704769 |
Minnesota Gold | 546801.753620505 |
Georgia Peach | 51902.6232928634 |
Narembeen Emu | 20984.7403806746 |
Queensland Diamond | 20527.7303723842 |
Indooroopilly Ruby | 12913.8102342635 |
Bombay Duck | 3816.30966435 |
SELECT natname, SUM(stkdiv*stkqty*exchrate) FROM stock JOIN nation
ON stock.natcode = nation.natcode GROUP BY natname;
CREATE VIEW yield(nation, firm, price, qty, exchrate, value, yield) AS SELECT natname, stkfirm, stkprice, stkqty, exchrate, stkprice*stkqty*exchrate,stkdiv/stkprice*100*exchrate FROM stock JOIN nation
ON stock.natcode = nation.natcode;
MS Access does not support the SQL CREATE VIEW statement. However, you can create the equivalent of a view by saving a query and then using the name of the query as a table name. In other words, in MS Access a saved query is a view. So you might write the following:
SELECT natname, AVG(stkdiv/stkprice*exchrate*100) FROM stock JOIN nation
ON stock.natcode = nation.natcode GROUP BY natname;
SELECT natname, MIN(stkdiv/stkprice*100), MAX(stkdiv/stkprice*100) FROM stock JOIN nation
ON stock.natcode = nation.natcode GROUP BY natname;
natname |
expr1001 |
expr1002 |
---|---|---|
Australia | 3.14070351758794 | 8.10372771474878 |
India | 3.91389432485323 | 3.91389432485323 |
United Kingdom | 4.14833438089252 | 14.2857142857143 |
United States | 1.85632077222944 | 8.51063829787234 |
SELECT natname, AVG(stkdiv/stkprice*100) FROM stock JOIN nation
ON stock.natcode = nation.natcode GROUP BY natname HAVING AVG(stkdiv/stkprice*100) > (SELECT AVG(stkdiv/stkprice*100) FROM stock);
All exchange rates in nation are based on the UK pound, which as a result has a value of 1.00.
To convert to US dollars, all currency values must be divided by the US exchange rate (0.67 in nation). Similarly, dividing by 0.46 will convert currency values to Australian dollars. Thus, the total value of stocks in US dollars is:
SELECT SUM(stkqty*stkprice*exchrate/0.67) FROM stock JOIN nation ON stock.natcode = nation.natcode;
The question becomes more taxing when you want to extract the exchange rate from the nation table. Exchange rates vary daily, so the SQL code above is not very useful.
The query would be easy if in one row you had the stock, its exchange rate, and the exchange rate of the currency in which values should be expressed. To get a stock and its exchange rate in one row, you join the two tables and save as tempory table T1. Then you must concatenate to each row the exchange rate of the target currency -- this is done by using a product (see pages 258 of the text). The other difficult part is that you need to use the nation table twice (once for the exchange rate and once for the target currency). This query challenges your skills as this stage, but it is important to know that SQL can handle such requests.
SELECT `Value`/exchrate FROM (SELECT SUM(stkqty*stkprice*exchrate) AS `Value`
FROM stock JOIN nation
ON stock.natcode = nation.natcode) AS T1, nation
WHERE natname = 'United States';
Now, calculate the value of Australian stocks in Australian dollars.
A foreign key is used to implement a 1:m relationship. In fact, the foreign key is an extra column which has been added to the table at the many end of the 1:m relationship. This extra column contains the value of the primary key of the table at the one end of the 1:m relationship. Through the foreign key, the two tables can be linked.
The referential integrity constraint demands that for every foreign key in a table there is a corresponding primary key in another table (later, students will learn it can be in the same table, but at this stage it is easier to handle assuming another table). In other words, for every value of the foreign key, an identical value for the corresponding primary key must exist.
The character's name would not be a sufficient identifier since the same character name could be used in many plays. However, each character name is typically only used once in each play. If this is not true for these plays, one would have to create a characterid to uniquely distinguish each character.
SELECT personid FROM person WHERE `person first` = 'Sheila' AND `person last` = "O'Hara";
personid |
---|
21 |
Teaching Tip: The class should discuss the problems of handling O'Hara.
SELECT * FROM person ORDER BY `person last`,`person first`;
SELECT cartype, carcost, carsell FROM person JOIN car ON person.personid = car.personid WHERE `person first` = 'Bruce' AND `person last` = 'Bush';
cartype |
carcost |
carsell |
---|---|---|
coupe | 15500.00 | 14750.00 |
sports | 1255.00 | 1355.00 |
sedan | 950.00 | 2000.00 |
SELECT `person first`, `person last`, carid, carcost, carsell, cartype, carsell-carcost FROM car JOIN person ON person.personid = car.personid;
SELECT cartype, COUNT(cartype) FROM car GROUP BY cartype;
cartype |
expr1001 |
---|---|
coupe | 2 |
sedan | 5 |
sports | 3 |
SELECT AVG(carSELL) FROM car JOIN person ON car.personid = person.personid WHERE `person first` = 'Sue' AND `person last` = 'Lim';
SELECT `person first`, `person last`, cartype, carsell-carcost AS profit
FROM car JOIN person
ON person.personid = car.personid
WHERE (carsell-carcost)
< (SELECT AVG(carsell-carcost) FROM car);
person first | person last | cartype | profit |
---|---|---|---|
Nolan | Haley | sedan | 295.00 |
Bruce | Bush | coupe | -750.00 |
Bruce | Bush | sports | 100.00 |
Bruce | Bush | sedan | 1050.00 |
Sue | Lim | sedan | 600.00 |
Barbara | Capelli | sedan | 500.00 |
SELECT MAX(carsell) FROM car;
SELECT SUM(carsell-carcost) as `Gross profit` FROM car;
Gross profit |
---|
11295.00 |
SELECT `person first`, `person last`, SUM(carsell-carcost) FROM car JOIN person ON person.personid=car.personid GROUP BY `person first`, `person last` HAVING COUNT(*) > 2;
CREATE VIEW PROFIT(id, type, cost, sell, profit) AS SELECT carid, cartype,carcost, carsell,carsell-carcost FROM car;
Note: There is a bug in MySQLWorkbench, customerID is part of the key for panel.
This page is part of the promotional and support
material for Data Management (open edition) by Richard T. Watson For questions and comments please contact the author |