PostgreSQL查询语法的基础教程与示例
查询所有列
SELECT * FROM employees;
查询特定列
SELECT first_name, last_name, salary FROM employees;
使用别名
SELECT first_name AS name, last_name AS surname FROM employees;
基本比较操作符
SELECT * FROM employees WHERE salary > 5000;
SELECT * FROM products WHERE price BETWEEN 10 AND 20;
SELECT * FROM customers WHERE country IN ('USA', 'Canada', 'UK');
模糊匹配
SELECT * FROM employees WHERE last_name LIKE 'S%';
SELECT * FROM products WHERE description LIKE '%organic%';
NULL值处理
SELECT * FROM employees WHERE manager_id IS NULL;
SELECT * FROM orders WHERE shipping_date IS NOT NULL;
ORDER BY语句
SELECT * FROM employees ORDER BY salary DESC;
SELECT * FROM products ORDER BY category ASC, price DESC;
LIMIT和OFFSET
SELECT * FROM employees ORDER BY salary DESC LIMIT 10;
SELECT * FROM employees ORDER BY hire_date LIMIT 5 OFFSET 10;
常用聚合函数
SELECT COUNT(*) FROM employees;
SELECT AVG(salary) FROM employees;
SELECT MAX(price), MIN(price) FROM products;
SELECT SUM(amount) FROM orders;
GROUP BY分组
SELECT department_id, COUNT(*) FROM employees GROUP BY department_id;
SELECT category, AVG(price) AS avg_price FROM products GROUP BY category;
HAVING过滤分组
SELECT department_id, AVG(salary) FROM employees
GROUP BY department_id HAVING AVG(salary) > 5000;
表连接
SELECT e.first_name, e.last_name, d.name AS department
FROM employees e
JOIN departments d ON e.department_id = d.id;
不同类型的连接
-- 内连接(INNER JOIN)
SELECT c.name, o.order_date
FROM customers c
INNER JOIN orders o ON c.id = o.customer_id;
-- 左连接(LEFT JOIN)
SELECT c.name, o.order_date
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id;
-- 右连接(RIGHT JOIN)
SELECT e.first_name, d.name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.id;
JSON操作
SELECT data->>'name' AS customer_name
FROM orders WHERE data->>'status' = 'delivered';
数组操作
SELECT * FROM products WHERE tags @> ARRAY['organic'];
SELECT ARRAY_LENGTH(phone_numbers, 1) FROM contacts;
文本搜索
SELECT * FROM articles
WHERE to_tsvector('english', content) @@ to_tsquery('postgresql & tutorial');
字符串函数
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;
SELECT UPPER(name) FROM products;
SELECT LENGTH(description) FROM products;
日期函数
SELECT NOW();
SELECT DATE_TRUNC('month', order_date) AS month, COUNT(*)
FROM orders GROUP BY month;
SELECT AGE(NOW(), hire_date) FROM employees;
基本事务
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
保存点
BEGIN;
INSERT INTO orders (customer_id, amount) VALUES (1, 100);
SAVEPOINT after_order;
INSERT INTO order_items (order_id, product_id, quantity) VALUES (1, 1, 2);
ROLLBACK TO after_order;
COMMIT;
索引使用
CREATE INDEX idx_employees_last_name ON employees (last_name);
EXPLAIN ANALYZE SELECT * FROM employees WHERE last_name = 'Smith';
查询计划分析
EXPLAIN ANALYZE
SELECT c.name, COUNT(o.id)
FROM customers c
JOIN orders o ON c.id = o.customer_id
GROUP BY c.name;