1 连接
psql -h localhost -p 5432 -U postgres
2 数据库
创建数据库: create databse xxx;
删除数据库: drop databse xxx;
查看数据库: \l
选择数据库: \c xxx;
创建schema: create schema yyy;
删除schema: drop schema yyy;
创建数据表:
CREATE TABLE learn.student(
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
age INT NOT NULL,
address CHAR(50),
salary REAL
);
删除数据表: drop table zzz;
查看全部数据表: \d
查看某个数据表信息: \d zzz;
导入sql文件:\i nnn.sql;
3 数据库操作
3.1 增
全部column信息一次性增加:insert into student values ()
部分column信息增加:inset into student (c1, c2) values (v1, v2)
3.2 删
delete from learn.student where id=1
3.3 改
update learn.student set name=’john’ where id=1;
3.4 查
select * from learn.student where id=1;
3.5 AND OR
select * from learn.student where name=’john’ and address=’beijing’;
select * from learn.student where name=’john’ or address=’tianjing’;
3.6 LIKE
select * from learn.student where name like ‘to%’;
%: 占位多个字符
_: 占位一个字符
3.7 LIMIT
select * from learn.student limit 1;
3.8 ORDER BY
select * from learn.student order by salary asc; 升序
select * from learn.student order by salary desc; 降序
3.9 GROUP BY
GROUP BY需要接查询函数一起使用。
select name, sum(salary) from learn.student group by name;
3.10 HAVING
HAVING在GROUP BY之后接条件
select name, sum(salary) from learn.student group by name having sum(salary)>5000 order by sum(salary) asc;
4 数据库高级操作
4.1 约束
4.2 JOIN
cross join : left table x * right table y = x*y
inner join: 保留left和right表的公共value。
left join: 保留left表的value,缺失的right表数据使用none填充。
right join: 保留right表的value,缺失的left表数据使用none填充。
outer join: 保留left和right表column交集和两表公共value(缺失使用none填充)
练习:
创建company表:
DROP TABLE learn.COMPANY;
CREATE TABLE learn.COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
INSERT INTO learn.COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );
INSERT INTO learn.COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Allen', 25, 'Texas', 15000.00 );
INSERT INTO learn.COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );
INSERT INTO learn.COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );
INSERT INTO learn.COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'David', 27, 'Texas', 85000.00 );
INSERT INTO learn.COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Kim', 22, 'South-Hall', 45000.00 );
INSERT INTO learn.COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00 );
创建department表
DROP TABLE learn.DEPARTMENT;
CREATE TABLE learn.DEPARTMENT(
ID INT PRIMARY KEY NOT NULL,
DEPT CHAR(50) NOT NULL,
EMP_ID INT NOT NULL
);
INSERT INTO learn.DEPARTMENT (ID, DEPT, EMP_ID) VALUES (1, 'IT Billing', 1 );
INSERT INTO learn.DEPARTMENT (ID, DEPT, EMP_ID) VALUES (2, 'Engineering', 2 );
INSERT INTO learn.DEPARTMENT (ID, DEPT, EMP_ID) VALUES (3, 'Finance', 7 );
inner join:
crabboss=# select emp_id, name, age, dept from learn.company as a inner join learn.department as b on a.id=b.emp_id;
emp_id | name | age | dept
--------+-------+-----+----------------------------------------------------
1 | Paul | 32 | IT Billing
2 | Allen | 25 | Engineering
7 | James | 24 | Finance
left join:
crabboss=# select emp_id, name, age, dept from learn.company as a left join learn.department as b on a.id=b.emp_id;
emp_id | name | age | dept
--------+-------+-----+----------------------------------------------------
1 | Paul | 32 | IT Billing
2 | Allen | 25 | Engineering
7 | James | 24 | Finance
| David | 27 |
| Kim | 22 |
| Mark | 25 |
| Teddy | 23 |
right join:
crabboss=# select emp_id, name, age, dept from learn.company as a right join learn.department as b on a.id=b.emp_id;
emp_id | name | age | dept
--------+-------+-----+----------------------------------------------------
1 | Paul | 32 | IT Billing
2 | Allen | 25 | Engineering
7 | James | 24 | Finance
outer join:
crabboss=# select emp_id, name, age, dept from learn.company as a full outer join learn.department as b on a.id=b.emp_id;
emp_id | name | age | dept
--------+-------+-----+----------------------------------------------------
1 | Paul | 32 | IT Billing
2 | Allen | 25 | Engineering
7 | James | 24 | Finance
| David | 27 |
| Kim | 22 |
| Mark | 25 |
| Teddy | 23 |
4.3 UNION
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
UNION
SELECT column1 [, column2 ]
FROM table2 [, table2 ]
[WHERE condition]
UNION ALL允许重复行出现
练习:
union:
crabboss=# select emp_id, name, age, dept from learn.company as a inner join learn.department as b on a.id=b.emp_id union select emp_id, name, age, dept from learn.company as a left join learn.department as b on a.id=b.emp_id;
emp_id | name | age | dept
--------+-------+-----+----------------------------------------------------
| David | 27 |
| Mark | 25 |
1 | Paul | 32 | IT Billing
| Teddy | 23 |
2 | Allen | 25 | Engineering
7 | James | 24 | Finance
| Kim | 22 |
union all:
crabboss=# select emp_id, name, age, dept from learn.company as a inner join learn.department as b on a.id=b.emp_id union all select emp_id, name, age, dept from learn.company as a left join learn.department as b on a.id=b.emp_id;
emp_id | name | age | dept
--------+-------+-----+----------------------------------------------------
1 | Paul | 32 | IT Billing
2 | Allen | 25 | Engineering
7 | James | 24 | Finance
1 | Paul | 32 | IT Billing
2 | Allen | 25 | Engineering
7 | James | 24 | Finance
| David | 27 |
| Kim | 22 |
| Mark | 25 |
| Teddy | 23 |