建设一个充电站需要多少钱中铁建设集团有限公司什么级别
建设一个充电站需要多少钱,中铁建设集团有限公司什么级别,wordpress免费淘宝客主题,ps做网站宽度SQL#xff08;Structured Query Language#xff0c;结构化查询语言#xff09;是操作关系型数据库的核心工具#xff0c;无论是后端开发、数据分析、运维监控#xff0c;还是大数据处理#xff0c;SQL都是不可或缺的技能。从简单的“查询数据”到复杂的“多表关联分析”…SQLStructured Query Language结构化查询语言是操作关系型数据库的核心工具无论是后端开发、数据分析、运维监控还是大数据处理SQL都是不可或缺的技能。从简单的“查询数据”到复杂的“多表关联分析”SQL的语法体系既基础又灵活。本文将从**基础语法、进阶语法、常用函数、性能优化小贴士**四个维度结合实战案例详细讲解常见SQL语法覆盖MySQL、Oracle、SQL Server等主流数据库的通用用法帮你快速掌握SQL的核心应用。一、先搭个基础示例表结构为了让语法示例更易理解我们先定义三个常用的示例表后续案例均基于这三张表1. 学生表student字段名类型说明student_idINT学生ID主键student_nameVARCHAR(50)学生姓名ageINT年龄genderVARCHAR(10)性别class_idINT班级ID外键2. 班级表class字段名类型说明class_idINT班级ID主键class_nameVARCHAR(50)班级名称teacherVARCHAR(50)班主任3. 成绩表score字段名类型说明score_idINT成绩ID主键student_idINT学生ID外键course_nameVARCHAR(50)课程名称scoreDECIMAL(5,2)分数二、SQL基础语法数据库与表的核心操作SQL基础语法主要分为**DDL数据定义语言******和******DML数据操作语言**前者负责定义数据库/表结构后者负责操作数据。1. DDL数据库与表的定义创建/修改/删除1数据库操作-- 1. 创建数据库指定字符集避免中文乱码 CREATE DATABASE IF NOT EXISTS school_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 2. 使用数据库 USE school_db; -- 3. 删除数据库谨慎使用 DROP DATABASE IF EXISTS school_db;2表操作-- 1. 创建学生表含主键、数据类型、注释 CREATE TABLE IF NOT EXISTS student ( student_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 学生ID, student_name VARCHAR(50) NOT NULL COMMENT 学生姓名, age INT COMMENT 年龄, gender VARCHAR(10) COMMENT 性别, class_id INT COMMENT 班级ID, -- 外键关联班级表可选视业务场景而定 FOREIGN KEY (class_id) REFERENCES class(class_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT学生表; -- 2. 修改表结构添加字段、修改字段、删除字段 -- 添加字段新增手机号字段 ALTER TABLE student ADD COLUMN phone VARCHAR(20) COMMENT 手机号 AFTER age; -- 修改字段修改age字段类型为TINYINT ALTER TABLE student MODIFY COLUMN age TINYINT COMMENT 年龄; -- 删除字段删除手机号字段 ALTER TABLE student DROP COLUMN phone; -- 3. 删除表谨慎使用 DROP TABLE IF EXISTS student; -- 4. 清空表数据保留表结构自增主键重置 TRUNCATE TABLE student;2. DML数据的增删改查核心中的核心1插入数据INSERT-- 1. 插入单条数据指定字段 INSERT INTO student (student_name, age, gender, class_id) VALUES (张三, 18, 男, 1); -- 2. 插入多条数据批量插入效率更高 INSERT INTO student (student_name, age, gender, class_id) VALUES (李四, 19, 男, 1), (王五, 18, 女, 2), (赵六, 20, 男, 2); -- 3. 从其他表插入数据将查询结果插入表中 INSERT INTO student_backup (student_id, student_name, age) SELECT student_id, student_name, age FROM student WHERE gender 女;2查询数据SELECTSELECT是SQL中使用最频繁的语法基础用法如下-- 1. 查询所有字段不推荐性能差仅测试用 SELECT * FROM student; -- 2. 查询指定字段 SELECT student_id, student_name, age FROM student; -- 3. 带条件查询WHERE子句 SELECT student_name, age FROM student WHERE gender 男 AND age 18; -- 4. 去重查询DISTINCT SELECT DISTINCT class_id FROM student; -- 5. 别名AS可省略给字段/表起别名简化代码 SELECT s.student_id AS id, s.student_name AS name FROM student s;3更新数据UPDATE-- 修改单条数据必须加WHERE条件否则修改全表 UPDATE student SET age 20, class_id 3 WHERE student_id 1; -- 批量修改数据 UPDATE student SET class_id 2 WHERE gender 女;4删除数据DELETE-- 删除单条数据必须加WHERE条件否则删除全表 DELETE FROM student WHERE student_id 1; -- 批量删除数据 DELETE FROM student WHERE class_id 3;三、SQL进阶语法解锁复杂数据操作基础语法只能处理单表数据而实际业务中往往需要多表关联、数据聚合、分页等复杂操作这就需要用到进阶语法。1. 联表查询多表数据关联JOIN联表查询是进阶语法的核心主要分为**内连接、左连接、右连接、全连接**四种其中内连接和左连接最常用。1内连接INNER JOIN只返回两表匹配的数据-- 查询学生姓名及其所属班级名称仅显示有班级的学生 SELECT s.student_name, c.class_name FROM student s INNER JOIN class c ON s.class_id c.class_id;2左连接LEFT JOIN返回左表所有数据右表匹配不到则为NULL-- 查询所有学生姓名及其所属班级名称无班级的学生也显示班级名称为NULL SELECT s.student_name, c.class_name FROM student s LEFT JOIN class c ON s.class_id c.class_id;3右连接RIGHT JOIN返回右表所有数据左表匹配不到则为NULL-- 查询所有班级名称及其对应的学生姓名无学生的班级也显示学生姓名为NULL SELECT s.student_name, c.class_name FROM student s RIGHT JOIN class c ON s.class_id c.class_id;4全连接FULL JOIN返回两表所有数据匹配不到则为NULL注意MySQL不支持直接使用FULL JOIN可通过UNION组合左连接和右连接实现Oracle、SQL Server支持FULL JOIN。-- MySQL实现全连接 SELECT s.student_name, c.class_name FROM student s LEFT JOIN class c ON s.class_id c.class_id UNION SELECT s.student_name, c.class_name FROM student s RIGHT JOIN class c ON s.class_id c.class_id;2. 子查询嵌套在主查询中的查询语句子查询是将一个查询结果作为另一个查询的条件或数据源分为**标量子查询、列子查询、表子查询**。1标量子查询返回单个值一行一列-- 查询与张三同班级的学生先查张三的班级ID再查该班级的学生 SELECT student_name FROM student WHERE class_id (SELECT class_id FROM student WHERE student_name 张三);2列子查询返回一列数据多行一列使用IN/ANY/ALL-- 查询班级1或班级2的学生返回多个class_id SELECT student_name FROM student WHERE class_id IN (SELECT class_id FROM class WHERE class_name IN (一班, 二班));3表子查询返回多行多列作为临时表-- 查询成绩大于80分的学生姓名先查成绩表的学生ID再关联学生表 SELECT s.student_name FROM student s INNER JOIN (SELECT student_id FROM score WHERE score 80) sc ON s.student_id sc.student_id;3. 分组与聚合数据统计分析GROUP BY 聚合函数GROUP BY用于将数据按指定字段分组结合聚合函数如COUNT、SUM、AVG实现数据统计。-- 1. 统计每个班级的学生人数 SELECT c.class_name, COUNT(s.student_id) AS student_count FROM class c LEFT JOIN student s ON c.class_id s.class_id GROUP BY c.class_name; -- 2. 统计每个学生的总成绩 SELECT s.student_name, SUM(sc.score) AS total_score FROM student s LEFT JOIN score sc ON s.student_id sc.student_id GROUP BY s.student_name; -- 3. 分组后过滤HAVING统计学生人数大于5的班级 -- 注意HAVING用于分组后过滤WHERE用于分组前过滤 SELECT c.class_name, COUNT(s.student_id) AS student_count FROM class c LEFT JOIN student s ON c.class_id s.class_id GROUP BY c.class_name HAVING student_count 5;4. 排序与分页控制数据展示顺序和数量1排序ORDER BY默认升序ASC降序用DESC-- 按年龄降序、姓名升序排序 SELECT student_name, age FROM student ORDER BY age DESC, student_name ASC;2分页不同数据库语法不同是业务中必用的语法如列表页展示-- MySQLLIMIT 偏移量, 每页条数偏移量从0开始 -- 示例查询第2页数据每页10条 SELECT student_name, age FROM student ORDER BY student_id LIMIT 10, 10; -- OracleROWNUM 子查询 SELECT * FROM ( SELECT s.*, ROWNUM rn FROM student s ORDER BY student_id ) WHERE rn BETWEEN 11 AND 20; -- SQL ServerOFFSET FETCH SELECT student_name, age FROM student ORDER BY student_id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;四、SQL常用函数提升数据处理效率SQL提供了丰富的内置函数涵盖字符串、数值、日期、聚合等类型以下是最常用的函数示例。1. 字符串函数-- 1. 长度LENGTHMySQL/ LENSQL Server SELECT LENGTH(student_name) AS name_length FROM student; -- 2. 拼接CONCATMySQL/ SQL Server/ ||Oracle SELECT CONCAT(student_name, -, gender) AS name_gender FROM student; -- 3. 大小写转换UPPER大写/ LOWER小写 SELECT UPPER(student_name) AS upper_name FROM student; -- 4. 截取字符串SUBSTRING通用 SELECT SUBSTRING(student_name, 1, 1) AS first_char FROM student; -- 截取第一个字符2. 数值函数-- 1. 四舍五入ROUND SELECT ROUND(score, 1) AS round_score FROM score; -- 保留1位小数 -- 2. 取整CEIL向上取整/ FLOOR向下取整 SELECT CEIL(score) AS ceil_score, FLOOR(score) AS floor_score FROM score; -- 3. 求和/平均值/最大值/最小值SUM/AVG/MAX/MIN聚合函数 SELECT SUM(score) AS total, AVG(score) AS avg, MAX(score) AS max, MIN(score) AS min FROM score;3. 日期函数日期函数是处理时间数据的核心不同数据库语法略有差异以下是MySQL的常用示例-- 1. 获取当前时间NOW()日期时间/ CURDATE()仅日期/ CURTIME()仅时间 SELECT NOW(), CURDATE(), CURTIME(); -- 2. 日期格式化DATE_FORMAT SELECT DATE_FORMAT(NOW(), %Y-%m-%d %H:%i:%s) AS format_time; -- 3. 日期加减DATE_ADD/DATE_SUB SELECT DATE_ADD(NOW(), INTERVAL 7 DAY) AS next_week; -- 7天后 SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH) AS last_month; -- 1个月前 -- 4. 提取日期部分YEAR/MONTH/DAY/HOUR SELECT YEAR(NOW()) AS year, MONTH(NOW()) AS month, DAY(NOW()) AS day;五、SQL语法性能优化小贴士掌握语法的同时也要注意性能优化避免写出“慢SQL”。以下是几个实用的优化技巧1. 避免使用SELECT *只查询需要的字段SELECT *会查询所有字段不仅增加网络传输量还会导致无法使用覆盖索引严重影响性能。2. 给查询条件字段加索引索引是提升查询速度的关键给WHERE、JOIN、ORDER BY等子句中的字段添加索引如主键索引、普通索引、联合索引。-- 给student表的class_id字段添加普通索引 CREATE INDEX idx_student_class_id ON student(class_id);3. 尽量使用WHERE代替HAVINGWHERE在分组前过滤数据HAVING在分组后过滤数据使用WHERE可以减少分组的数据量提升性能。4. 批量操作数据批量插入/更新数据比单条操作效率高得多尽量使用INSERT INTO ... VALUES (...), (...)的批量语法。5. 避免在WHERE子句中使用函数或运算在WHERE子句中对字段使用函数或运算会导致索引失效例如-- 错误索引失效 SELECT * FROM student WHERE YEAR(birthday) 2000; -- 正确改写为范围查询使用索引 SELECT * FROM student WHERE birthday 2000-01-01 AND birthday 2000-12-31;六、实战案例综合运用SQL语法最后我们通过一个综合案例将上述语法串联起来加深理解需求查询每个班级的“数学”课程平均分且平均分大于80分按平均分降序排列SELECT c.class_name, AVG(sc.score) AS avg_math_score FROM class c LEFT JOIN student s ON c.class_id s.class_id LEFT JOIN score sc ON s.student_id sc.student_id WHERE sc.course_name 数学 GROUP BY c.class_name HAVING avg_math_score 80 ORDER BY avg_math_score DESC;七、总结SQL的语法体系看似繁杂但核心逻辑是**“数据定义→数据操作→数据统计”**。对于初学者先掌握基础的增删改查和联表查询再逐步学习聚合函数、子查询等进阶语法对于资深开发者重点在于结合业务场景优化SQL性能写出高效、可维护的代码。记住SQL是一门“熟能生巧”的技能多写、多练、多分析慢查询才能真正掌握它。希望本文的语法解析和实战案例能帮你夯实SQL基础应对日常开发和数据分析的需求。