Learn SQL The Hard way - Creating .sql with .db in SQL Lite 3 - Why and How?
Question: As a beginning programmer with +20 hours of Python coding and novice
familiarity with the command-line, I opened up Zed Shaw's "Learn SQL The Hard
Way" and was quickly stumped.

In [exercise 01](http://sql.learncodethehardway.org/book/ex1.html), Zed has
you create your first table with this first command:

    
    
    sqlite3 ex1.db < ex1.sql
    

However this fails to run in my command-line, giving the error message,
"-bash: ex1.sql: No such file or directory." Initially, I ignored this
recommended code and proceeded with:

    
    
    sqlite3 ex1.db
    SQLite version 3.7.15.1 2012-12-19 20:39:10
    Enter ".help" for instructions
    Enter SQL statements terminated with a ";"
    sqlite> CREATE TABLE person (
       ...>     id INTEGER PRIMARY KEY,
       ...>     first_name TEXT,
       ...>     last_name TEXT,
       ...>     age INTEGER
       ...> );
    

Running "ls -l" in the command-line shows:

    
    
    -rw-r--r--  1 thefifth  staff  2048 Feb 15 15:23 ex1.db
    

But what I want and am failing to get is:

    
    
    $ ls -l
    -rw-r--r--  1 zedshaw  staff  2048 Nov  8 16:18 ex1.db
    -rw-r--r--  1 zedshaw  staff    92 Nov  8 16:14 ex1.sql
    

I Googled around and found [this blog](http://www.adamjonas.com/blog/learn-
sql-the-hard-way/) that implements the same "name.db < name.sql" syntax, but
following along the code here didn't work for me either. This [Stack
Overflow](http://stackoverflow.com/questions/2049109/how-to-import-sql-into-
sqlite3) also has a similar syntax, but in the context of converting .sql to
sqlite3.

Specifically, I'm wondering if this is the "<" for use in the native bash
terminal, and that I'm failing to meet certain criteria for its correct use.
Also, I don't know the purpose of creating both a .sql and .db file, although
apparently one is much smaller than the other. Perhaps I've installed sqlite3
incorrectly, but it seems to be working fine.

Thanks for your help!


Answer: 
    sqlite3 ex1.db < ex1.sql
    

For the above to work, `ex1.sql` should already exist. `<` is a character used
in shells for input redirection. `sqlite3` is started here with a new or
existing database (it will create the database as needed), and gets SQL
statements from `ex1.sql`, executing them and modifying `ex1.db` accordingly.

Now let's generate `ex1.sql` from `ex1.db`, which you apparently want to do:

    
    
    sqlite3 ex1.db .dump > ex1.sql
    

We use shell redirection facility again, now redirecting the _output_ to
`ex1.sql`. The `.dump` command makes `sqlite` write out SQL statements that
will recreate similar database when they are executed in an empty database:
tables are recreated and populated with `INSERT`, etc.

Now you can go to step 1:

    
    
    sqlite3 ex1copy.db < ex1.sql
    

