[Tutor] mysqlite
Alan Gauld
alan.gauld at btinternet.com
Thu Mar 7 01:05:56 CET 2013
On 06/03/13 23:25, Lolo Lolo wrote:
> can someone please explain this to me.
>
> update Employee
> set ManagerID = (Select EmpID
> from Employee
> where Name = 'John Brown')
> where Name = 'Fred Smith' OR
> Name = 'Anne Jones';
>
>
> this is saying set the managerID of 'Fred Smith' or
> 'Jane Brown' to the ID returned in the nested select statement?
Almost.
Its saying set the Manager of both Fred and Anne to John.
The OR selects both entries and then applies the update
to them. We can logically split it like this (so you can
test it at the command prompt :-):
SELECT * FROM Employee
where Name = 'Fred Smith' OR
Name = 'Anne Jones';
That will get you two rows.
Select EmpID
from Employee
where Name = 'John Brown'
That will get you one ID, lets call it JohnsID
and putting them together:
update Employee
set ManagerID = JohnsID
where Name = 'Fred Smith' OR
Name = 'Anne Jones';
Hopefully that clarifies it a bit.
> and this:
>
> drop table author;
> create table author (
>
> drop table book;
> create table book (
>
> drop table book_author;
> create table book_author (
sqlite> SELECT title from book, book_author
...> where book_author.bookID = book.ID
...> and book_author.authorID = (select ID from author
...> where name = "Jane Austin");
> maybe its simple but because its more complex im finding it hard to read.
Yes, its where SQL starts to get more difficult when you start joining
tables together. We are basically extracting data from the author table
(Jane Austins ID) to use as a filter in the book_author table to get the
IDs of all the books in our database written by Jane Austin. We then use
this list of IDs to filter the Books table to get the names of those books.
The whole thing could be simplified ifg we didn't use IDs but just used
the names directly. But that leads to other problems (discussed in the
tutorial) when names change etc (not so likely with books but very
common with real people!). So using IDs, even though it adds complexity,
is usually a worthwhile habit to get into.
> ... why is book_author
> also in the select statement when it isn't
> being returned?
Because we are using it in the query (the where clause) we need to
include it in the list of tables.
You can think of the SELECT statement as a mini program and the tables
list as a list of all the objects used in the program. Its not just for
the values being returned.
> or are we actually returning every single field from book author?
No, only the set of IDs corresponding to Jane Austin's ID.
The thing to remember about book_author is that it only contains IDs it
has no "real" data of its own. It's purely there to facilitate a multi
way join between books and authors.
The good news is that once you wrap your brain around this construct
most SQL queries you will come across will be comprehensible to you.
HTH, if not, just keep firing in the questions.
--
Alan G
Author of the Learn to Program web site
http://www.alan-g.me.uk/
More information about the Tutor
mailing list