mirror of
https://github.com/postgres/postgres.git
synced 2025-05-08 07:21:33 +03:00
297 lines
10 KiB
Python
Executable File
297 lines
10 KiB
Python
Executable File
#! /usr/bin/env python
|
|
# basics.py - basic SQL commands tutorial
|
|
# inspired from the Postgres95 tutorial
|
|
# adapted to Python 1995 by Pascal ANDRE
|
|
|
|
print """
|
|
__________________________________________________________________
|
|
MODULE BASICS.PY : BASIC POSTGRES SQL COMMANDS TUTORIAL
|
|
|
|
This module is designed for being imported from python prompt
|
|
|
|
In order to run the samples included here, first create a connection
|
|
using : cnx = advanced.DB(...)
|
|
|
|
The "..." should be replaced with whatever arguments you need to open an
|
|
existing database. Usually all you need is the name of the database and,
|
|
in fact, if it is the same as your login name, you can leave it empty.
|
|
|
|
then start the demo with: basics.demo(cnx)
|
|
__________________________________________________________________
|
|
"""
|
|
|
|
from pg import DB
|
|
import sys
|
|
|
|
# waits for a key
|
|
def wait_key():
|
|
print "Press <enter>"
|
|
sys.stdin.read(1)
|
|
|
|
# table creation commands
|
|
def create_table(pgcnx):
|
|
print "-----------------------------"
|
|
print "-- Creating a table:"
|
|
print "-- a CREATE TABLE is used to create base tables. POSTGRES"
|
|
print "-- SQL has its own set of built-in types. (Note that"
|
|
print "-- keywords are case-insensitive but identifiers are "
|
|
print "-- case-sensitive.)"
|
|
print "-----------------------------"
|
|
print
|
|
print "Sending query :"
|
|
print "CREATE TABLE weather ("
|
|
print " city varchar(80),"
|
|
print " temp_lo int,"
|
|
print " temp_hi int,"
|
|
print " prcp float8,"
|
|
print " date date"
|
|
print ")"
|
|
pgcnx.query("""CREATE TABLE weather (city varchar(80), temp_lo int,
|
|
temp_hi int, prcp float8, date date)""")
|
|
print
|
|
print "Sending query :"
|
|
print "CREATE TABLE cities ("
|
|
print " name varchar(80),"
|
|
print " location point"
|
|
print ")"
|
|
pgcnx.query("""CREATE TABLE cities (
|
|
name varchar(80),
|
|
location point)""")
|
|
|
|
# data insertion commands
|
|
def insert_data(pgcnx):
|
|
print "-----------------------------"
|
|
print "-- Inserting data:"
|
|
print "-- an INSERT statement is used to insert a new row into"
|
|
print "-- a table. There are several ways you can specify what"
|
|
print "-- columns the data should go to."
|
|
print "-----------------------------"
|
|
print
|
|
print "-- 1. the simplest case is when the list of value correspond to"
|
|
print "-- the order of the columns specified in CREATE TABLE."
|
|
print
|
|
print "Sending query :"
|
|
print "INSERT INTO weather "
|
|
print " VALUES ('San Francisco', 46, 50, 0.25, '11/27/1994')"
|
|
pgcnx.query("""INSERT INTO weather
|
|
VALUES ('San Francisco', 46, 50, 0.25, '11/27/1994')""")
|
|
print
|
|
print "Sending query :"
|
|
print "INSERT INTO cities "
|
|
print " VALUES ('San Francisco', '(-194.0, 53.0)')"
|
|
pgcnx.query("""INSERT INTO cities
|
|
VALUES ('San Francisco', '(-194.0, 53.0)')""")
|
|
print
|
|
wait_key()
|
|
print "-- 2. you can also specify what column the values correspond "
|
|
print " to. (The columns can be specified in any order. You may "
|
|
print " also omit any number of columns. eg. unknown precipitation"
|
|
print " below)"
|
|
print "Sending query :"
|
|
print "INSERT INTO weather (city, temp_lo, temp_hi, prcp, date)"
|
|
print " VALUES ('San Francisco', 43, 57, 0.0, '11/29/1994')"
|
|
pgcnx.query("INSERT INTO weather (date, city, temp_hi, temp_lo)" \
|
|
"VALUES ('11/29/1994', 'Hayward', 54, 37)")
|
|
|
|
# direct selection commands
|
|
def select_data1(pgcnx):
|
|
print "-----------------------------"
|
|
print "-- Retrieving data:"
|
|
print "-- a SELECT statement is used for retrieving data. The "
|
|
print "-- basic syntax is:"
|
|
print "-- SELECT columns FROM tables WHERE predicates"
|
|
print "-----------------------------"
|
|
print
|
|
print "-- a simple one would be the query:"
|
|
print "SELECT * FROM weather"
|
|
print
|
|
print "The result is :"
|
|
q = pgcnx.query("SELECT * FROM weather")
|
|
print q
|
|
print
|
|
print "-- you may also specify expressions in the target list (the "
|
|
print "-- 'AS column' specifies the column name of the result. It is "
|
|
print "-- optional.)"
|
|
print "The query :"
|
|
print " SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date "
|
|
print " FROM weather"
|
|
print "Gives :"
|
|
print pgcnx.query("""SELECT city, (temp_hi+temp_lo)/2
|
|
AS temp_avg, date FROM weather""")
|
|
print
|
|
print "-- if you want to retrieve rows that satisfy certain condition"
|
|
print "-- (ie. a restriction), specify the condition in WHERE. The "
|
|
print "-- following retrieves the weather of San Francisco on rainy "
|
|
print "-- days."
|
|
print "SELECT *"
|
|
print "FROM weather"
|
|
print "WHERE city = 'San Francisco' "
|
|
print " and prcp > 0.0"
|
|
print pgcnx.query("""SELECT * FROM weather WHERE city = 'San Francisco'
|
|
AND prcp > 0.0""")
|
|
print
|
|
print "-- here is a more complicated one. Duplicates are removed when "
|
|
print "-- DISTINCT is specified. ORDER BY specifies the column to sort"
|
|
print "-- on. (Just to make sure the following won't confuse you, "
|
|
print "-- DISTINCT and ORDER BY can be used separately.)"
|
|
print "SELECT DISTINCT city"
|
|
print "FROM weather"
|
|
print "ORDER BY city;"
|
|
print pgcnx.query("SELECT DISTINCT city FROM weather ORDER BY city")
|
|
|
|
# selection to a temporary table
|
|
def select_data2(pgcnx):
|
|
print "-----------------------------"
|
|
print "-- Retrieving data into other classes:"
|
|
print "-- a SELECT ... INTO statement can be used to retrieve "
|
|
print "-- data into another class."
|
|
print "-----------------------------"
|
|
print
|
|
print "The query :"
|
|
print "SELECT * INTO TABLE temptab "
|
|
print "FROM weather"
|
|
print "WHERE city = 'San Francisco' "
|
|
print " and prcp > 0.0"
|
|
pgcnx.query("""SELECT * INTO TABLE temptab FROM weather
|
|
WHERE city = 'San Francisco' and prcp > 0.0""")
|
|
print "Fills the table temptab, that can be listed with :"
|
|
print "SELECT * from temptab"
|
|
print pgcnx.query("SELECT * from temptab")
|
|
|
|
# aggregate creation commands
|
|
def create_aggregate(pgcnx):
|
|
print "-----------------------------"
|
|
print "-- Aggregates"
|
|
print "-----------------------------"
|
|
print
|
|
print "Let's consider the query :"
|
|
print "SELECT max(temp_lo)"
|
|
print "FROM weather;"
|
|
print pgcnx.query("SELECT max(temp_lo) FROM weather")
|
|
print
|
|
print "-- Aggregate with GROUP BY"
|
|
print "SELECT city, max(temp_lo)"
|
|
print "FROM weather "
|
|
print "GROUP BY city;"
|
|
print pgcnx.query( """SELECT city, max(temp_lo)
|
|
FROM weather GROUP BY city""")
|
|
|
|
# table join commands
|
|
def join_table(pgcnx):
|
|
print "-----------------------------"
|
|
print "-- Joining tables:"
|
|
print "-- queries can access multiple tables at once or access"
|
|
print "-- the same table in such a way that multiple instances"
|
|
print "-- of the table are being processed at the same time."
|
|
print "-----------------------------"
|
|
print
|
|
print "-- suppose we want to find all the records that are in the "
|
|
print "-- temperature range of other records. W1 and W2 are aliases "
|
|
print "--for weather."
|
|
print
|
|
print "SELECT W1.city, W1.temp_lo, W1.temp_hi, "
|
|
print " W2.city, W2.temp_lo, W2.temp_hi"
|
|
print "FROM weather W1, weather W2"
|
|
print "WHERE W1.temp_lo < W2.temp_lo "
|
|
print " and W1.temp_hi > W2.temp_hi"
|
|
print
|
|
print pgcnx.query("""SELECT W1.city, W1.temp_lo, W1.temp_hi,
|
|
W2.city, W2.temp_lo, W2.temp_hi FROM weather W1, weather W2
|
|
WHERE W1.temp_lo < W2.temp_lo and W1.temp_hi > W2.temp_hi""")
|
|
print
|
|
print "-- let's join two tables. The following joins the weather table"
|
|
print "-- and the cities table."
|
|
print
|
|
print "SELECT city, location, prcp, date"
|
|
print "FROM weather, cities"
|
|
print "WHERE name = city"
|
|
print
|
|
print pgcnx.query("""SELECT city, location, prcp, date FROM weather, cities
|
|
WHERE name = city""")
|
|
print
|
|
print "-- since the column names are all different, we don't have to "
|
|
print "-- specify the table name. If you want to be clear, you can do "
|
|
print "-- the following. They give identical results, of course."
|
|
print
|
|
print "SELECT w.city, c.location, w.prcp, w.date"
|
|
print "FROM weather w, cities c"
|
|
print "WHERE c.name = w.city;"
|
|
print
|
|
print pgcnx.query("""SELECT w.city, c.location, w.prcp, w.date
|
|
FROM weather w, cities c WHERE c.name = w.city""")
|
|
|
|
# data updating commands
|
|
def update_data(pgcnx):
|
|
print "-----------------------------"
|
|
print "-- Updating data:"
|
|
print "-- an UPDATE statement is used for updating data. "
|
|
print "-----------------------------"
|
|
print
|
|
print "-- suppose you discover the temperature readings are all off by"
|
|
print "-- 2 degrees as of Nov 28, you may update the data as follow:"
|
|
print
|
|
print "UPDATE weather"
|
|
print " SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2"
|
|
print " WHERE date > '11/28/1994'"
|
|
print
|
|
pgcnx.query("""UPDATE weather
|
|
SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2
|
|
WHERE date > '11/28/1994'""")
|
|
print
|
|
print "SELECT * from weather"
|
|
print pgcnx.query("SELECT * from weather")
|
|
|
|
# data deletion commands
|
|
def delete_data(pgcnx):
|
|
print "-----------------------------"
|
|
print "-- Deleting data:"
|
|
print "-- a DELETE statement is used for deleting rows from a "
|
|
print "-- table."
|
|
print "-----------------------------"
|
|
print
|
|
print "-- suppose you are no longer interested in the weather of "
|
|
print "-- Hayward, you can do the following to delete those rows from"
|
|
print "-- the table"
|
|
print
|
|
print "DELETE FROM weather WHERE city = 'Hayward'"
|
|
pgcnx.query("DELETE FROM weather WHERE city = 'Hayward'")
|
|
print
|
|
print "SELECT * from weather"
|
|
print
|
|
print pgcnx.query("SELECT * from weather")
|
|
print
|
|
print "-- you can also delete all the rows in a table by doing the "
|
|
print "-- following. (This is different from DROP TABLE which removes "
|
|
print "-- the table in addition to the removing the rows.)"
|
|
print
|
|
print "DELETE FROM weather"
|
|
pgcnx.query("DELETE FROM weather")
|
|
print
|
|
print "SELECT * from weather"
|
|
print pgcnx.query("SELECT * from weather")
|
|
|
|
# table removal commands
|
|
def remove_table(pgcnx):
|
|
print "-----------------------------"
|
|
print "-- Removing the tables:"
|
|
print "-- DROP TABLE is used to remove tables. After you have"
|
|
print "-- done this, you can no longer use those tables."
|
|
print "-----------------------------"
|
|
print
|
|
print "DROP TABLE weather, cities, temptab"
|
|
pgcnx.query("DROP TABLE weather, cities, temptab")
|
|
|
|
# main demo function
|
|
def demo(pgcnx):
|
|
create_table(pgcnx)
|
|
wait_key()
|
|
insert_data(pgcnx)
|
|
wait_key()
|
|
select_data1(pgcnx)
|
|
select_data2(pgcnx)
|
|
create_aggregate(pgcnx)
|
|
join_table(pgcnx)
|
|
update_data(pgcnx)
|
|
delete_data(pgcnx)
|
|
remove_table(pgcnx)
|