MySQL-03基本的SELECT语句(基础)

发布时间 2023-12-05 23:14:30作者: 长名06

课程中,第二章是MySQL环境搭建,因为我是网上找的博客,下载zip,直接安装的,就没看视频,所以没有第二章笔记。这里给出MySQL社区版下载地址

C-03.基本的SELECT语句

1.SQL概述

1.1 SQL背景知识

  • 1974年,IBM研究员发布了一篇揭开数据库技术的论文《SEQUEL:一门结构化的英语查询语言》,直到今天这门结构化的查询语言并没有太大的变化,相比于其他语言,SQL的半衰期可以说是非常长了。
  • SQL(Structured Query Language,结构化查询语言)是使用关系模型的数据库应用语言,与数据直接打交道,由IBM上世纪70年代开发出来。后由美国国家标准局(ANSI)开始着手指定SQL标准,先后有SQL-86,SQL-89,SQL-92,SQL-99等标准。其中SQL-92和SQL-99,分别是1992年和1999年颁布的SQL标准,我们今天使用的SQL语言依然遵循这些标准。
  • 不同的数据库生产厂商都支持SQL语句,但也有其特定的内容。就像我们国家推行普通话,但是每个省份或地区里都会带一点自己地域特色的'普通话'一样。大部分指令或函数,是数据库都支持的,只是有些是某一个数据库支持的。

1.2 SQL分类

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

  • DDL(Data Definition Language、数据定义语言),这些语句定义了不同的数据库、表、视图、索引等数据库对象,还可以用来创建、删除、修改数据库和数据表的结构。
    • 主要的语句关键字有,CREATEDROPALTER等。
  • DML(Data Manipulation Language、数据操作语言),用于添加,删除,更新和查询数据库记录,并检查数据完整性。
    • 主要的语句关键字包括INSERTDELETEUPDATESELECT等。
    • SELECT是SQL语言的基础,最为重要。
  • DCL(Data Control Language、数据控制语言),用于定义数据库、表、字段、用户的访问权限和安全级别。
    • 主要的语句关键字包括GRANTREVOKECOMMITROLLBACKSAVEPOINT等。
  • 因为查询语句使用的最为频繁,所以很多人把查询语句单拎出来一类:DQL(Data Query Language、数据查询语言)。还有单独将COMMITROLLBACK取出来称为TCL(Transaction Control Language、事务控制语言)。

2.SQL语言的规则和规范

2.1 基本规则

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

2.4 SQL大小写规范

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

2.3 注释

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

单行注释 #注释内容(MySQL特有的)。
单行注释 -- 注释内容(--后必须包含一个空格)。
多行注释 /* 注释内容 */

2.4 命名规则

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

#创建表格
CREATE TABLE student info(...);#表名错误,因为表名有空格
CREATE TABLE srudent_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; #错误,别名中有空格时,""不可以省略

SELECT id AS "编号",name AS "姓名" FROM t_stu; #这一条才最符合SQL编写规范,不建议省略AS关键字和""

2.5 数据导入指令

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

mysql> source d:\mysqldb.sql;
DESC 表名 # 查看表结构

3.基本的SELECT语句

3.1 SELECT..

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

3.2 SELECT ... FROM tableName;

  • 语法
SELECT 标识选择的列
FROM 选择的表名
  • 选择全部列;
SELECT * 
FROM departments;

一般情况下,除非需要使用表中所有字段数据,否则不要使用通配符 '*'。使用通配符虽然可以节省输入查询语句的时间,但是获取不需要的列数据通常会降低查询和所使用的应用程序的效率。通配符的优势是,当不知道所需要的列的名称时,可以使用通配符获取。
在生产环境下,不推荐直接使用SELECT *进行查询。

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

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

3.3 列的别名

  • 重命名列;

  • 便于计算;

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

  • AS可以省略;

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

SELECT last_name AS name,commission_pct AS comm
FROM employees;

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

3.4 去除重复行

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

SELECT departmen_id
FROM employees;

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

SELECT DISTINCT department_id
FROM employees;

针对于:

SELECT DISTINCT department_id,salary
FROM employees;

这里有两点需要注意:

  1. DISTINCT需要放到所有列名的前面,如果写成 SELECT salary,DISTINCT department_id FROM employees;会报错。
  2. DISTINCT其实是对后面所有列名的组合进行去重

3.5 NULL参与运算

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

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

3.6 着重号

  • 错误的
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)
  • 结论
    需要保证表中的字段,表名等没有和保留字,数据库系统或常用方法冲突。如果真的相同,需要在SQL语句中使用一对着重号引起来。

3.7 查询常数

SELECT查询还可以对常数进行查询。对的,就是在SELECT查询结果中增加一列固定的常数列。这列的取值是我们制定的,而不是从数据表中动态取出的。
SQL中的SELECT语法的确提供了这个功能,一般来说我们只从一个表中查询数据,通常不需要增加一个固定的常数列,但如果我们想整合不同的数据源,用常数列作为这个表的标记,就需要查询常数。
比如说,我们相对employees数据表中的员工姓名进行查询,同时增加一列字段corporation,这个字段的固定值为“wind”,可以这样写:

SELECT 'wind' 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         | 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         | YES  | MUL | NULL    |       |
| department_id  | int         | YES  | MUL | NULL    |       |
+----------------+-------------+------+-----+---------+-------+
11 rows in set (0.00 sec)

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

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

5.过滤数据(WHERE)

  • 语法
SELECT 字段1,字段2
FROM 表名
WHERE 过滤条件
  • 使用WHERE子句,将不满足条件的行过滤掉。
  • WHERE子句紧随FROM子句。
  • 举例
mysql> SELECT employee_id,last_name,job_id,department_id
    -> FROM employees
    -> WHERE department_id = 90;
+-------------+-----------+---------+---------------+
| employee_id | last_name | job_id  | department_id |
+-------------+-----------+---------+---------------+
|         100 | King      | AD_PRES |            90 |
|         101 | Kochhar   | AD_VP   |            90 |
|         102 | De Haan   | AD_VP   |            90 |
+-------------+-----------+---------+---------------+
3 rows in set (0.00 sec)

本章练习

# 【题目】
#1.查询员工12个月的工资总和,并起别名为ANNUAL SALARY. ANNUAL adj.每年的,一年的;n.年报,一年生植物;
SELECT salary * 12 AS "ANNUAL_SALARY"
FROM employees;
#还有佣金列commission_pct
SELECT salary * 12 * (1 + IFNULL(commission_pct,0)) AS "ANNUAL_SALARY"
FROM employees;

#2.查询employees表中去除重复的job_id以后的数据
SELECT DISTINCT job_id
FROM employees;

#3.查询工资大于12000的员工姓名和工资 complete adj.完全的,完整的;v.完成,使完整,结束;
SELECT CONCAT(first_name," ",last_name) AS "complete_name",salary
FROM employees
WHERE salary > 12000;

#4.查询员工工号为176员工的姓名和部门号
SELECT CONCAT(first_name," ",last_name) AS "complete_name",department_id
FROM employees
WHERE employee_id = 176;

#5.显示表departments的结构,并查询其中的全部数据
DESCRIBE departments;#DESC departments;
SELECT * FROM departments;

只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。