SELECT column1, column2, ... FROM table_name WHEREcondition;
查询所有列:
1
SELECT*FROM employees;
条件查询:
1
SELECT*FROM employees WHERE salary >5000;
排序:
1
SELECT*FROM employees ORDERBY salary DESC;
分页查询:
1 2 3 4 5 6
-- MySQL SELECT*FROM employees LIMIT 10OFFSET20; -- SQL Server SELECT*FROM employees ORDERBY id OFFSET20ROWSFETCH NEXT 10ROWSONLY; -- Oracle SELECT*FROM employees WHERE ROWNUM BETWEEN21AND30;
INSERT 插入数据
基本语法:
1 2
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
CREATE TABLE employees ( id INTPRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, department VARCHAR(50), salary DECIMAL(10, 2), hire_date DATE, CONSTRAINT uk_emp_name UNIQUE (name) );
ALTER TABLE 修改表
添加列:
1
ALTER TABLE employees ADDCOLUMN email VARCHAR(100);
修改列:
1 2 3
ALTER TABLE employees MODIFY COLUMN department VARCHAR(100); -- SQL Server ALTER TABLE employees ALTERCOLUMN department VARCHAR(100);
删除列:
1
ALTER TABLE employees DROPCOLUMN email;
高级查询
聚合函数
常用聚合函数:
1 2 3 4 5 6 7 8 9 10
-- 计数 SELECTCOUNT(*) FROM employees; -- 求和 SELECTSUM(salary) FROM employees; -- 平均值 SELECTAVG(salary) FROM employees; -- 最大值 SELECTMAX(salary) FROM employees; -- 最小值 SELECTMIN(salary) FROM employees;
分组统计:
1 2 3 4 5
SELECT department, COUNT(*) as emp_count, AVG(salary) as avg_salary FROM employees GROUPBY department HAVINGCOUNT(*) >5 ORDERBY avg_salary DESC;
连接查询
内连接:
1 2 3
SELECT e.name, d.department_name FROM employees e INNERJOIN departments d ON e.department_id = d.id;
左连接:
1 2 3
SELECT e.name, d.department_name FROM employees e LEFTJOIN departments d ON e.department_id = d.id;
右连接:
1 2 3
SELECT e.name, d.department_name FROM employees e RIGHTJOIN departments d ON e.department_id = d.id;
全连接:
1 2 3 4 5 6 7 8 9
-- MySQL不支持FULL JOIN,可以通过UNION实现 SELECT e.name, d.department_name FROM employees e LEFTJOIN departments d ON e.department_id = d.id UNION SELECT e.name, d.department_name FROM employees e RIGHTJOIN departments d ON e.department_id = d.id WHERE e.id ISNULL;
子查询
WHERE子句中的子查询:
1 2 3
SELECT name, salary FROM employees WHERE salary > (SELECTAVG(salary) FROM employees);
FROM子句中的子查询:
1 2 3 4 5 6 7
SELECT dept_name, avg_salary FROM ( SELECT department as dept_name, AVG(salary) as avg_salary FROM employees GROUPBY department ) AS dept_stats WHERE avg_salary >8000;
EXISTS子查询:
1 2 3 4 5 6
SELECT name FROM departments d WHEREEXISTS ( SELECT1FROM employees e WHERE e.department_id = d.id AND e.salary >10000 );
常用函数
字符串函数:
1 2 3 4 5 6 7 8
-- 字符串连接 SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees; -- 截取子串 SELECTSUBSTRING(name, 1, 3) FROM employees; -- 转换大小写 SELECTUPPER(name), LOWER(email) FROM employees; -- 替换 SELECT REPLACE(description, '旧文本', '新文本') FROM products;
日期函数:
1 2 3 4 5 6 7 8 9 10
-- 当前日期 SELECTCURRENT_DATE(); -- 当前时间戳 SELECTCURRENT_TIMESTAMP(); -- 日期加减 SELECT DATE_ADD(hire_date, INTERVAL1YEAR) FROM employees; -- 日期差 SELECT DATEDIFF(CURRENT_DATE(), hire_date) AS days_employed FROM employees; -- 日期格式化 SELECT DATE_FORMAT(hire_date, '%Y年%m月%d日') FROM employees;
条件函数:
1 2 3 4 5 6 7 8 9 10 11 12
-- CASE表达式 SELECT name, CASE WHEN salary <5000THEN'低' WHEN salary BETWEEN5000AND10000THEN'中' ELSE'高' ENDAS salary_level FROM employees;
-- IF函数 SELECT name, IF(active =1, '在职', '离职') AS status FROM employees;
窗口函数
排名函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
-- ROW_NUMBER 唯一排名 SELECT name, salary, ROW_NUMBER() OVER(PARTITIONBY department ORDERBY salary DESC) AS rank FROM employees;
-- RANK 并列排名,跳过重复的名次 SELECT name, salary, RANK() OVER(ORDERBY salary DESC) AS rank FROM employees;
-- DENSE_RANK 并列排名,不跳过名次 SELECT name, salary, DENSE_RANK() OVER(ORDERBY salary DESC) AS rank FROM employees;
分析函数:
1 2 3 4 5 6 7 8 9
-- 累计求和 SELECT name, salary, SUM(salary) OVER(PARTITIONBY department ORDERBY hire_date) AS running_total FROM employees;
-- 移动平均 SELECTdate, sales, AVG(sales) OVER(ORDERBYdateROWSBETWEEN2 PRECEDING ANDCURRENTROW) AS moving_avg FROM daily_sales;
事务控制
事务基本操作:
1 2 3 4 5 6 7 8 9 10 11 12 13
-- 开始事务 BEGIN; -- 或 START TRANSACTION;
-- 执行SQL语句 UPDATE accounts SET balance = balance -100WHERE id =1; UPDATE accounts SET balance = balance +100WHERE id =2;
-- 提交事务 COMMIT; -- 或回滚事务 ROLLBACK;
事务隔离级别:
1 2
-- 设置隔离级别 SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
索引操作
创建索引:
1 2 3 4 5 6 7 8
-- 普通索引 CREATE INDEX idx_name ON employees(name);
-- 唯一索引 CREATEUNIQUE INDEX idx_email ON employees(email);
-- 复合索引 CREATE INDEX idx_dept_name ON employees(department, name);
删除索引:
1
DROP INDEX idx_name ON employees;
视图操作
创建视图:
1 2 3 4
CREATEVIEW employee_details AS SELECT e.id, e.name, d.department_name, e.salary FROM employees e JOIN departments d ON e.department_id = d.id;
修改视图:
1 2 3 4
ALTERVIEW employee_details AS SELECT e.id, e.name, d.department_name, e.salary, e.hire_date FROM employees e JOIN departments d ON e.department_id = d.id;