精选专栏链接 🔗
欢迎订阅,每日精进1%,与百万开发者共攀技术珠峰
更多内容持续更新中!希望能给大家带来帮助~ 😜😜😜😜😜
MySQL基本SQL语句
1,SQL概述
SQL也叫结构化查询语言,上世纪70年代由IBM 公司正式发布。SQL正式发布之后,美国国家标准局(ANSI)制定了多个SQL标准。其中
SQL92
和SQL99
(它们分别代表了 92 年和 99 年颁布的 SQL 标准)最为知名,我们今天使用的 SQL 语言都遵循SQL92
和SQL99
标准。

不论你是前端工程师,还是后端算法工程师,都一定会和数据打交道,都需要了解如何又快又准确地提取自己想要的数据。我们一般都是在具体的数据库管理系统(DBMS)使用SQL语言操控数据库(DB)。
2,SQL分类
SQL语言在功能上主要分为如下三大类:
- DDL:数据定义语言 ,这些语句定义了不同的数据库、表、视图、索引等数据库对象,还可以用来创建、删除、修改数据库和数据表的结构。关键字包括
CREATE 、 DROP 、 ALTER 、RENAME等
。 - DML:数据操作语言 ,使用频率最高 ,用于对数据库记录的
增删改查
,并检查数据完整性。关键字包括INSERT 、 DELETE 、 UPDATE 、 SELECT
。 - DCL:数据控制语言 ,用于定义数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括
GRANT(授权)
、REVOKE(收回权限)
、COMMIT (提交)
、ROLLBACK (回滚)
、SAVEPOINT(设置保存点)
等。
注意:由于数据库中SELECT语句的使用频率较高,有的地方也会将SELECT单独拿出,并归类为DQL数据查询语言。
3,SQL语言的规则和规范
3.1,SQL基本规则
SQL可以写在一行或多行。
为了提高可读性,各子句分行写,必要时使用缩进;- 每条命令以
;或\g或\G
结束; - 关键字不能被缩写也不能分行;
- 字符串型和日期时间类型的数据可以使用单引号表示;
- 列的别名尽量使用双引号,而且不建议省略;
3.2,SQL大小写规范(建议遵守)
- MySQL在Windows环境下是大小写不敏感的;
- Linux环境下MySQL的变量名、表名、表别名、数据库名严格区分大小写;
- Linux环境下MySQL的关键字、函数名、列名、列别名、字段名是忽略大小写的;
因此推荐使用统一的书写规范:
数据库、表名、表别名、字段名、字段别名等采用小写;
SQL关键字、函数名、绑定变量等都有大写;
4,MySQL注释
4.1,单行注释
①单行注释写法一
sql
# 注释文字(MySQL特有的格式)
②单行注释写法二
sql
-- 注释文字(--后必须加上一个空格)
4.2,多行注释
sql
/* 注释文字 */
注意:多行注释不可嵌套
5,命名规则
- 数据库、表名不得超过30个字符,变量名限制为29个;
- 必须只包含A-Z,a-z,0-9,_ 共63个字符;
- 数据库名、表名、字段名等对象名中间不要包含空格;
- 需保证你的字段没有和关键字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使用着重号( ' ` ')引起来;
6,导入数据
介绍两种向MySQL导入现有数据的方式。
6.1,指令方式导入数据
在终端命令行通过:source+文件全路径名
的方式导入,示例如下:
sql
mysql> source d:\mysqldb.sql
6.2,图形化界面方式导入
以Navicat为例,导入数据


7,基本select语句
①选择全部列(* 代表表中所有字段)
sql
SELECT * FROM 表名;
②选择指定列
sql
SELECT 字段1,字段2,... FROM 表名;
7.1,列的别名
列的别名就是给原数据列起一个另外的名字,借助AS关键字
(可省略)实现;
示例如下:
此处我有一个employees表(员工表),我要查询的字段是employee_id、last_name和department_id,SQL语句如下:
sql
SELECT employee_id,last_name,department_id
FROM employees;
查询到的结果集如下:

现在要求给原字段名起别名:employee_id别名为emp_id,last_name改为lname,department_id仍使用原字段名。SQL语句如下:
sql
SELECT employee_id AS emp_id,last_name as lname,department_id
FROM employees;
查询得到的结果集如下:

借助AS
关键字起别名,AS关键字可省略,即使用如下的SQL语句可以实现上述同样的查询效果:
sql
SELECT employee_id emp_id,last_name lname,department_id
FROM employees;
列的别名可以使用双引号引起来,比如:
sql
SELECT employee_id emp_id,last_name AS "lname",department_id
FROM employees;
应用场景:要求从employees表查询员工的年工资,并起别名为"annual sal"

正确的SQL语句写法是:
sql
SELECT employee_id,last_name,department_id, salary * 12 "annual sal"
FROM employees;
查询的结果集如下:

7.2,去除重复行
想象我们现在有一个需求:查询员工表中一共有哪些部门id,要求每一个部门id只返回一次。
可能会有人想到使用如下SQL语句:
sql
SELECT department_id
FROM employees;
但运行此SQL查询会返回全部的行,包含的有重复行。
我们一般会借助DISTINCT关键字去除重复行。
正确的SQL语句如下:
sql
SELECT DISTINCT department_id
FROM employees;
查询结果如下:

注意点总结:
- 使用DISTINCT关键字进行去重;
- 查询你多个字段时,DISTINCT要放在所有字段的前面,否则可能会报错;
- 查询你多个字段时,DISTINCT实际上是对其后面所有字段的组合进行去重;
7.3,MySQL中的空值
需要注意的是在 MySQL 里面, 空值不等于空字符串。一个空字符串的长度是 0,而一个空值的长度是空。而且,在 MySQL 里面,空值是占用空间的。
空值参与运算时,所有运算符或列值遇到null值,运算的结果都为null;
比如:employees 员工表中有部分员工的 commission_pct (佣金或提成)字段为空,如下图:

当要计算所有员工的年工资时,可以按照如下方式计算:
bash
年工资 = 月工资×(1+提成)× 12
如果使用如下SQL语句进行查询:
sql
SELECT employee_id,salary AS "月工资",commission_pct AS "提成",12 * salary * (1 + commission_pct) "年工资"
FROM employees;
查询的结果集如下:

可以看到,由于员工的提成字段为 Null 时,最终计算得到的年工资也为 Null。
如果想要解决以上问题,可以使用如下SQL语句代替:
sql
SELECT employee_id,salary AS "月工资",commission_pct AS "提成",12 * salary * (1 + IFNULL(commission_pct,0)) "年工资"
FROM employees;
其中函数
IFNULL(commission_pct,0))
表示:如果commission_pct字段不为Null则使用commission_pct值参与计算;如果commission_pct字段为Null则使用0参与计算;后续的函数章节会详细介绍函数的使用和规范。
最终查询得到的结果集如下,即使员工的提成为Null,最终计算得到的年工资也是正常的:

7.4,着重号
回顾前面讲到的SQL规则与规范,提到过如下一条:
- 需保证你的字段没有和关键字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使用
着重号
引起来;
还是使用一个例子做讲解,想象你有一张订单表名为order,现在要查询order表中的所有数据。
如果直接执行如下SQL:
sql
SELECT * FROM order;
运行后报错

原因是 order 是MySQL的一个关键字,表名和关键字冲突时需要加上着重号,正确的SQL语句如下:
sql
SELECT * FROM `order`;
因此我们需要保证表中的字段、表名等没有和保留字、数据库系统或常用方法冲突。如果真的相同,需要在SQL语句中明确地使用一对 ``(着重号)引起来。
7.5,查询常数
SELECT 查询还可以对常数进行查询。实际上就是在 SELECT 查询结果中增加一列固定的常数列。这列的取值是我们指定的,而不是从数据表中动态取出的。
SQL示例如下:
sql
SELECT 'MySQL学习' , employee_id, last_name
FROM employees;
查询得到的结果集如下:

8,显示表结构
显示表结构使用DISCRIBE关键字,顾名思义,描述表的结构。SQL语句如下:
①形式一
sql
DESCRIBE employees;
②形式二
sql
DESC employees;
运行后得到的 employees 表结构的描述如下:

9,过滤数据
当我们需要查询某些满足条件的数据时,需要使用where 关键字
将不满足条件的数据过滤掉。接下来我们依然结合具体例子讲解:
案例一:查询employees表内在90号部门(department_id为90)工作的员工的信息
SQL语句如下:
sql
SELECT *
FROM employees
WHERE department_id = 90;
查询得到的结果集如下:

案例二:查询 employees表内 last_name 为King的员工的信息
SQL语句如下:
sql
SELECT *
FROM employees
WHERE last_name = 'King';
查询得到的结果集如下:
