第03章_基本的SELECT语句

news2024/10/6 6:39:42

第03章_基本的SELECT语句

1. SQL概述

1.1 SQL背景知识

  • 1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖。在这几十年里,无数的技术、产业在这片江湖里沉浮,有的方兴未艾,有的已经几幕兴衰。但在这片浩荡的波动里,有一门技术从未消失,甚至“老当益壮”,那就是 SQL。

    • 45 年前,也就是 1974 年,IBM 研究员发布了一篇揭开数据库技术的论文《SEQUEL:一门结构化的英语查询语言》,直到今天这门结构化的查询语言并没有太大的变化,相比于其他语言,SQL 的半衰期可以说是非常长了。
  • 不论是前端工程师,还是后端算法工程师,都一定会和数据打交道,都需要了解如何又快又准确地提取自己想要的数据。更别提数据分析师了,他们的工作就是和数据打交道,整理不同的报告,以便指导业务决策。

  • SQL(Structured Query Language,结构化查询语言)是使用关系模型的数据库应用语言,与数据直接打交道,由IBM上世纪70年代开发出来。后由美国国家标准局(ANSI)开始着手制定SQL标准,先后有SQL-86SQL-89SQL-92SQL-99等标准。

    • SQL 有两个重要的标准,分别是 SQL92 和 SQL99,它们分别代表了 92 年和 99 年颁布的 SQL 标准,我们今天使用的 SQL 语言依然遵循这些标准。
  • 不同的数据库生产厂商都支持SQL语句,但都有特有内容。

SQLisputonghua

1.2 SQL语言排行榜

自从 SQL 加入了 TIOBE 编程语言排行榜,就一直保持在 Top 10。

image-20211014230114639

1.3 SQL 分类

SQL语言在功能上主要分为如下3大类:

  • DDL(Data Definition Languages、数据定义语言),这些语句定义了不同的数据库、表、视图、索引等数据库对象,还可以用来创建、删除、修改数据库和数据表的结构。

    • 主要的语句关键字包括CREATEDROPALTER等。
  • DML(Data Manipulation Language、数据操作语言),用于添加、删除、更新和查询数据库记录,并检查数据完整性。

    • 主要的语句关键字包括INSERTDELETEUPDATESELECT等。
    • SELECT是SQL语言的基础,最为重要。
  • DCL(Data Control Language、数据控制语言),用于定义数据库、表、字段、用户的访问权限和安全级别。

    • 主要的语句关键字包括GRANTREVOKECOMMITROLLBACKSAVEPOINT等。

因为查询语句使用的非常的频繁,所以很多人把查询语句单拎出来一类:DQL(数据查询语言)。

还有单独将COMMITROLLBACK 取出来称为TCL (Transaction Control Language,事务控制语言)。

2. SQL语言的规则与规范

2.1 基本规则

  • SQL 可以写在一行或者多行。为了提高可读性,各子句分行写,必要时使用缩进
  • 每条命令以 ; 或 \g 或 \G 结束
  • 关键字不能被缩写也不能分行
  • 关于标点符号
    • 必须保证所有的()、单引号、双引号是成对结束的
    • 必须使用英文状态下的半角输入方式
    • 字符串型和日期时间类型的数据可以使用单引号(’ ')表示
    • 列的别名,尽量使用双引号(" "),而且不建议省略as

2.2 SQL大小写规范 (建议遵守)

  • MySQL 在 Windows 环境下是大小写不敏感的
  • MySQL 在 Linux 环境下是大小写敏感的
    • 数据库名、表名、表的别名、变量名是严格区分大小写的
    • 关键字、函数名、列名(或字段名)、列的别名(字段的别名) 是忽略大小写的。
  • 推荐采用统一的书写规范:
    • 数据库名、表名、表别名、字段名、字段别名等都小写
    • SQL 关键字、函数名、绑定变量等都大写

2.3 注 释

可以使用如下格式的注释结构

单行注释:#注释文字(MySQL特有的方式)
单行注释:-- 注释文字(--后面必须包含一个空格。)
多行注释:/* 注释文字  */

2.4 命名规则(暂时了解)

  • 数据库、表名不得超过30个字符,变量名限制为29个
  • 必须只能包含 A–Z, a–z, 0–9, _共63个字符
  • 数据库名、表名、字段名等对象名中间不要包含空格
  • 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
  • 必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使用`(着重号)引起来
  • 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了

举例:

#以下两句是一样的,不区分大小写
show databases;
SHOW DATABASES;

#创建表格
#create table student info(...); #表名错误,因为表名有空格
create table student_info(...); 

#其中order使用``飘号,因为order和系统关键字或系统函数名等预定义标识符重名了
CREATE TABLE `order`(
    id INT,
    lname VARCHAR(20)
);

select id as "编号", `name` as "姓名" from t_stu; #起别名时,as都可以省略
select id as 编号, `name` as 姓名 from t_stu; #如果字段别名中没有空格,那么可以省略""
select id as 编 号, `name` as 姓 名 from t_stu; #错误,如果字段别名中有空格,那么不能省略""

2.5 数据导入指令

在命令行客户端登录mysql,使用source指令导入

mysql> source d:\mysqldb.sql
mysql> desc employees;
+----------------+-------------+------+-----+---------+-------+
| Field          | Type        | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| employee_id    | int(6)      | NO   | PRI | 0       |       |
| first_name     | varchar(20) | YES  |     | NULL    |       |
| last_name      | varchar(25) | NO   |     | NULL    |       |
| email          | varchar(25) | NO   | UNI | NULL    |       |
| phone_number   | varchar(20) | YES  |     | NULL    |       |
| hire_date      | date        | NO   |     | NULL    |       |
| job_id         | varchar(10) | NO   | MUL | NULL    |       |
| salary         | double(8,2) | YES  |     | NULL    |       |
| commission_pct | double(2,2) | YES  |     | NULL    |       |
| manager_id     | int(6)      | YES  | MUL | NULL    |       |
| department_id  | int(4)      | YES  | MUL | NULL    |       |
+----------------+-------------+------+-----+---------+-------+
11 rows in set (0.00 sec)

3. 基本的SELECT语句

3.0 SELECT…

SELECT 1; #没有任何子句
SELECT 9/2; #没有任何子句

3.1 SELECT … FROM

  • 语法:
SELECT   标识选择哪些列
FROM     标识从哪个表中选择
  • 选择全部列:
SELECT *
FROM   departments;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LR92TDai-1668912884239)(images/1554950890895.png)]

一般情况下,除非需要使用表中所有的字段数据,最好不要使用通配符‘*’。使用通配符虽然可以节省输入查询语句的时间,但是获取不需要的列数据通常会降低查询和所使用的应用程序的效率。通配符的优势是,当不知道所需要的列的名称时,可以通过它获取它们。

在生产环境下,不推荐你直接使用SELECT *进行查询。

  • 选择特定的列:
SELECT department_id, location_id
FROM   departments;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QerJ3SHP-1668912884241)(images/1554950947969.png)]

MySQL中的SQL语句是不区分大小写的,因此SELECT和select的作用是相同的,但是,许多开发人员习惯将关键字大写、数据列和表名小写,读者也应该养成一个良好的编程习惯,这样写出来的代码更容易阅读和维护。

3.2 列的别名

  • 重命名一个列

  • 便于计算

  • 紧跟列名,也可以在列名和别名之间加入关键字AS,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写。

  • AS 可以省略

  • 建议别名简短,见名知意

  • 举例

    SELECT last_name AS name, commission_pct comm
    FROM   employees;
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IrEF2Uih-1668912884242)(images/1554951616598.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cHmeKxfm-1668912884243)(images/1554951622467.png)]

    SELECT last_name "Name", salary*12 "Annual Salary"
    FROM   employees;
    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kVWQ1BfY-1668912884244)(images/1554951648377.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6rDUTKij-1668912884245)(images/1554951655368.png)]

3.3 去除重复行

默认情况下,查询会返回全部行,包括重复行。

SELECT department_id
FROM   employees;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cQxRUOgf-1668912884247)(images/1554951711115.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zY5N1rye-1668912884248)(images/1554951715923.png)]

在SELECT语句中使用关键字DISTINCT去除重复行

SELECT DISTINCT department_id
FROM   employees;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-85npebWS-1668912884249)(images/1554951796570.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qp5MhPo9-1668912884250)(images/1554951801044.png)]

针对于:

SELECT DISTINCT department_id,salary 
FROM employees;

这里有两点需要注意:

  1. DISTINCT 需要放到所有列名的前面,如果写成SELECT salary, DISTINCT department_id FROM employees会报错。
  2. DISTINCT 其实是对后面所有列名的组合进行去重,你能看到最后的结果是 74 条,因为这 74 个部门id不同,都有 salary 这个属性值。如果你想要看都有哪些不同的部门(department_id),只需要写DISTINCT department_id即可,后面不需要再加其他的列名了。

3.4 空值参与运算

  • 所有运算符或列值遇到null值,运算的结果都为null
SELECT employee_id,salary,commission_pct,
12 * salary * (1 + commission_pct) "annual_sal"
FROM employees;

这里你一定要注意,在 MySQL 里面, 空值不等于空字符串。一个空字符串的长度是 0,而一个空值的长度是空。而且,在 MySQL 里面,空值是占用空间的。

3.5 着重号

  • 错误的
mysql> SELECT * FROM ORDER;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER' at line 1
  • 正确的
mysql> SELECT * FROM `ORDER`;
+----------+------------+
| order_id | order_name |
+----------+------------+
|        1 | shkstart   |
|        2 | tomcat     |
|        3 | dubbo      |
+----------+------------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM `order`;
+----------+------------+
| order_id | order_name |
+----------+------------+
|        1 | shkstart   |
|        2 | tomcat     |
|        3 | dubbo      |
+----------+------------+
3 rows in set (0.00 sec)
  • 结论

我们需要保证表中的字段、表名等没有和保留字、数据库系统或常用方法冲突。如果真的相同,请在SQL语句中使用一对``(着重号)引起来。

3.6 5、查询常数

SELECT 查询还可以对常数进行查询。对的,就是在 SELECT 查询结果中增加一列固定的常数列。这列的取值是我们指定的,而不是从数据表中动态取出的。

你可能会问为什么我们还要对常数进行查询呢?

SQL 中的 SELECT 语法的确提供了这个功能,一般来说我们只从一个表中查询数据,通常不需要增加一个固定的常数列,但如果我们想整合不同的数据源,用常数列作为这个表的标记,就需要查询常数。

比如说,我们想对 employees 数据表中的员工姓名进行查询,同时增加一列字段corporation,这个字段固定值为“尚硅谷”,可以这样写:

SELECT '尚硅谷' as corporation, last_name FROM employees;

4. 显示表结构

使用DESCRIBE 或 DESC 命令,表示表结构。

DESCRIBE employees;
或
DESC employees;
mysql> desc employees;
+----------------+-------------+------+-----+---------+-------+
| Field          | Type        | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| employee_id    | int(6)      | NO   | PRI | 0       |       |
| first_name     | varchar(20) | YES  |     | NULL    |       |
| last_name      | varchar(25) | NO   |     | NULL    |       |
| email          | varchar(25) | NO   | UNI | NULL    |       |
| phone_number   | varchar(20) | YES  |     | NULL    |       |
| hire_date      | date        | NO   |     | NULL    |       |
| job_id         | varchar(10) | NO   | MUL | NULL    |       |
| salary         | double(8,2) | YES  |     | NULL    |       |
| commission_pct | double(2,2) | YES  |     | NULL    |       |
| manager_id     | int(6)      | YES  | MUL | NULL    |       |
| department_id  | int(4)      | YES  | MUL | NULL    |       |
+----------------+-------------+------+-----+---------+-------+
11 rows in set (0.00 sec)

其中,各个字段的含义分别解释如下:

  • Field:表示字段名称。
  • Type:表示字段类型,这里 barcode、goodsname 是文本型的,price 是整数类型的。
  • Null:表示该列是否可以存储NULL值。
  • Key:表示该列是否已编制索引。PRI表示该列是表主键的一部分;UNI表示该列是UNIQUE索引的一部分;MUL表示在列中某个给定值允许出现多次。
  • Default:表示该列是否有默认值,如果有,那么值是多少。
  • Extra:表示可以获取的与给定列有关的附加信息,例如AUTO_INCREMENT等。

5. 过滤数据

  • 背景:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SE006y4L-1668912884251)(images/1554952199742.png)]

  • 语法:

    SELECT 字段1,字段2
    FROM 表名
    WHERE 过滤条件
    
    • 使用WHERE 子句,将不满足条件的行过滤掉
    • WHERE子句紧随 FROM子句
  • 举例

SELECT employee_id, last_name, job_id, department_id
FROM   employees
WHERE  department_id = 90 ;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1cdnOgEA-1668912884252)(images/1554952277028.png)]

CREMENT等。

5. 过滤数据

  • 背景:

[外链图片转存中…(img-SE006y4L-1668912884251)]

  • 语法:

    SELECT 字段1,字段2
    FROM 表名
    WHERE 过滤条件
    
    • 使用WHERE 子句,将不满足条件的行过滤掉
    • WHERE子句紧随 FROM子句
  • 举例

SELECT employee_id, last_name, job_id, department_id
FROM   employees
WHERE  department_id = 90 ;

[外链图片转存中…(img-1cdnOgEA-1668912884252)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/20403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【用户画像】Redis的常用五大数据类型和配置文件介绍

文章目录一 常用五大数据类型简介1 Redis键(key)2 Redis字符串(String)3 Redis列表(List)4 Redis集合(Set)5 Redis哈希(Hash)6 Redis有序集合Zset(sorted set)二 Redis配置文件介绍1 UNITS2 INCLUDES3 NETWORK4 MEMORY MANAGEMENT一 常用五大数据类型简介 常用命令 1 Redis键…

攻防世界碎纸机11

碎纸机11 题目描述:我们从碎纸机里抢救回来了某个关键图片资料,你能帮我们修复它吗? 题目环境:https://download.csdn.net/download/m0_59188912/87094757 打开文件,发现是让我们拼图。 可以用python脚本进行拼接。 脚…

pytorch初学笔记(七):神经网络基本骨架 torch.nn.Module

目录 一、 torch.nn模块 二、module模块 三、自定义搭建神经网络 一、 torch.nn模块 torch.nn — PyTorch 1.13 documentation 二、module模块 Module — PyTorch 1.13 documentation 我们自己定义的神经网络需要继承nn.Module类,需要重写以下两个方法&#xf…

智慧林业解决方案-最新全套文件

智慧林业解决方案-最新全套文件一、建设背景二、建设架构1、火险预警2、AI林火分析3、应急指挥4、森林资源GIS5、林业巡检6、林业OA三、建设方案四、获取 - 智慧林业全套最新解决方案合集一、建设背景 森林资源是林地及其所生长的森林有机体的总称,以林木资源为主&…

设计模式之设计原则

程序设计的要遵循的一些理论,也可以理解为程序设计的一种要求和目标,是面向对象程序设计的基石,也是面向对象程序设计的质量保障和依据。设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为…

Python基础语法入门

14天学习训练营导师课程: 李宁《Python Pygame游戏开发入门与实战》 李宁《计算机视觉OpenCV Python项目实战》1 李宁《计算机视觉OpenCV Python项目实战》2 李宁《计算机视觉OpenCV Python项目实战》3 上一节课,我们了解了基础环境如何配置&#xff0c…

【深度学习】图像分类数据集Fashion-MNIST

今天在手撸深度学习代码的时候,遇到了这个数据集,但是调用的函数的参数和功能不是很明白,因此选择写篇博客总结一下。 一、介绍 Fashion-MNIST是⼀个10类服饰分类数据集。 torchvision 包:它是服务于 PyTorch 深度学习框架的&a…

springboot+maven大学校友活动风采展示管理信息系统

大学校友管理信息系统当然也不能排除在外,从校友活动、校友风采的统计和分析,在过程中会产生大量的、各种各样的数据。本文以大学校友管理信息系统为目标,采用B/S模式,以SSM为开发框架,Jsp为开发技术、Eclipse/idea为开…

计算机毕业设计之java+ssm爱家房屋租赁信息管理系统

项目介绍 本爱家房屋租赁信息管理系统是针对目前房屋租赁信息管理的实际需求,从实际工作出发,对过去的房屋租赁信息管理系统存在的问题进行分析,结合计算机系统的结构、概念、模型、原理、方法,在计算机各种优势的情况下&#xf…

Linux进阶-编辑器以及Shell编程

常用两个编辑器 gedit编辑器:依赖图形界面。 vi/vim编辑器:sudo apt install vim(安装vim编辑器) vim与vi的区别: vim是vi的升级版本,兼容vi; vi按u只能撤销上次命令,而在vim里…

java计算机毕业设计基于安卓Android的校园单车租赁App

项目介绍 校园单车租赁APP管理是校园单车租赁管理中对用户必不可少的一个部分。在人们校园单车租赁管理的整个过程中,校园单车租赁APP管理担负着最重要的角色。为满足如今日益复杂的管理需求,各类校园单车租赁APP管理程序也在不断改进。本课题所设计的校园单车租赁APP,使用ssm框…

Nginx源码分析--内存池

1.问题引入 使用C语言编程时,一般使用malloc和free进行动态内存申请和释放。如果一不小心忘记了调用free进行释放,很容易造成内存泄露。另一方面,频繁地进行malloc和free操作,很容易造成内存碎片。与此同时,因为mallo…

[Spring Cloud] nacos作为服务中心

✨✨个人主页:沫洺的主页 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专…

【C语言从0到1之指针】(详解,赶紧收藏期末考试备用)

🕺作者:启明星使 🎃专栏:《数据库》《C语言》《数据结构》 🏇分享喜欢的一句话:去发光,而不是等待被照亮​ 目录 1. 指针是什么 内存 指针变量 总结: 外: 2. 指针和…

比 O(nlog(n)) 做得更好 — 5.结束语和基准

这就是 groupSort 真正优于 mergeSort 的地方。 长按关注《Python学研大本营》,加入读者群,分享更多精彩 扫码关注《Python学研大本营》,加入读者群,分享更多精彩 最后的想法 我们知道,将一个大问题分解为一系列更小…

vmware虚拟机黑屏问题

💐文章适合于所有的相关人士进行学习💐 1.问题描述 VMware虚拟机出现了黑屏现象,打开虚拟机挂起能看到显示,但一开就黑屏。下面就给大家说说虚拟机黑屏怎么办,vmware虚拟机开机黑屏的解决方法。 大多数同学在安装第…

策略验证_卖出口诀_长箭射天股价落地

写在前面: 1. 本文中提到的“股票策略校验工具”的具体使用操作请查看该博文; 2. 文中知识内容来自书籍《同花顺炒股软件从入门到精通》 3. 本系列文章是用来学习技法,文中所得内容都仅仅只是作为演示功能使用 目录 解说 策略代码 结果 解…

mysql运行报错:

Install/Remove of the Service Denied!解决办法:Install/Remove of the Service Denied解决办法 上面报错看这篇:MySQL本地连接报错:ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061) 上面报错看这篇&#xf…

【Ubuntu】实现windows和ubuntu之间的共享文件

实现windows和ubuntu之间的共享文件一、配置windows和ubuntu之间的共享文件夹(方式1)二、通过将windows中的文件拖拽到ubuntu的终端之上(方式2)一、配置windows和ubuntu之间的共享文件夹(方式1) VMware菜单…

UE Select File / Folder Window 插件说明

本插件可以在蓝图中打开系统自带的文件/文件夹选择窗口。并且可以在打包出发行包。 1. Open Load File Window 打开文件读取选择窗口,只能单选文件,此函数只是返回文件路径,不会真正读取文件信息 输入 Dialog Title :打开窗口的…