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

这篇具有很好参考价值的文章主要介绍了MySQL-03.基本的SELECT语句(基础)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

课程中,第二章是MySQL环境搭建,因为我之前安装过MySQL5.7的环境,然后就直接下载8.0版本的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)

6.CASE子句

6.1语法格式

CASE WHEN condition1 THEN result1
	 WHEN condition2 THEN result2
	 ELSE result3 END '本列的别名';
# 如果使用END ''这种方式为本列起别名,则在该列外不能用小括号包括

(CASE WHEN condition1 THEN result1
 	WHEN condition2 THEN result2
 	ELSE result3 END ) AS '本列的别名'; 

6.2 案例

-- 执行正确
SELECT empid,`name`,birthday,(CASE WHEN YEAR(birthday) < 1980 THEN '老年'
                                    WHEN YEAR(birthday) >=1990 THEN '青壮年'
                                    ELSE '中年' END ) AS '年龄段'
FROM employee; 

-- 执行正确
SELECT empid,`name`,birthday,CASE WHEN YEAR(birthday) < 1980 THEN '老年'
                                    WHEN YEAR(birthday) >=1990 THEN '青壮年'
                                    ELSE '中年' END '年龄段'
FROM employee; 

-- 执行失败
SELECT empid,`name`,birthday,(CASE WHEN YEAR(birthday) < 1980 THEN '老年'
                                    WHEN YEAR(birthday) >=1990 THEN '青壮年'
                                    ELSE '中年' END '年龄段')
FROM employee; 

#失败原因,此时END '年龄段' => END AS '年龄段' 其实就是给当前列起别名 
#上面语句,相当于把 (列名 AS '别名') 列名和别名括起来了 这时执行mysql服务就会报错
#SELECT (original_column_name AS new_column_name) FROM table_name 这样格式查询语句是错误的
SELECT (depid AS 'depId') FROM department;
-- 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 'AS 'depId') FROM department' at line 1

本章练习

# 【题目】
#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;

只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。文章来源地址https://www.toymoban.com/news/detail-750061.html

到了这里,关于MySQL-03.基本的SELECT语句(基础)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL(六):基本的SELECT语句

    本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远! 语法: 选择全部列: 一般情况下,除非需要使用表中所有的字段数据,最好不要使用通配符‘ *

    2024年02月08日
    浏览(43)
  • 基本的SELECT语句——“MySQL数据库”

    各位CSDN的uu们好呀,好久没有更新小雅兰的MySQL数据库专栏啦,接下来一段时间,小雅兰都会更新MySQL数据库的知识,下面,让我们进入今天的主题吧——基本的SELECT语句!!! SQL概述 SQL语言的规则与规范 基本的SELECT语句 显示表结构 过滤数据 1946 年,世界上第一台电脑诞生

    2024年02月09日
    浏览(59)
  • Mysql数据库(六):基本的SELECT语句

    本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远! 语法: 选择全部列: 一般情况下,除非需要使用表中所有的字段数据,最好不要使用通配符‘ *

    2024年02月08日
    浏览(63)
  • 第二章:AI大模型的基本原理2.2 深度学习基础2.2.3 循环神经网络

    循环神经网络(Recurrent Neural Networks,RNN)是一种特殊的神经网络结构,它可以处理序列数据,如自然语言、时间序列预测等。RNN的核心特点是包含反馈连接,使得网络具有内存功能,可以在处理序列数据时保留以前的信息。这一特性使得RNN成为处理自然语言和时间序列数据的

    2024年01月16日
    浏览(44)
  • mysql,用sql语句,建立学生-课程数据库基本表

    学生表 学号 姓名 年龄 性别 院系 Student Sno Sname Sage Ssex Sdept 课程表 课程号 课程名 先行课 学分 Course Cno Cname Cpno Ccredit 选课表 学号 课程号 成绩 SC Sno Cno Grade 注意创建表的时候要注意它的字段名,类型,长度,约束条件,取值范围要合适,大小写符号要正确,中文逗号,分号

    2024年02月08日
    浏览(59)
  • 【算法】算法设计与分析 课程笔记 第一章&第二章

    算法的四个性质: 输入、输出、确定性和有穷性 。 1. 常见的时间复杂度 常数阶 O(1) 对数阶 O(log n) 线性阶 O(n) 线性对数阶 O(nlog n) 平方阶 O(n^2) 立方阶 O(n^3) k 次方阶 O(n^k) 指数阶 O(2^n) 注:上面的 log n 均代表 以2为底 的对数。 2. 时间复杂度排序 常见的算法时间复杂度由小到

    2024年02月09日
    浏览(44)
  • 第二章:基本概念(下)

    人们往往将信号称为**“软件中断”**。进程收到信号,就意味着某一事件或异常情况的发生。 信号的类型很多,每一种分别标识不同的事件或情况。采用 不同的整数 来标识各种信号类型,并以SIGxxxx 形式的符号名加以定义。 内核、其他进程(只要具有相应的权限)或进程自

    2024年02月08日
    浏览(48)
  • 第二章 图像基本运算及变换

    本章主要讲解图像的一些基本运算及仿射变换以及透视变换。 图像相加 imgA + imgB :当其和大于一个字节时, 大于一个字节的位数将被丢失,类似于取模。 ( A + B ) % 256 (A + B) % 256 ( A + B ) %256 cv2.add(imgA, imgB) :当数值超过 255 时,取值为 255 m i n ( A + B , 255 ) min(A + B, 255) min ( A

    2024年02月03日
    浏览(54)
  • 第二章VHDL基本知识

    2.1.1 空白符b,t 2.1.2注释符 单行注释:// 多行注释:/*    8/ 2.1.3标识符 字母,数字,符号,下划线,区分大小写,第一个字符必须是字母或者下划线 2.1.3转移标识符 以开头,以空白结尾, 2.1.4 用来VHDL内部使用的词叫,所有的都是小写 2.1.5数值 0  低电

    2024年02月06日
    浏览(65)
  • C++第二章:变量和基本内置类型

    C++定义了一套包括算数类型和空类型在内的基本数据类型。 其中算数类型包含了字符、整形数、布尔值、浮点数。空类型不对应具体的值,仅用于一些特殊的场合,例如最常见的是:当一个函数不返回任何值时使用空类型作为返回类型。 算数类型分为两种:整形(包括字符和

    2024年02月06日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包