)
一、MySQL 客户端与数据库基础操作1. 登录 MySQLmysql-uroot-p2. 基础库操作语句查询数据库版本SELECTVERSION();查看所有数据库SHOWDATABASES;创建数据库可选判断库不存在、指定字符集与排序规则CREATE[IFNOTEXISTS]DATABASE数据库名CHARACTERSET字符集COLLATE排序规则;切换使用指定数据库USE数据库名;查询当前正在使用的数据库SELECTDATABASE();删除数据库高危操作谨慎使用DROP[IFEXISTS]DATABASE数据库名;查看执行警告信息SHOWWARNINGS;退出客户端quit;exit;二、数据表基础操作查看当前库下所有数据表SHOWTABLES;创建数据表CREATETABLE表名(字段名 数据类型[约束],字段名 数据类型[约束],...);查看表结构DESC表名;删除数据表高危操作DROPTABLE[IFEXISTS]表名;三、CRUD 增删改查核心语句一新增 INSERT语法-- 指定插入字段INSERTINTO表名(字段1,字段2,...)VALUES(值1,值2,...);-- 不指定字段值顺序、数量与表全部字段一一对应INSERTINTO表名VALUES(值1,值2,...);规则指定字段数量必须与 VALUES 内值数量、顺序完全匹配。二查询 SELECT全列查询查询整张表所有数据大数据表禁止随意使用SELECT*FROM表名;指定字段查询SELECT字段1,字段2FROM表名;字段表达式查询SELECT字段1,字段2*10AS计算结果FROM表名;字段别名查询别名含空格需用单引号包裹SELECT字段AS别名名称FROM表名;去重查询多字段去重需所有字段值完全相同才判定重复SELECTDISTINCT字段1,字段2FROM表名;排序查询SELECT字段FROM表名ORDERBY排序字段ASC|DESC;-- ASC升序默认DESC降序条件查询WHERE 过滤原始数据SELECT字段FROM表名WHERE条件表达式ORDERBY排序字段;区间范围查询等价于值≥起始 AND 值≤结束WHERE字段BETWEEN起始值AND结束值;模糊匹配查询%匹配任意长度任意字符_匹配单个任意字符SELECT*FROM表名WHERE字段LIKE匹配模板;分页查询-- 查询前N条数据SELECT*FROM表名LIMITN;-- 从下标start从0开始取N条数据SELECT*FROM表名LIMITstart,N;SELECT*FROM表名LIMITNOFFSETstart;三更新 UPDATE无 WHERE 条件会更新整张表所有数据生产环境必须搭配条件 / 分页限制UPDATE表名SET字段1值1,字段2值2[WHERE过滤条件][LIMIT行数];四删除 DELETE无 WHERE 条件会清空整张表数据高危操作DELETEFROM表名[WHERE过滤条件][LIMIT行数];四、数据表五大完整性约束非空约束 NOT NULL标记字段不允许存储 NULL 空值插入 / 更新时必须赋值。唯一约束 UNIQUE字段内所有值不能重复允许存在一条 NULL 值。主键约束 PRIMARY KEY等价于NOT NULL UNIQUE一张表仅能有一个主键用于唯一标识每条记录。默认约束 DEFAULT字段未手动赋值时自动填充预设默认值。外键约束 FOREIGN KEY本表字段关联另一张表的主键数据库自动校验关联数据合法性保证参照完整性。五、数据库表设计三大范式第一范式 1NF数据表中每一列字段值不可再拆分字段值使用数据库原生基础数据类型存储满足即为关系型数据库。第二范式 2NF满足 1NF 基础上消除部分函数依赖仅复合主键多字段主键场景会出现该问题。问题表现非主键字段仅依赖复合主键中某一个字段会引发数据冗余、新增异常、更新异常、删除异常。解决拆分独立数据表剥离部分依赖字段。第三范式 3NF满足 2NF 基础上消除传递函数依赖非主键字段不能依赖其他非主键字段。六、实体间三种关联关系表设计一对一两张独立表任选一张新增外键字段关联另一张表主键外键添加唯一约束。一对多“一” 方建立主键“多” 方新增外键字段关联一方主键是最常用关联。多对多两张业务独立表额外新建一张中间关联表中间表分别存储两张主表主键作为联合主键。七、聚合函数配合 GROUP BY 分组使用仅能写在 SELECT、HAVING 子句中不能用于 WHERE 过滤原始数据COUNT(*|字段)统计查询结果总记录行数SUM(字段)数值字段求和AVG(字段)数值字段求平均值MIN(字段)字段最小值MAX(字段)字段最大值八、分组与分组过滤GROUP BY按指定字段对数据分组分组后仅可查询分组字段与聚合函数结果SELECT分组字段,聚合函数(字段)FROM表名GROUPBY分组字段;HAVING对 GROUP BY 分组后的聚合结果做过滤WHERE 过滤原始行HAVING 过滤分组结果九、多表联合查询1. 内连接 INNER JOIN只返回两张表满足连接条件的匹配数据无匹配则不展示-- 隐式内连接SELECT*FROM表1,表2WHERE表1.关联字段表2.关联字段;-- 显式内连接SELECT*FROM表1INNERJOIN表2ON表1.关联字段表2.关联字段;连接执行流程生成两张表笛卡尔积通过 ON 连接条件过滤无效匹配数据叠加 WHERE 业务条件筛选行截取指定展示字段输出结果。2. 外连接左外连接 LEFT JOIN以左表全部数据为基准右表无匹配数据填充 NULLSELECT*FROM表1LEFTJOIN表2ON关联条件;右外连接 RIGHT JOIN以右表全部数据为基准左表无匹配数据填充 NULLSELECT*FROM表1RIGHTJOIN表2ON关联条件;适用场景需要完整保留某一张表全部数据关联表匹配数据缺失时展示空值。3. 自连接同一张表起两个别名自身与自身关联用于表内行与行对比、行转列场景SELECT*FROM表名 t1,表名 t2WHEREt1.关联字段t2.关联字段;4. 子查询内层查询结果作为外层查询的判断条件支持多层嵌套嵌套层级过多会降低执行效率单行子查询返回单条单个值用匹配SELECT*FROM表1WHEREid(SELECTidFROM表2WHERE条件);多行子查询返回多条数据用IN匹配SELECT*FROM表1WHEREidIN(SELECTidFROM表2WHERE条件);5. 结果集合并查询要求前后两条查询的字段数量、数据类型一一对应UNION合并后自动去重UNION ALL直接拼接结果不做去重性能更高SELECT*FROM表1UNIONALLSELECT*FROM表2;十、SQL 完整语句执行顺序完整示例 SQLSELECTDISTINCTstudent.id,student.name,AVG(student.age)FROMstudentJOINclassONstudent.class_idclass.idWHEREclass_id1GROUPBYstudent.idHAVINGAVG(student.age)0ORDERBYstudent.idASCLIMIT100;执行优先级顺序FROM→JOIN ON→WHERE→GROUP BY→HAVING→SELECT→DISTINCT→ORDER BY→LIMIT