MySql语法简单总结

一、背景:

最近经历了一次跳槽,在找工作的过程中,我发现笔试题中除了考java相关的知识点,还会考数据库相关的知识点,如果基本的知识点不过关,那么整个面试过程会很被鄙视,sql如果长久不用,或者不总结又容易遗忘,所以我写下这篇文章,希望对数据库相关的知识点做一个梳理总结,以备不时之需

MySql中语句的执行顺序

  1. from  
  2. on  
  3. join  
  4. where  
  5. group by  
  6. having  
  7. select  
  8. distinct  
  9. union  
  10. order by  

注意: from后面的表关联,是自右向左解析的,而where条件的解析顺序是自下而上的,也就是说,在写SQL的时候,尽量把数据量小的表放在最右边来进行关联(用小表去匹配大表),而把能筛选出小数据量的条件 放在where语句的最左边,使用count(列名)当某列出现null值的时候,count(*)仍然会计算,但是count(列名)不会。 

二、本次学习中所需的建表语句

DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
  `DEPTNO` int(2) NOT NULL,
  `DNAME` varchar(14) DEFAULT NULL,
  `LOC` varchar(13) DEFAULT NULL,
  PRIMARY KEY (`DEPTNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES ('10', 'ACCOUNTING', 'NEW YORK');
INSERT INTO `dept` VALUES ('20', 'RESEARCH', 'DALLAS');
INSERT INTO `dept` VALUES ('30', 'SALES', 'CHICAGO');
INSERT INTO `dept` VALUES ('40', 'OPERATIONS', 'BOSTON');

-- ----------------------------
-- Table structure for emp
-- ----------------------------
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
  `EMPNO` int(4) NOT NULL,
  `ENAME` varchar(10) DEFAULT NULL,
  `JOB` varchar(9) DEFAULT NULL,
  `MGR` int(4) DEFAULT NULL,
  `HIREDATE` date DEFAULT NULL,
  `SAL` int(7) DEFAULT NULL,
  `COMM` int(7) DEFAULT NULL,
  `DEPTNO` int(2) DEFAULT NULL,
  PRIMARY KEY (`EMPNO`),
  KEY `FK_DEPTNO` (`DEPTNO`),
  CONSTRAINT `FK_DEPTNO` FOREIGN KEY (`DEPTNO`) REFERENCES `dept` (`DEPTNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

三、单表操作

-- 将多列值作为一列返回
SELECT concat(ename,' works AS A ', job) AS msg FROM emp WHERE DEPTNO = 10;

--  在select语句中使用条件逻辑
SELECT ename,sal, CASE WHEN sal <= 2000 THEN 'UNDERPAID'
WHEN sal >= 4000 THEN 'OVERPAID' ELSE 'OK' END AS STATUS
FROM emp;

-- 查找空值
SELECT * from emp where COMM is null;

-- 将空值准换为实际值
SELECT COALESCE(comm,0) FROM emp;
SELECT (CASE WHEN comm is null then 0 else comm end) my_comm FROM emp;  

-- 按模式搜索
SELECT ename,job from emp where DEPTNO in (10,20)
-- 返回名字中有"I"或职务中带有"ER"的员工 
-- 百分号%可以匹配任何字符串序列,下划线_则匹配单个字符,"%I%",表示不管I在什么位置,只要存在就会返回,%在前,
-- 表示返回以I结尾的字符串,反之则是以I开头的字符串
SELECT ename,job FROM emp WHERE DEPTNO in(10,20) and (ename LIKE '%I%' OR JOB LIKE '%ER')

-- 排序,ORDER BY中优先次序是从左到右,一般情况下都可以按照select列表中没有的列来排序,
-- 但是必须显示地给出排序的列名,如果在查询中使用了group BY或distinct,则不能按照select列表中灭有的列来排序
SELECT EMPNO,DEPTNO,SAL,ENAME,JOB FROM emp ORDER BY DEPTNO,SAL DESC

-- 按子串排序,按照职位字段的最后两个字符排序
SELECT ename,job FROM emp ORDER BY substr(job,LENGTH(job)-2)  

--  根据数据项的键排序  
SELECT ename,sal,job,comm FROM emp ORDER BY CASE WHEN job = 'salesman' THEN comm else sal END

四、多表操作

-- 记录集的叠加,union all 将多个来源组合起来,放到一个结果集中,所有select列表中项目数和对
-- 应的项目的数据类型必须要匹配,UNION ALL将包含重复的项目,而union可去掉重复项,但是为了去重而进行排序操作,在处理大结果集时不要用union
SELECT ename AS ename_and_dname,deptno FROM emp WHERE DEPTNO = 10 UNION  ALL
SELECT '----------',NULL FROM sc UNION ALL SELECT dname,deptno 
FROM dept

-- 两表中查找共同的行
CREATE view v  AS SELECT e.empno,e.ename,e.job,e.sal,e.deptno FROM emp e;
SELECT deptno FROM dept WHERE in (50,10,null)

SELECT job,COUNT(hiredate) FROM emp GROUP BY job ORDER BY hiredate

 

五、对group by 和 having 的理解

group by 对数据进行分组; having 对已经分组的数据进行过滤的条件; 

select 列a,聚合函数(聚合函数规范) from 表明 where 过滤条件 group by 列a 

group by 字句也和where条件语句结合在一起使用。当结合在一起时,where在前,group by 在后。即先对select xx from xx的记录集合用where进行筛选,然后再使用group by 对筛选后的结果进行分组。

使用having字句对分组后的结果进行筛选,语法和where差不多:having 条件表达式 

需要注意having和where的用法区别: 

1.having只能用在group by之后,对分组后的结果进行筛选(即使用having的前提条件是分组)。 

2.where肯定在group by 之前,即也在having之前。 

3.where后的条件表达式里不允许使用聚合函数,而having可以。 

当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序是: 

1.执行where xx对全表数据做筛选,返回第1个结果集。 

2.针对第1个结果集使用group by分组,返回第2个结果集。 

4.针对第2个结集执行having xx进行筛选,返回第3个结果集。

3.针对第3个结果集中的每1组数据执行select xx,有几组就执行几次,返回第4个结果集。 

 5.针对第4个结果集排序。 

六、总结

这次只是做了一个简单的MySQL基础知识点的复习,肯定还有很多知识点没有提到的,后续我会继续学习和总结这方面的知识点,学习就是一个不断积累的过程.

<think>首先,用户的问题是关于MySQL基本语法的使用教程。我需要根据系统级指令来构建我的回答。指令包括: - 所有行内数学达式使用$...$格式,但MySQL语法中可能没有数学达式,所以这个可能不适用。 - 独立公式使用$$...$$格式并单独成段,同样,可能不相关。 - LaTeX语法正确:确保任何数学内容正确,但这里可能没有。 - 使用中文回答:整个回答必须用中文。 - 生成相关问题:在回答结束时生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。参考引用了[^1]、[^2]、[^3],这些是站内引用,我需要自然地融入它们。 用户的问题:"我想学习或查询MySQL语法使用方法 请问MySQL 基本语法 使用教程",所以我需要提供一个清晰的MySQL基本语法教程。 回答结构:系统指令说"回答结构清晰,帮助用户逐步解决问题",所以我应该组织内容逐步介绍MySQL语法。 参考引用: - [^1]: 关于MySQL基础语法,包括选择版本、日期,计算达式,使用AS别名,多行语句。 - [^2]: 关于数据的增删改查(CRUD),特别是INSERT和DELETE语法。 - [^3]: 关于事务控制,使用BEGIN、COMMIT、ROLLBACK。 我应该基于这些构建教程,但不要复制粘贴,而是自然地引用。 大纲回答结构: 1. **介绍MySQL**:简要介绍MySQL是什么,基本语法结构。 2. **基本查询**:包括SELECT语句,计算达式等,参考[^1]。 3. **数据操作**:INSERT、DELETE、UPDATE等,参考[^2]。 4. **事务管理**:BEGIN、COMMIT、ROLLBACK,参考[^3]。 5. **其他基础**:如连接数据库、创建等,但用户问的是语法,所以聚焦在查询和操作上。 确保回答真实可靠:基于标准MySQL知识。 最后,生成相关问题。 在引用时,自然地添加引用标识,例如在相关段落末尾。 用中文回答。 现在,构建回答: - 开头:介绍MySQL基本语法的重要性。 - 逐步讲解: - 1. 基本查询:SELECT语句。 - 例如:选择数据、计算达式。 - 引用[^1]中的例子。 - 2. 数据操作:INSERT、DELETE、UPDATE。 - 详细解释语法。 - 引用[^2]。 - 3. 事务控制:BEGIN、COMMIT、ROLLBACK。 - 引用[^3]。 - 结束:总结并生成相关问题。 生成相关问题:基于内容,如: 1. 如何优化MySQL查询性能? 2. MySQL中如何创建和修改结构? 3. 事务在MySQL中的应用场景? 确保回答清晰、分步。</think>### MySQL基本语法使用教程 MySQL是一种广泛使用的关系型数据库管理系统,掌握其基本语法是进行数据库操作的基础。本教程将逐步介绍MySQL的核心语法,包括基本查询、数据操作和事务控制,帮助您快速上手。所有示例均基于标准MySQL语法,确保真实可靠。 #### 1. **基本查询(SELECT语句)** SELECT语句用于从数据库中检索数据。您可以选择特定列、计算达式或使用函数。 - **简单查询**:检索中的所有列。 ```sql SELECT * FROM 名; ``` 例如,查询`users`的所有数据: ```sql SELECT * FROM users; ``` - **计算达式和函数**:MySQL支持数学计算和内置函数,如`sin()`或`pi()`。 ```sql SELECT (20+5)*4; -- 计算达式 SELECT SIN(PI()/3); -- 使用数学函数 ``` 结果会返回数值,例如`(20+5)*4`输出`100`。 - **别名(AS)**:为结果列指定易读的名称。 ```sql SELECT (20+5)*4 AS Result, SIN(PI()/3) AS SinValue; ``` 这里`Result`和`SinValue`是别名,使输出更清晰。 - **多行语句**:MySQL允许将长语句分成多行书写,提高可读性。 ```sql SELECT username, password FROM users WHERE id > 1; ``` 基本查询语法MySQL中大小写不敏感,例如`SELECT`和`select`效果相同[^1]。 #### 2. **数据操作(增删改查)** 数据操作是数据库的核心,包括插入(INSERT)、删除(DELETE)、更新(UPDATE)和查询(SELECT)。 - **插入数据(INSERT)**:向中添加新记录。 - **指定字段插入**:只添加部分字段。 ```sql INSERT INTO 名 (字段1, 字段2) VALUES (值1, 值2); ``` 例如,向`users`添加数据: ```sql INSERT INTO users (id, username, password) VALUES (1, 'moon', '123456'); ``` - **全字段插入**:省略字段名,但值顺序必须与结构一致。 ```sql INSERT INTO 名 VALUES (值1, 值2); ``` 示例: ```sql INSERT INTO users VALUES (NULL, 'test', '123456'); -- NULL示自增主键 ``` - **SET语法插入**:直接设置字段值。 ```sql INSERT INTO 名 SET 字段1=值1, 字段2=值2; ``` 例如: ```sql INSERT INTO student SET id=4, name='zhaoliu', grade=72; ``` - **批量插入**:一次性添加多条记录。 ```sql INSERT INTO 名 (字段1, 字段2) VALUES (值1, 值2), (值3, 值4); ``` 示例: ```sql INSERT INTO users (id, username, password) VALUES (NULL, 'moon', '123456'), (NULL, 'alex', '123456'); ``` 这能提高效率[^2]。 - **删除数据(DELETE)**:移除记录,需谨慎使用WHERE子句指定条件。 ```sql DELETE FROM 名 WHERE 条件; ``` 例如,删除`users`中`id=1`的记录: ```sql DELETE FROM users WHERE id=1; ``` 如果不加WHERE,会删除所有数据[^2]。 - **更新数据(UPDATE)**:修改现有记录。 ```sql UPDATE 名 SET 字段1=新值 WHERE 条件; ``` 示例: ```sql UPDATE users SET password='newpass' WHERE username='test'; ``` #### 3. **事务控制** 事务确保一组操作要么全部成功,要么全部失败,保证数据一致性。使用`BEGIN`、`COMMIT`和`ROLLBACK`控制。 - **开始事务**:`BEGIN`启动事务。 - **提交事务**:`COMMIT`确认所有操作。 - **回滚事务**:`ROLLBACK`撤销未提交的操作。 示例:转账操作,确保原子性。 ```sql BEGIN; -- 开始事务 UPDATE accounts SET balance = balance - 1000 WHERE id = 1; -- 从账户1扣款 UPDATE accounts SET balance = balance + 1000 WHERE id = 2; -- 向账户2存款 COMMIT; -- 提交事务(如果所有操作成功) ``` 如果任一操作失败,使用`ROLLBACK;`回滚到事务开始前的状态[^3]。 #### 总结 MySQL基本语法包括查询(SELECT)、数据操作(INSERT、DELETE、UPDATE)和事务控制(BEGIN、COMMIT、ROLLBACK)。通过本教程,您可执行常见数据库任务。建议从简单查询开始练习,逐步深入。MySQL语法大小写不敏感,但使用缩进和多行书写能提升代码可读性[^1][^2]。实际应用中,结合索引和优化能提高性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zach_ZSZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值