sql数据库语法
https://www.w3school.com.cn/sql/index.asp
1. 数据定义语言 (DDL)
创建数据库和表
-- 创建数据库
CREATE DATABASE company;-- 使用数据库
USE company;-- 创建表
CREATE TABLE employees (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,age INT,department VARCHAR(50),salary DECIMAL(10,2),hire_date DATE
);-- 创建索引
CREATE INDEX idx_name ON employees(name);
CREATE INDEX idx_department ON employees(department);
修改表结构
-- 添加列
ALTER TABLE employees ADD COLUMN email VARCHAR(100);-- 修改列
ALTER TABLE employees MODIFY COLUMN name VARCHAR(100);-- 删除列
ALTER TABLE employees DROP COLUMN email;-- 重命名表
ALTER TABLE employees RENAME TO staff;
删除对象
-- 删除表
DROP TABLE employees;-- 删除数据库
DROP DATABASE company;-- 清空表数据
TRUNCATE TABLE employees;
2. 数据操作语言 (DML)
插入数据
-- 插入单条数据
INSERT INTO employees (name, age, department, salary, hire_date)
VALUES ('张三', 20, '技术部', 10000.00, '2025-10-20');-- 插入多条数据
INSERT INTO employees (name, age, department, salary, hire_date)
VALUES ('李四', 20, '销售部', 10000.00, '2025-10-20'),('王五', 20, '技术部', 10000.00, '2025-10-20'),('赵六', 20, '人事部', 10000.00, '2025-10-20');
更新数据
-- 更新特定记录
UPDATE employees
SET salary = 16000.00, department = '高级技术部'
WHERE name = '张三';-- 批量更新
UPDATE employees
SET salary = salary * 1.1
WHERE department = '技术部';
删除数据
-- 删除特定记录
DELETE FROM employees WHERE name = '赵六';-- 删除多条记录
DELETE FROM employees WHERE age > 60;-- 清空表(谨慎使用)
DELETE FROM employees;
3. 数据查询语言 (DQL)
-- 查询所有列
SELECT * FROM employees;-- 查询特定列
SELECT name, department, salary FROM employees;-- 条件查询
SELECT name, salary
FROM employees
WHERE salary > 12000 AND department = '技术部';-- 排序
SELECT name, salary
FROM employees
ORDER BY salary DESC, name ASC;-- 限制结果集
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 10;
-- 分组统计
SELECT department,COUNT(*) as 人数,AVG(salary) as 平均工资,MAX(salary) as 最高工资,MIN(salary) as 最低工资
FROM employees
GROUP BY department
HAVING AVG(salary) > 12000;-- 连接查询
SELECT e.name,e.salary,d.department_name,d.location
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;-- 子查询
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);-- 联合查询
SELECT name, salary FROM employees WHERE department = '技术部'
UNION
SELECT name, salary FROM contractors WHERE department = '技术部';
日期函数
SELECT name,hire_date,YEAR(hire_date) as 入职年份,MONTH(hire_date) as 入职月份,DATEDIFF(CURRENT_DATE, hire_date) as 入职天数,DATE_ADD(hire_date, INTERVAL 1 YEAR) as 转正日期
FROM employees;
在SQL中取日期字段的前10个字符进行比较,主要有以下几种方法:
-- 使用 SUBSTRING
SUBSTRING(CONVERT(VARCHAR(20), a.时间1, 120), 1, 10) = SUBSTRING(CONVERT(VARCHAR(20), b.时间2, 120), 1, 10)-- 使用 LEFT (更简洁)
LEFT(CONVERT(VARCHAR(10), a.时间1, 120), 10) = LEFT(CONVERT(VARCHAR(10),b.时间2, 120), 10)
更推荐的日期比较方法
-- 方法1: 转换为DATE类型
CAST(a.时间1 AS DATE) = CAST(b.时间2 AS DATE)-- 方法2: 使用CONVERT转为DATE
CONVERT(DATE, a.时间1) = CONVERT(DATE, b.时间2)-- 方法3: 使用DATEDIFF
DATEDIFF(DAY,a.时间1,b.时间2) = 0