SQL语言基础


精选专栏链接 🔗


欢迎订阅,每日精进1%,与百万开发者共攀技术珠峰

更多内容持续更新中!希望能给大家带来帮助~ 😜😜😜😜😜

MySQL基本SQL语句


1,SQL概述

SQL也叫结构化查询语言,上世纪70年代由IBM 公司正式发布。SQL正式发布之后,美国国家标准局(ANSI)制定了多个SQL标准。其中SQL92SQL99(它们分别代表了 92 年和 99 年颁布的 SQL 标准)最为知名,我们今天使用的 SQL 语言都遵循SQL92SQL99标准。

不论你是前端工程师,还是后端算法工程师,都一定会和数据打交道,都需要了解如何又快又准确地提取自己想要的数据。我们一般都是在具体的数据库管理系统(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';

查询得到的结果集如下:

相关推荐
刺客xs21 分钟前
MYSQL数据库----DCL语句
android·数据库·mysql
胖墩的IT24 分钟前
在高并发场景下,仅依赖数据库机制(如行锁、版本控制)无法完全避免数据异常的问题
数据库·mysql
叁沐3 小时前
MySQL 14 count(*)这么慢,我该怎么办?
mysql
灰小猿3 小时前
多级@JsonTypeInfo和@JsonSubTypes注解使用详解及场景分析
java·后端·mysql·spring·spring cloud
潇凝子潇3 小时前
MySQL 的 `EXPLAIN` 输出中,`filtered` 属性使用
android·数据库·mysql
fengye2071614 小时前
板凳-------Mysql cookbook学习 (十一--------9)
android·学习·mysql
子林super4 小时前
es中的index大小信息存入mysql
mysql
写不出来就跑路5 小时前
openGauss数据库管理实战指南——基本常用操作总结
数据库·sql·gaussdb
wu27905 小时前
MYSQL笔记2
数据库·笔记·mysql
砍光二叉树5 小时前
【MYSQL8】springboot项目,开启ssl证书安全连接
spring boot·mysql·ssl