| COMP3311 20T3 | PostgreSQL | Database Systems |
Summary information about what PostgreSQL v12 provides.
In the examples below, x, y, s, etc. are attributes.
| Base Data Types | integer, float, char(N), varchar(N), text, date, time, timestamp |
| Domains | create domain Name as BaseType check Constraint; |
| Tuple Types | create type Name as (Attr1 Type1, ..., Attrn Typen); |
| Arithmetic | + - * / % | e.g. x + 3, x + y + z, y % 4 |
| Logic | and or not = <> | e.g. x > 5 and x < 10, z <> 'abc', x between 6 and 9 |
| String | || like ilike ~ ~* | e.g. s1 || s2, name like '%abc%' string literals: 'John''s book', e'hello\n' Note: double-quotes ("...") are not strings |
| NULL | is null, coalesce() | e.g. x is null, y is not null, note that x = null always fails, coalesce(x,y,99) value is first non-null or 99 |
| Feature | PostgreSQL |
| Case-insensitive SQL pattern matching | Attribute ilike Pattern |
| Regular expression pattern matching | Attribute ~ Pattern |
| String concatenation | String1 || String2 |
| String concatenation aggregrate | string_agg(TextAttribute[,Separator]) |
| Substring | substr(TextAttribute,Start,Length) |
| Aggregates | count(), min(), max(), avg(), sum() |
| Attribute | check, not null, unique | e.g. check (x >= 0), x not null, x unique |
| Foreign key | foreign key | foreign key (Attributes) references Table(Attributes) e.g. foreign key (x,y) references R(a,b) |
| Primary key | primary key | primary key (Attributes) e.g. primary key (x) implies x is not null & unique |
| Tables | create table Name (Attributes+Constraints); e.g. create table R ( s text primary key, x integer not null, y float check (y > 0), foreign key (x) references T(x) ); |
| Views | create or replace view Name(AttrNames) as SQL_Statement e.g. create or replace view Movies(id,title) as select mid, name from Titles where format = 'movie'; |
| Functions | create or replace function Name(Params) returns Type as $$ Body $$ language plpgsql e.g.
create or replace function
fac(n integer) returns integer
as $$
declare
prod integer := 1;
i integer;
begin
if (n < 1) then
return 0;
end if;
i := 1;
while (i <= n) loop
prod := prod * i;
i := i + 1;
end loop;
return prod;
end;
$$ language plpgsql;
|
| Functions returning tables | create or replace function Name(Params) returns setof Type as $$ Body $$ language plpgsql; e.g.
create type Results as (x integer, y integer);
create or replace function
pairs(_n integer) returns setof Results
as $$
declare
tup record;
begin
for tup in
select x, y from R limit _n
loop
return next tup;
end loop;
end;
$$ language plpgsql;
|
| Domains | create domain Name as DataType Constraint e.g.
create domain PosInt as integer check (value > 0);
create domain CourseCode as char(8)
check value ~ '[A-Z]{4}[0-9]{4}';
|
| Aggregates | create aggregate Name ( basetype = TypeOfValuesBeingAggregated, initcond = InitialValueOfState, sfunc = StateTransitionFunction, stype = StateType, [ finalfunc = FinalisationFunction ] ); e.g.
create function
add(x integer, y integer) returns integer
as $$
begin return x+y; end;
$$ language plpgsql;
create aggregate mySum (
basetype = integer
stype = integer,
initcond = 0,
sfunc = add
);
|
| Enums | create type Name as enum (Values); e.g.
create type Rainbow as enum
('red', 'orange', 'yellow', 'green', 'blue', 'purple');
|
| General format | select Expressions as Names
from Table1
join Table2 on JoinCondition1
...
join Tablen on JoinConditionn-1
where Condition
group by Attributes
having Condition
order by Attributes
|
| Examples | -- assume schema: R(x,y,z), S(a,b) -- show all info from table R select * from R; -- show unique x values from table R select distinct x from R; -- show unique x values from table R select * from R join S on R.x = S.a where R.y > 5; -- how many of each x value select x, count(*) from R group by x; -- how many of each common x value select x, count(*) from R group by x having count(*) > 10; -- how many of each R.x value is -- associated with an S.a value; -- if no associated S.a value, count = 0 select x, count(a) from R left outer join S on R.x = S.a group by x; |
| Getting a list of databases | psql -l |
| Connect to a database to ask SQL queries | psql DatabaseName |
| Create a database | createdb DatabaseName |
| Remove a database | dropdb DatabaseName |
| Command | PostgreSQL |
| Exit the SQL shell | \q |
| Get a list of tables/views in a database | \d |
| Execute an SQL statement | select * from TableName; |
| Excecute SQL commands from a file | \i FileName |
| Edit a file and reload | \ef FileName |
| Go to previous command | Up-arrow |
| Create a view | create or replace V(a,b,c) as select x,y,z ... |
| Temporary tables via WITH | with tab as (select...) ... |
| Union, Intersect, Difference | (SelectStatement1) union (SelectStatement2) or SelectStatement1 union SelectStatement2 |