目录
一、写在前面
1.0 内容概览
1.1 SQL 分类
1.2 SQL语言的规则与规范
1.2.1 基本规则
1.2.2 SQL大小写规范 (建议遵守)
1.3 注释
1.4 命名规则(暂时了解)
二、基本的SELECT语句
2.0 SELECT...
2.1 SELECT ... FROM ...
2.2 列的别名
2.3 去除重复行
2.4 空值参与运算
2.5 着重号 ` `
2.6 查询常数
2.7 显示表结构
2.8 过滤数据
(仅是本 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 对字符串区分!