目录
(仅是本 fw 看 bilibili 尚硅谷视频做的笔记)
一、写在前面
1.0 内容概览
导图:
1.1 SQL 分类
SQL语言在功能上主要分为如下3大类:
- DDL(Data Definition Languages、数据定义语言),这些语句定义了不同的数据库、表、视图、索 引等数据库对象,还可以用来创建、删除、修改数据库和数据表的结构。 主要的语句关键字包括 CREATE 、 DROP 、 ALTER 等。
- DML(Data Manipulation Language、数据操作语言),用于添加、删除、更新和查询数据库记 录,并检查数据完整性。 主要的语句关键字包括 INSERT 、 DELETE 、 UPDATE 、 SELECT 等。 SELECT是SQL语言的基础,最为重要。
- DCL(Data Control Language、数据控制语言),用于定义数据库、表、字段、用户的访问权限和 安全级别。 主要的语句关键字包括 GRANT 、 REVOKE 、 COMMIT 、 ROLLBACK 、 SAVEPOINT 等。
因为查询语句使用的非常的频繁,所以很多人把查询语句单拎出来一类:DQL(数据查询语言)。 还有单独将 COMMIT 、 ROLLBACK 取出来称为TCL (Transaction Control Language,事务控制语 言)。
1.2 SQL语言的规则与规范
1.2.1 基本规则
- SQL 可以写在一行或者多行。为了提高可读性,各子句分行写,必要时使用缩进
- 每条命令以 ; 或 \g 或 \G 结束
- 关键字不能被缩写也不能分行
- 关于标点符号 ①必须保证所有的()、单引号、双引号是成对结束的 ②必须使用英文状态下的半角输入方式 ③字符串型和日期时间类型的数据可以使用单引号(' ')表示 ④列的别名,尽量使用双引号(" "),而且不建议省略as
1.2.2 SQL大小写规范 (建议遵守)
- MySQL 在 Windows 环境下是大小写不敏感的
- MySQL 在 Linux 环境下是大小写敏感的 ①数据库名、表名、表的别名、变量名是严格区分大小写的 ②关键字、函数名、列名(或字段名)、列的别名(字段的别名) 是忽略大小写的。
- 推荐采用统一的书写规范:① 数据库名、表名、表别名、字段名、字段别名等都小写 ②SQL 关键字、函数名、绑定变量等都大写
1.3 注释
单行注释:#注释文字(MySQL特有的方式)
单行注释:-- 注释文字(--后面必须包含一个空格。)
多行注释:/* 注释文字 */
1.4 命名规则(暂时了解)
- 数据库、表名不得超过30个字符,变量名限制为29个
- 必须只能包含 A–Z, a–z, 0–9, _共63个字符
- 数据库名、表名、字段名等对象名中间不要包含空格
- 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
- 必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使 用`(着重号)引起来
- 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据 类型在一个表里是整数,那在另一个表里可就别变成字符型了
二、基本的SELECT语句
2.0 SELECT...
最基本的 SELECT 语句: SELECT 字段1, 字段2, ... FROM 表名
只写 1+1,2*3 会报错,要显示结果起码要写一个 SELECT 语句。
2.1 SELECT ... FROM ...
其实上面 2.0 相当于从一个伪表 dual 中选择(不需要从哪个表里选择)
*(星号):表中所有的字段(或列)即“全选”:
只选几列:
2.2 列的别名
重命名一个列,便于计算,建议别名简短,见名知意。
注意:支持utf8字符的也能写中文。
三种方法:
- 紧跟列名
- 列名和别名之间加入关键字AS【as全称:(alias)别名,可省略(即第一种)】
- 别名使用双引号(" "),不要使用单引号(' ')
因为mySQL的语法不是很严谨,所以单双引号都能执行,但是在 Oracl 里会出错,而且写错会显得很“业余”,也为了其它数据库的兼容性,所以记住:列里的字符串用单引号,别名用的是双引号。
那么第三种方式跟第一种相比的优点呢:(在一些情况下,双引号去掉没影响)某些情况不能丢掉双引号:别名含空格时。
比如想要得出员工的年工资,用 annual_salary 可以不加双引号,"annual salary"中间为空格,必须加双引号:
也可以第二种第三种结合(补一个as)
2.3 去除重复行
# 没去重的情况:
SELECT department_id
FROM employees;
# 去重的情况:
SELECT DISTINCT department_id
FROM employees;
没去重是全部的107行,(图略)
去重后看出只有12行:
再来看两种特殊情况:
# 错误的:(107行*12行 无法对应)
SELECT salary,DISTINCT department_id
FROM employees;
# 仅仅是没有报错,但是没有实际意义
SELECT DISTINCT department_id,salary
FROM employees;
2.4 空值参与运算
- 空值:null
- null 不等同于0,' ','null'
- 空值参与运算:结果一定也为空。
( plus: commission_pcd 是数据库HR列表里的员工提成。)
实际问题的解决方案:引入IFNULL(单行函数)
附上代码:
#空值参与运算,结果一定也为空
SELECT employee_id,salary "月工资",salary*(1 + commission_pct)*12 "年工资",commission_pct
FROM employees;
#实际问题的解决方案:引入IFNULL
SELECT employee_id,salary "月工资",salary*(1 + IFNULL (commission_pct,0))*12 "年工资",commission_pct
FROM employees;
2.5 着重号 ` `
` 为键盘上部数字123..区域的数字1的左边的符号。
我们需要保证表中的字段、表名等没有和保留字、数据库系统或常用方法冲突。如果真的相同,请在 SQL语句中使用一对``(着重号)引起来。
发现对普通字段(列名)和表名用着重号也没有问题,(但看着可读性还变差了)一般情况下不加。
2.6 查询常数
“常数字段” 会进行满填充。
你可能会问为什么我们还要对常数进行查询呢?
SQL 中的 SELECT 语法的确提供了这个功能,一般来说我们只从一个表中查询数据,通常不需要增加一个 固定的常数列,但如果我们想整合不同的数据源,用常数列作为这个表的标记,就需要查询常数。
2.7 显示表结构
关键字:DESCRIBE 或 DESC
看看表中有哪些字段,分别是什么类型的,有没有什么约束。
2.8 过滤数据
关键字:WHERE(声明在FROM后面,与FROM之间不能插入其它关键字)
#查询90号部门员工的信息:
SELECT * FROM employees
WHERE department_id = 90;
#查询last_name为'King'的员工信息:
SELECT * FROM employees
WHERE LAST_NAME = 'king';
注意:mySQL不区分大小写!但是Oracl 对字符串区分!