MySQL基础

1. SQL语言的分类

img

2. SQL规范

2.1 大小写

  • Windows环境下大小写不敏感
  • Linux环境下大小写敏感
    书写规范:
  • 小写:数据库名、表名、表别名、字段名、字段别名等
  • 大写:SQL关键字、函数名、绑定变量等

2.2 注释

  1. 单行注释:
    • 井号:# 单行注释 (MySQL特有)
    • -- 单行注释 (--后必须有空格)
  2. 多行注释
/* 
	多行注释
*/

2.3 列的别名

列的别名:重命名列

  • 建议:别名简洁,见名知意
  1. 在原有名字后面直接写,用 双引号 包住(双引号可省)
  2. 使用AS关键字,as(alias,别名)可省
SELECT employee_id emp_id, department_id "部门id", last_name AS lname, salary * 12 AS "annual sal"
FROM employees

2.4 字符串

  1. mysql中字符串的下标从1开始
  2. 字符串匹配
    • _ 可以替代一个字符
    • % 可以替代任意多个字符(包括0个)
    • ESCAPE后面的表示转义字符
-- 查询以DB_开头,倒数第3个字符为i的字符串
SELECT *
FROM table_name
WHERE Cname LIKE 'DB\_%i__'
ESCAPE '\';
  1. 用正则表达式匹配字符串

2.5 导入已有的数据

  1. source 文件的全路径名(命令行
source d:/mysqldb.sql
  1. 图形化界面工具中的按钮选项导入数据
    例如SQLyog中: 工具 - 执行sql脚本 - 选中xxx.sql

3. 查询

3.1 标准的 SELECT 语句

SELECT ....,....,....(存在聚合函数)
FROM ... (LEFT / RIGHT) JOIN ....ON 多表的连接条件 
(LEFT / RIGHT)JOIN ... ON ....
WHERE 不包含聚合函数的过滤条件
GROUP BY ...,....
HAVING 包含聚合函数的过滤条件
ORDER BY ....,...(ASC / DESC )
LIMIT ...,....

3.2 聚合查询(GROUP BY)

  1. SELECT中出现的非聚合函数字段必须放在GROUP BY 后,作为分组的依据
  2. 常见的聚合函数有AVG()MIN()MAX()COUNT()
  3. WHERE声明在GROUP BY前面,过滤条件中不包含聚合函数
  4. HAVING声明在GROUP BY后面,过滤条件中有聚合函数,则使用HAVING
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary) > 10000;
-- 查询选修了2门以上课程的学生的学号和选课数
SELECT Sno, count(Cno)
FROM SC
GROUP BY Sno
HAVING count(Cno) >= 2;

3.3 嵌套查询

  1. 子查询的位置
    在SELECT中,除了GROUP BY 和 LIMIT,其他位置都可以使用子查询。
  2. MySQL中聚合函数是不能嵌套的,Oracle中是支持的。
    解决方法:
    • 将聚合函数得到的结果取别名,作为一张新表。对新表可以使用聚合函数。作用相当于聚合函数的嵌套。
SELECT MIN(avg_sal)
FROM(
		SELECT AVG(salary) avg_sal
		FROM employees
		GROUP BY department_id
	) t_dept_avg_sal
	# t_dept_avg_sal是表的别名
  1. 空值问题
# 错误写法
SELECT last_name
FROM employees
WHERE employee_id NOT IN (
			SELECT manager_id
			FROM employees
			);

出错原因:内层查询的manager_id中有null

# 正确写法
SELECT last_name
FROM employees
WHERE employee_id NOT IN (
			SELECT manager_id
			FROM employees
         	WHERE manager_id IS NOT NULL 
			);

3.4 集合运算

  1. 交:INTERSECT
  2. 并:UNION
  3. 差:EXCEPTMINUS
  4. 关键字DISTINCT能够去重

3.5 EXISTS的用法

-- 查询选修了全部课程的学生的学号、姓名
SELECT Sno, Sname FROM Student WHERE NOT EXISTS(
	SELECT * FROM Course WHERE NOT EXISTS(
		SELECT * FROM SC 
		WHERE Student.Sno = SC.Sno
		AND Course.Cno = SC.Cno 
	)
);

4. 增、删、改

4.1 插入数据

  1. 插入单条数据
INSERT INTO Student(Sno, Sname, Ssex, Sage, Sdept)
VALUES ('1001', 'mike', 'male', 20, 'CS');
  1. 将子查询结果插入关系
INSERT INTO Student(Sno, Sname, Ssex, Sage, Sdept)
子查询语句

4.2 删除数据

DELETE FROM Student
WHERE ...

4.3 修改数据

UPDATE Student
Set Sage = 21, Sdept = 'AI', ..., Attribute = Values
WHERE ...

5. DCL 数据控制语言

5.1 授权

GRANT <privilege list> ON <relation> TO <user list>
  • privilege list包括各种操作,如 select, update, insert, delete

5.2 收回权限

REVOKE <privilege list> ON <relation> FROM <user list>
posted @   Frank23  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示