一、DDL语句
DDL表操作语句
查看指定表的建表语句:
show create table 表名
重命名表:
rename table old_table_name to new_table_name;
添加表字段:
alter table 表名 add 字段名 类型(长度) comment 注释
修改表字段:
alter table 表名 modify 旧字段名 新字段名
删除表字段:
alter table 表名 drop 字段名
创建索引:
create index index_name on table_name(column_name)
删除索引:
drop index index_name on table_name;
二、常用SQL语法
order by 语句
在 ORDER BY 中,可以使用聚合函数(如 COUNT, SUM)或在 SELECT 中定义的列。如果使用非聚合列,确保它们在 GROUP BY 中列出。
SELECT product_name, SUM(quantity) AS total_quantity
FROM sales
GROUP BY product_name
ORDER BY total_quantity DESC;
group by having语句(分组条件查询)
HAVING 子句中的查询条件必须使用在 SELECT 查询范围
SELECT product_name, COUNT(*) AS sales_count
FROM sales
GROUP BY product_name
HAVING COUNT(*) > 2; -- 聚合条件
case语句
SELECT name, score,
CASE
WHEN score >= 90 THEN '优秀'
WHEN score >= 75 THEN '良好'
ELSE '及格'
END AS grade
FROM students;
关联表查询
left join、right join、inner join
特性 | LEFT JOIN | RIGHT JOIN | INNER JOIN |
结果集包含 | 左表(左侧)所有记录 + 右表(右侧)匹配记录 | 右表(右侧)所有记录 + 左表(左侧)匹配记录 | 只有两个表中匹配的记录 |
不匹配记录处理 | 右表不匹配的记录显示为 NULL | 左表不匹配的记录显示为 NULL | 不包括任何不匹配的记录 |
使用场景 | 需要保留左表所有数据,查看右表相关信息 | 需要保留右表所有数据,查看左表相关信息 | 只关心两个表中匹配的记录 |
语法示例 | sql SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id; | sql SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id; | sql SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id; |
SELECT employees.name, departments.department_name
FROM employees
INNER JOIN departments ON employees.id = departments.id;
子查询
当外部查询需要依赖于某个特定值的结果时(需要通过处理的特定值)可以使用子查询
SELECT *
FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE department_name = 'HR');
三、SQL执行顺序
在MySQL中,SQL语句的执行顺序通常为:
(1)FROM:确定数据源和表。
(2)JOIN:执行连接操作(如INNER JOIN、LEFT JOIN等)。
(3)WHERE:过滤符合条件的记录。
(4)GROUP BY:对结果进行分组。
(5)HAVING:过滤分组后的结果。
(6)SELECT:选择要返回的列。
(7)DISTINCT:去重结果。
(8)ORDER BY:对结果排序。
(9)LIMIT:限制返回的记录数量。
sql示例
SELECT
department_id,
AVG(salary) AS average_salary
FROM
employees
JOIN
departments ON employees.department_id = departments.id
WHERE
employees.status = 'active'
GROUP BY
department_id
HAVING
AVG(salary) > 50000
ORDER BY
average_salary DESC
LIMIT 10;
感兴趣的可以留言,上述sql的执行顺序是什么?