第三章:基本的SELECT语句

张开发
2026/5/8 16:28:58 15 分钟阅读

分享文章

第三章:基本的SELECT语句
1. SQL概述1.1 SQL背景知识1946 年世界上第一台电脑诞生如今借由这台电脑发展起来的互联网已经自成江湖。在这几十年里无数的技术、产业在这片江湖里沉浮有的方兴未艾有的已经几幕兴衰。但在这片浩荡的 波动里有一门技术从未消失甚至“老当益壮”那就是 SQL。四五十年前也就是 1974 年IBM 研究员发布了一篇揭开数据库技术的论文《SEQUEL一门结构化的英语查询语言》直到今天这门结构化的查询语言并没有太大的变化相比于其他语言 SQL 的半衰期可以说是非常长了。不论是前端工程师还是后端算法工程师都一定会和数据打交道都需要了解如何又快又准确地 提取自己想要的数据。更别提数据分析师了他们的工作就是和数据打交道整理不同的报告以 便指导业务决策。SQLStructured Query Language结构化查询语言是使用关系模型的数据库应用语言与数据直接打交道由 IBM 上世纪70年代开发出来。后由美国国家标准局ANSI开始着手制定SQL标准 先后有 SQL-86SQL-89SQL-92 SQL-99 等标准。SQL 有两个重要的标准分别是 SQL92 和 SQL99它们分别代表了 92 年和 99 年颁布的 SQL 标 准我们今天使用的 SQL 语言依然遵循这些标准。不同的数据库生产厂商都支持SQL语句但都有特有内容。1.2 SQL语言排行榜自从 SQL 加入了 TIOBE 编程语言排行榜就一直保持在 Top 101.3 SQL 分类SQL语言在功能上主要分为如下3大类DDLData Definition Languages、数据定义语言这些语句定义了不同的数据库、表、视图、索 引等数据库对象还可以用来创建、删除、修改数据库和数据表的结构。主要的语句关键字包括 CREATE 、 DROP 、 ALTER 等。DMLData Manipulation Language、数据操作语言用于添加、删除、更新和查询数据库记 录并检查数据完整性。主要的语句关键字包括 INSERT 、 DELETE 、 UPDATE 、 SELECT 等。SELECT是SQL语言的基础最为重要。DCLData Control Language、数据控制语言用于定义数据库、表、字段、用户的访问权限和 安全级别。主要的语句关键字包括 GRANT 、 REVOKE 、 COMMIT 、 ROLLBACK 、 SAVEPOINT 等。因为查询语句使用的非常的频繁所以很多人把查询语句单拎出来一类DQL数据查询语言。 还有单独将 COMMIT 、 ROLLBACK 取出来称为TCL Transaction Control Language事务控制语言。2. SQL语言的规则与规范2.1 基本规则SQL 可以写在一行或者多行。为了提高可读性各子句分行写必要时使用缩进每条命令以 ; 或 \g 或 \G 结束关键字不能被缩写也不能分行关于标点符号必须保证所有的()、单引号、双引号是成对结束的必须使用英文状态下的半角输入方式字符串型和日期时间类型的数据可以使用单引号 表示列的别名尽量使用双引号 而且不建议省略as2.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.sql3. 基本的SELECT语句3.0 SELECT...SELECT 1; #没有任何子句 SELECT 9/2; #没有任何子句3.1 SELECT ... FROM语法SELECT 标识选择哪些列 FROM 标识从哪个表中选择选择全部列SELECT * FROM departments一般情况下除非需要使用表中所有的字段数据最好不要使用通配符‘*’。使用通配符虽然可以节 省输入查询语句的时间但是获取不需要的列数据通常会降低查询和所使用的应用程序的效率。通 配符的优势是当不知道所需要的列的名称时可以通过它获取它们。在生产环境下不推荐你直接使用 SELECT * 进行查询选择特定的列SELECT department_id, location_id FROM departments;MySQL中的SQL语句是不区分大小写的因此SELECT和select的作用是相同的但是许多开发人员习惯将关键字大写、数据列和表名小写读者也应该养成一个良好的编程习惯这样写出来的代码更容易阅读和维护。3.2 列的别名重命名一个列便于计算紧跟列名也可以在列名和别名之间加入关键字AS别名使用双引号以便在别名中包含空格或特 殊的字符并区分大小写。AS 可以省略建议别名简短见名知意举例SELECT last_name AS name, commission_pct comm FROM employees;SELECT last_name AS name, commission_pct comm FROM employees;SELECT last_name Name, salary*12 Annual Salary FROM employees;3.3 去除重复行默认情况下查询会返回全部行包括重复行SELECT department_id FROM employees;在SELECT语句中使用关键字DISTINCT去除重复行SELECT DISTINCT department_id FROM employees;SELECT DISTINCT department_id,salary FROM employees;针对于上述sql这里有两点需要注意DISTINCT 需要放到所有列名的前面如果写成 SELECT salary, DISTINCT department_id FROM employees 会报错。DISTINCT 其实是对后面所有列名的组合进行去重你能看到最后的结果是 74 条因为这 74 个部 门id不同都有 salary 这个属性值。如果你想要看都有哪些不同的部门department_id只需 要写DISTINCT department_id 即可后面不需要再加其他的列名了。3.4 空值参与运算所有运算符或列值遇到null值运算的结果都为nullSELECT 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正确的结论我们需要保证表中的字段、表名等没有和保留字、数据库系统或常用方法冲突。如果真的相同请在 SQL语句中使用一对着重号引起来。3.6 查询常数SELECT 查询还可以对常数进行查询。对的就是在 SELECT 查询结果中增加一列固定的常数列。这列的 取值是我们指定的而不是从数据表中动态取出的。你可能会问为什么我们还要对常数进行查询呢SQL 中的 SELECT 语法的确提供了这个功能一般来说我们只从一个表中查询数据通常不需要增加一个 固定的常数列但如果我们想整合不同的数据源用常数列作为这个表的标记就需要查询常数。比如说我们想对 employees 数据表中的员工姓名进行查询同时增加一列字段 corporation 这个 字段固定值为“尚硅谷”可以这样写SELECT 尚硅谷 as corporation, last_name FROM employees;4. 显示表结构使用DESCRIBE 或 DESC 命令表示表结构。其中各个字段的含义分别解释如下Field表示字段名称。Type表示字段类型这里 barcode、goodsname 是文本型的price 是整数类型的。Null表示该列是否可以存储NULL值。Key表示该列是否已编制索引。PRI表示该列是表主键的一部分UNI表示该列是UNIQUE索引的一 部分MUL表示在列中某个给定值允许出现多次。Default表示该列是否有默认值如果有那么值是多少。Extra表示可以获取的与给定列有关的附加信息例如AUTO_INCREMENT等。5. 过滤数据背景SELECT 字段1,字段2 FROM 表名 WHERE 过滤条件使用WHERE 子句将不满足条件的行过滤掉WHERE子句紧随 FROM子句举例SELECT employee_id, last_name, job_id, department_id FROM employees WHERE department_id 90

更多文章