当前位置: 首页 > news >正文

mysql 进阶语法 新手必看

数据库关系模型实现示例

一对多关系实现

部门表(主表)和员工表(从表)的创建:

CREATE TABLE dept ( dept_id INT PRIMARY KEY, dept_name VARCHAR(20) ); CREATE TABLE emp ( emp_id INT PRIMARY KEY, emp_name VARCHAR(20), dept_id INT, CONSTRAINT emp_connect FOREIGN KEY (dept_id) REFERENCES dept(dept_id) );

插入测试数据:

INSERT INTO dept VALUES (1001, '研发部'), (1002, '销售部'), (1003, '财务部'), (1004, '后勤部'); INSERT INTO emp VALUES (1, '张三', 1001), (2, '李四', 1001), (3, '王五', 1002);

查询结果示例:

dept表数据: +---------+-----------+ | dept_id | dept_name | +---------+-----------+ | 1001 | 研发部 | | 1002 | 销售部 | | 1003 | 财务部 | | 1004 | 后勤部 | +---------+-----------+ emp表数据: +--------+----------+---------+ | emp_id | emp_name | dept_id | +--------+----------+---------+ | 1 | 张三 | 1001 | | 2 | 李四 | 1001 | | 3 | 王五 | 1002 | +--------+----------+---------+
多对多关系实现

学生表、课程表和中间关系表的创建:

CREATE TABLE student( sid INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(10), gender VARCHAR(10) ); CREATE TABLE class( cid INT PRIMARY KEY AUTO_INCREMENT, cname VARCHAR(20) ); CREATE TABLE stu_class( sid INT, cid INT, score DOUBLE, CONSTRAINT fk_stu_class_sid FOREIGN KEY (sid) REFERENCES student(sid), CONSTRAINT fk_stu_class_cid FOREIGN KEY (cid) REFERENCES class(cid) );

插入测试数据:

INSERT INTO student VALUES (1, '张三', '男'), (2, '李四', '女'), (3, '王五', '男'); INSERT INTO class VALUES (101, 'Java编程'), (102, 'MySQL数据库'), (103, 'Web前端'); INSERT INTO stu_class VALUES (1, 101, 90), (1, 102, 85), (2, 102, 88);

多表关联查询示例:

SELECT s.name, c.cname, sc.score FROM student s JOIN stu_class sc ON s.sid = sc.sid JOIN class c ON sc.cid = c.cid;

查询结果:

+------+--------------+-------+ | name | cname | score | +------+--------------+-------+ | 张三 | Java编程 | 90 | | 张三 | MySQL数据库 | 85 | | 李四 | MySQL数据库 | 88 | +------+--------------+-------+
连接查询示例

隐式内连接(SQL92标准):

SELECT e.emp_name, d.dept_name FROM emp e, dept d WHERE e.dept_id = d.dept_id;

显式内连接(SQL99标准):

SELECT e.emp_name, d.dept_name FROM emp e INNER JOIN dept d ON e.dept_id = d.dept_id;

左外连接查询:

SELECT s.name, IFNULL(c.cname, '未选课') AS course FROM student s LEFT JOIN stu_class sc ON s.sid = sc.sid LEFT JOIN class c ON sc.cid = c.cid;
分组统计示例

统计各部门人数:

SELECT d.dept_name, COUNT(e.emp_id) AS emp_count FROM dept d LEFT JOIN emp e ON d.dept_id = e.dept_id GROUP BY d.dept_id;

统计学生选课情况:

SELECT s.name, COUNT(sc.cid) AS course_count, AVG(sc.score) AS avg_score FROM student s LEFT JOIN stu_class sc ON s.sid = sc.sid GROUP BY s.sid;
外键约束验证

尝试插入非法数据:

-- 会失败,因为dept_id 1005不存在 INSERT INTO emp VALUES (10, '测试', 1005);

错误信息:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
约束管理

删除外键约束:

ALTER TABLE emp DROP FOREIGN KEY emp_connect;

添加外键约束:

ALTER TABLE emp ADD CONSTRAINT emp_connect FOREIGN KEY (dept_id) REFERENCES dept(dept_id);

SQL JOIN 操作总结

左外连接 (LEFT OUTER JOIN)

左外连接返回左表的所有记录,无论右表是否有匹配的记录。如果右表没有匹配的记录,结果中右表的列将显示为 NULL。

SELECT * FROM dept d LEFT OUTER JOIN emp e ON d.dept_id = e.dept_id;

结果示例:

dept_id | dept_name | emp_id | emp_name | ... --------+-----------+--------+----------+----- 1 | HR | 101 | Alice | ... 2 | IT | 102 | Bob | ... 3 | Finance | NULL | NULL | ...
多表左外连接

可以连续使用左外连接关联多个表,语法如下:

SELECT * FROM A LEFT JOIN B ON A.id = B.a_id LEFT JOIN C ON A.id = C.a_id LEFT JOIN D ON A.id = D.a_id LEFT JOIN E ON A.id = E.a_id;

结果示例:

A.id | A.name | B.value | C.value | D.value | E.value -----+--------+---------+---------+---------+--------- 1 | Test1 | Val1 | Val2 | Val3 | Val4 2 | Test2 | NULL | Val5 | NULL | Val6
右外连接 (RIGHT OUTER JOIN)

右外连接返回右表的所有记录,无论左表是否有匹配的记录。如果左表没有匹配的记录,结果中左表的列将显示为 NULL。

SELECT * FROM dept d RIGHT OUTER JOIN emp e ON e.dept_id = d.dept_id;

结果示例:

dept_id | dept_name | emp_id | emp_name | ... --------+-----------+--------+----------+----- 1 | HR | 101 | Alice | ... 2 | IT | 102 | Bob | ... NULL | NULL | 103 | Charlie | ...
全外连接 (UNION of LEFT and RIGHT JOIN)

SQL 标准中没有直接的全外连接语法,但可以通过左外连接和右外连接的 UNION 实现。

SELECT * FROM dept d LEFT OUTER JOIN emp e ON d.dept_id = e.dept_id UNION SELECT * FROM dept d RIGHT OUTER JOIN emp e ON e.dept_id = d.dept_id;

结果示例:

dept_id | dept_name | emp_id | emp_name | ... --------+-----------+--------+----------+----- 1 | HR | 101 | Alice | ... 2 | IT | 102 | Bob | ... 3 | Finance | NULL | NULL | ... NULL | NULL | 103 | Charlie | ...

关键点总结

  • 左外连接保留左表所有记录,右表无匹配时显示 NULL
  • 右外连接保留右表所有记录,左表无匹配时显示 NULL
  • 多表连接时,连接顺序会影响结果
  • UNION 操作可以合并两个查询结果,自动去除重复行
  • 全外连接可以通过 UNION 左外连接和右外连接实现
http://www.jsqmd.com/news/719699/

相关文章:

  • 2026年动态漫画制作软件有哪些值得关注的产品?(五大主流平台)
  • 超低功耗反向散射通信系统设计与实现
  • 前端人跟进 AI 时代:手把手本地部署一个 Ollama 本地 AI 助手,迈出 Agent 第一步
  • B站用户成分智能识别工具:深度解析与实战指南
  • 终极Windows系统优化指南:用Winhance让你的电脑重获新生
  • PyOneDark Qt Widgets Modern GUI:快速打造专业级深色主题界面的终极指南
  • 【MicroPython编程-ESP32篇:设备驱动】-GUVA-S12SD紫外线检测传感器驱动
  • WeChatMsg留痕:构建个人AI数据中心的年度记忆可视化平台
  • 3个Jasminum插件核心功能,让你的中文文献管理效率提升90%
  • Citra模拟器终极指南:在电脑上免费畅玩任天堂3DS游戏
  • 京东API批量操作优化:单次1000条限制的突破方案
  • 10分钟实战:用Auto-Video-Generator打造AI视频的完整解决方案
  • 培洋机械设备:青岛起重设备回收怎么联系 - LYL仔仔
  • 广州品冠装饰设计:广州市装饰工程施工公司 - LYL仔仔
  • 如何配置QLVideo的视频预览时间点和缩略图质量
  • 3步掌握微生物网络分析:microeco包快速构建生态关联网络指南
  • C++ -- 模板的声明和定义
  • 云南钢材采购必看:镀锌钢管方管大棚钢管钢结构加工品牌推荐榜 - 深度智识库
  • GetQzonehistory:3步永久保存QQ空间青春记忆的Python终极方案
  • 一线优选,支付宝立减金回收平台权威指南,助你高效盘活闲置! - 京顺回收
  • 【PHP 8.9命名空间隔离终极指南】:20年核心架构师亲授7大隔离陷阱与5步零兼容风险升级法
  • 微信机器人终极指南:5分钟打造你的智能办公助手
  • 3个你可能不知道的7-Zip特性:重新定义文件压缩体验
  • 【微电网调度】考虑需求响应的改进的多目标灰狼算法微电网优化调度研究【含Matlab源码 15393期】
  • 告别静态配置:深入剖析Xilinx GTX收发器与MMCM的DRP机制,实现SRIO链路速率灵活切换
  • 3种技术方案彻底解决PL-2303串口驱动Windows 10兼容性问题:pl2303-win10的技术架构与实践
  • 南昌医疗代理律师免费咨询电话推荐:以医法双背景破解复杂案件 - 品牌2025
  • ESXi vSwitch最大支持多少端口?ESXi 8.0标准交换机实操指南
  • Seed-VC完整指南:零样本语音转换与实时克隆的终极解决方案
  • 2026年劳力士维修保养服务中心地址及维修项目详情介绍 - 速递信息