To retrieve data from a table, the table is
queried. An SQL
SELECT statement is used to do this. The
statement is divided into a select list (the part that lists the
columns to be returned), a table list (the part that lists the
tables from which to retrieve the data), and an optional
qualification (the part that specifies any restrictions).The above query
returns a list of all employees sorted in ascending order by name within department number.
SELECT * FROM emp;
Here * means "all columns").
Note: While SELECT * is useful for off-the-cuff
queries, it is widely considered bad style in production code,
since adding a column to the table would change the results.
The output should be:
empno | ename | job | mgr | hiredate | sal | comm | deptno
-------+--------+-----------+------+--------------------+---------+---------+--------
7369 | SMITH | CLERK | 7902 | 17-DEC-80 00:00:00 | 800.00 | | 20
7499 | ALLEN | SALESMAN | 7698 | 20-FEB-81 00:00:00 | 1600.00 | 300.00 | 30
7521 | WARD | SALESMAN | 7698 | 22-FEB-81 00:00:00 | 1250.00 | 500.00 | 30
7566 | JONES | MANAGER | 7839 | 02-APR-81 00:00:00 | 2975.00 | | 20
7654 | MARTIN | SALESMAN | 7698 | 28-SEP-81 00:00:00 | 1250.00 | 1400.00 | 30
7698 | BLAKE | MANAGER | 7839 | 01-MAY-81 00:00:00 | 2850.00 | | 30
7782 | CLARK | MANAGER | 7839 | 09-JUN-81 00:00:00 | 2450.00 | | 10
7788 | SCOTT | ANALYST | 7566 | 19-APR-87 00:00:00 | 3000.00 | | 20
7839 | KING | PRESIDENT | | 17-NOV-81 00:00:00 | 5000.00 | | 10
7844 | TURNER | SALESMAN | 7698 | 08-SEP-81 00:00:00 | 1500.00 | 0.00 | 30
7876 | ADAMS | CLERK | 7788 | 23-MAY-87 00:00:00 | 1100.00 | | 20
7900 | JAMES | CLERK | 7698 | 03-DEC-81 00:00:00 | 950.00 | | 30
7902 | FORD | ANALYST | 7566 | 03-DEC-81 00:00:00 | 3000.00 | | 20
7934 | MILLER | CLERK | 7782 | 23-JAN-82 00:00:00 | 1300.00 | | 10
(14 rows)
You may specify any arbitrary expressions in the select list. For example, you can do:
SELECT ename, (sal-sal*0.10) AS taxed_salary, sal FROM emp;
This should give:
ename | taxed_salary | sal
--------+--------------+---------
SMITH | 720.0000 | 800.00
ALLEN | 1440.0000 | 1600.00
WARD | 1125.0000 | 1250.00
JONES | 2677.5000 | 2975.00
MARTIN | 1125.0000 | 1250.00
BLAKE | 2565.0000 | 2850.00
CLARK | 2205.0000 | 2450.00
SCOTT | 2700.0000 | 3000.00
KING | 4500.0000 | 5000.00
TURNER | 1350.0000 | 1500.00
ADAMS | 990.0000 | 1100.00
JAMES | 855.0000 | 950.00
FORD | 2700.0000 | 3000.00
MILLER | 1170.0000 | 1300.00
(14 rows)
Notice how the AS clause is used to relabel the
output column. (The AS clause is optional.)
A query can be "qualified" by adding a WHERE
clause that specifies which rows are wanted. The WHERE
clause contains a Boolean (truth value) expression, and only rows for
which the Boolean expression is true are returned. The usual
Boolean operators (AND,
OR, and NOT) are allowed in
the qualification. For example, the following
retrieves the weather of San Francisco on rainy days:
SELECT * FROM emp
WHERE ename = 'SMITH' AND mgr = 7902;
Result:
empno | ename | job | mgr | hiredate | sal | comm | deptno
-------+-------+-------+------+--------------------+--------+------+--------
7369 | SMITH | CLERK | 7902 | 17-DEC-80 00:00:00 | 800.00 | | 20
(1 row)
You can request that the results of a query
be returned in sorted order:
SELECT * FROM emp
ORDER BY ename;
empno | ename | job | mgr | hiredate | sal | comm | deptno
-------+--------+-----------+------+--------------------+---------+---------+--------
7876 | ADAMS | CLERK | 7788 | 23-MAY-87 00:00:00 | 1100.00 | | 20
7499 | ALLEN | SALESMAN | 7698 | 20-FEB-81 00:00:00 | 1600.00 | 300.00 | 30
7698 | BLAKE | MANAGER | 7839 | 01-MAY-81 00:00:00 | 2850.00 | | 30
7782 | CLARK | MANAGER | 7839 | 09-JUN-81 00:00:00 | 2450.00 | | 10
7902 | FORD | ANALYST | 7566 | 03-DEC-81 00:00:00 | 3000.00 | | 20
7900 | JAMES | CLERK | 7698 | 03-DEC-81 00:00:00 | 950.00 | | 30
7566 | JONES | MANAGER | 7839 | 02-APR-81 00:00:00 | 2975.00 | | 20
7839 | KING | PRESIDENT | | 17-NOV-81 00:00:00 | 5000.00 | | 10
7654 | MARTIN | SALESMAN | 7698 | 28-SEP-81 00:00:00 | 1250.00 | 1400.00 | 30
7934 | MILLER | CLERK | 7782 | 23-JAN-82 00:00:00 | 1300.00 | | 10
7788 | SCOTT | ANALYST | 7566 | 19-APR-87 00:00:00 | 3000.00 | | 20
7369 | SMITH | CLERK | 7902 | 17-DEC-80 00:00:00 | 800.00 | | 20
7844 | TURNER | SALESMAN | 7698 | 08-SEP-81 00:00:00 | 1500.00 | 0.00 | 30
7521 | WARD | SALESMAN | 7698 | 22-FEB-81 00:00:00 | 1250.00 | 500.00 | 30
(14 rows)
You can request that duplicate rows be removed from the result of
a query:
SELECT DISTINCT job
FROM emp;
job
-----------
ANALYST
CLERK
MANAGER
PRESIDENT
SALESMAN
(5 rows)
Here again, the result row ordering might vary.
You can ensure consistent results by using DISTINCT and
ORDER BY together:
Note: In some database systems, including older versions of
EnterpriseDB, the implementation of
DISTINCT automatically orders the rows and
so ORDER BY is unnecessary. But this is not
required by the SQL standard, and current
EnterpriseDB doesn't guarantee that
DISTINCT causes the rows to be ordered.
SELECT DISTINCT job
FROM emp
ORDER BY job;