summaryrefslogtreecommitdiffhomepage
path: root/sql.html.markdown
blob: 8f200344321d477f964a0758554938c4c0ffcda6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
---
language: SQL
filename: learnsql.sql
contributors:
  - ["Bob DuCharme", "http://bobdc.com/"]
https://github.com/adambard/learnxinyminutes-docs
---

Structured Query Language (SQL) is an ISO standard language for creating and working with databases stored in a set of tables. Implementations usually add their own extensions to the language; [Comparison of different SQL implementations](http://troels.arvin.dk/db/rdbms/) is a good reference on product differences.

Implementations typically provide a command line prompt where you can enter the commands shown here interactively, and they also offer a way to execute a series of these commands stored in a script file.  (Showing that you’re done with the interactive prompt is a good example of something that isn’t standardized--most SQL implementations support the keywords QUIT, EXIT, or both.)

Several of these sample commands assume that the [MySQL employee sample database](https://dev.mysql.com/doc/employee/en/) available on [github](https://github.com/datacharmer/test_db) has already been loaded. The github files are scripts of commands, similar to the relevant commands below, that create and populate tables of data about a fictional company’s employees. The syntax for running these scripts will depend on the SQL implementation you are using. A utility that you run from the operating system prompt is typical. 


```sql
# Comments start with a pound sign. End each command with a semicolon.

# SQL is not case-sensitive about keywords. The sample commands here
# follow the convention of spelling them in upper-case because it makes 
# it easier to distinguish them from database, table, and column names.

# Create and delete a database. Database and table names are case-sensitive.
CREATE DATABASE someDatabase;
DROP DATABASE someDatabase;

# List available databases.
SHOW DATABASES;

# Use a particular existing database. 
USE employees;    

# Select all rows and columns from the current database's departments table.
# Default activity is for the interpreter to scroll the results on your screen. 
SELECT * FROM departments;

# Retrieve all rows from the departments table, 
# but only the dept_no and dept_name columns. 
# Splitting up commands across lines is OK.
SELECT dept_no,
       dept_name FROM departments;

# Retrieve all departments columns, but just 5 rows. 
SELECT * FROM departments LIMIT 5;

# Retrieve dept_name column values from the departments
# table where the dept_name value has the substring "en". 
SELECT dept_name FROM departments WHERE dept_name LIKE "%en%";

# Retrieve all columns from the departments table where the dept_name
# column starts with an "S" and has exactly 4 characters after it. 
SELECT * FROM departments WHERE dept_name LIKE "S____";

# Select title values from the titles table but don't show duplicates.
SELECT DISTINCT title FROM titles;

# Same as above, but sorted (case-sensitive) by the title values. 
SELECT DISTINCT title FROM titles ORDER BY title;

# Show the number of rows in the departments table.
SELECT COUNT(*) FROM departments;

# Show the number of rows in the departments table that
# have "en" as a substring of the dept_name value. 
SELECT COUNT(*) FROM departments WHERE dept_name LIKE "%en%";

# A JOIN of information from multiple tables: the titles table shows 
# who had what job titles, by their employee numbers, from what 
# date to what date. Retrieve this information, but instead of the
# employee number, use the employee number as a cross-reference to 
# the employees table to get each employee's first and last name
# instead. (And only get 10 rows.)

SELECT employees.first_name, employees.last_name,
       titles.title, titles.from_date, titles.to_date
FROM titles INNER JOIN employees ON
       employees.emp_no = titles.emp_no LIMIT 10;

# List all the tables in all the databases. Implementations typically provide
# their own shortcut command to do this with the database currently in use.
SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE';

# Create a table called tablename1, with the two columns shown, for
# the database currently in use. Lots of other options are available
# for how you specify the columns, such as their datatypes.
CREATE TABLE tablename1 (`fname` VARCHAR(20),`lname` VARCHAR(20));

# Insert a row of data into the table tablename1. This assumes that the 
# table has been defined to accept these values as appropriate for it. 
INSERT INTO tablename1 VALUES('Richard','Mutt');

# In tablename1, change the fname value to "John"
# for all rows that have an lname value of "Mutt". 
UPDATE tablename1 SET fname="John" WHERE lname="Mutt";

# Delete rows from the tablename1 table
# where the lname value begins with "M".
DELETE FROM tablename1 WHERE lname like "M%";

# Delete all rows from the tablename1 table, leaving the empty table.
DELETE FROM tablename1;

# Remove the entire tablename1 table. 
DROP TABLE tablename1;
```