RBHGO的主页欢迎关注
温馨提示:创作不易,如有转载,注明出处,感谢配合~
SQL —> DQL —> select
这里只写了select
,不代表只有select
。在用SQL语句查询时,SQL语句它是多变的,同一条题目要求会有很多不同的写法,所有只有写的足够多,不管遇到什么样的查询,我们都能有方法写出来。本文以三个难度依次递增的查询题目主要分享MySQL但不仅限于MySQL的SQL查询。
-- 1.查看SQL执行计划
-- 2.使用性能剖析系统
-- explain select语句 ---> 得到搜索语句的性能
-- type性能(坏->好) ALL -> index -> range -> ref -> ref eg -> const/svstem
就像Python学习日志15中提到的,我们首先要在数据库中建立多表,且表与表之间要具有联系。所以现在我们就来在以shool这个数据库为例,建立多个表。
MySQL 中支持多种类型的运算符,包括:算术运算符(+
、-
、*
、/
、%
)、比较运算符(=
、<>
、<=>
、<
、<=
、>
、>=
、BETWEEN...AND..
.、IN
、IS NULL
、IS NOT NULL
、LIKE
、RLIKE
、REGEXP
)、逻辑运算符(NOT
、AND
、OR
、XOR
)和位运算符(&
、|
、^
、~
、>>
、<<
),我们可以在 DQL 中使用这些运算符处理数据。
在查询数据时,可以在SELECT
语句及其子句(如WHERE
子句、ORDER BY
子句、HAVING
子句等)中使用函数,这些函数包括字符串函数、数值函数、时间日期函数、流程函数等。
函数不会用没关系,上面那一篇分享中也提到过,通过?
+函数名
(?function查看所有函数)可以得到函数的使用方法。
这里以ROUND函数为例子我们在命令提示符(Workbench中不行)中mysql -u root -p
进入MySQL(前提是您装了MySQL),? round
,我们就会得到反馈大致如下:
round()
—> 四舍五入,可以设定位数
温馨提示: SQL语句在不同数据库间相通,但会有些许不同,意思就是每一种数据库都会有自己的”方言“,我这里前提是MySQL。
函数 | 功能 |
---|---|
CONCAT |
将多个字符串连接成一个字符串 |
FORMAT |
将数值格式化成字符串并指定保留几位小数 |
FROM_BASE64 / TO_BASE64 |
BASE64解码/编码 |
BIN / OCT / HEX |
将数值转换成二进制/八进制/十六进制字符串 |
LOCATE |
在字符串中查找一个子串的位置 |
LEFT / RIGHT |
返回一个字符串左边/右边指定长度的字符 |
LENGTH / CHAR_LENGTH |
返回字符串的长度以字节/字符为单位 |
LOWER / UPPER |
返回字符串的小写/大写形式 |
LPAD / RPAD |
如果字符串的长度不足,在字符串左边/右边填充指定的字符 |
LTRIM / RTRIM |
去掉字符串前面/后面的空格 |
ORD / CHAR |
返回字符对应的编码/返回编码对应的字符 |
STRCMP |
比较字符串,返回-1、0、1分别表示小于、等于、大于 |
SUBSTRING |
返回字符串指定范围的子串 |
函数 | 功能 |
---|---|
ABS |
返回一个数的绝度值 |
CEILING / FLOOR |
返回一个数上取整/下取整的结果 |
CONV |
将一个数从一种进制转换成另一种进制 |
CRC32 |
计算循环冗余校验码 |
EXP / LOG / LOG2 / LOG10 |
计算指数/对数 |
POW |
求幂 |
RAND |
返回[0,1)范围的随机数 |
ROUND |
返回一个数四舍五入后的结果 |
SQRT |
返回一个数的平方根 |
TRUNCATE |
截断一个数到指定的精度 |
SIN / COS / TAN / COT / ASIN / ACOS / ATAN |
三角函数 |
SUM |
返回条件下的数值的和 |
AVG |
返回条件下的数值的平均数 |
MAX / MIN |
最大值 / 最小值 |
函数 | 功能 |
---|---|
CURDATE / CURTIME / NOW |
获取当前日期/时间/日期和时间 |
ADDDATE / SUBDATE |
将两个日期表达式相加/相减并返回结果 |
DATE / TIME |
从字符串中获取日期/时间 |
YEAR / MONTH / DAY |
从日期中获取年/月/日 |
HOUR / MINUTE / SECOND |
从时间中获取时/分/秒 |
DATEDIFF / TIMEDIFF |
返回两个时间日期表达式相差多少天/小时 |
MAKEDATE / MAKETIME |
制造一个日期/时间 |
函数 | 功能 |
---|---|
IF |
根据条件是否成立返回不同的值 |
IFNULL |
如果为NULL则返回指定的值否则就返回本身 |
NULLIF |
两个表达式相等就返回NULL否则返回第一个表达式的值 |
函数 | 功能 |
---|---|
MD5 / SHA1 / SHA2 |
返回字符串对应的哈希摘要 |
CHARSET / COLLATION |
返回字符集/校对规则 |
USER / CURRENT_USER |
返回当前用户 |
DATABASE |
返回当前数据库名 |
VERSION |
返回当前数据库版本 |
FOUND_ROWS / ROW_COUNT |
返回查询到的行数/受影响的行数 |
LAST_INSERT_ID |
返回最后一个自增主键的值 |
UUID / UUID_SHORT |
返回全局唯一标识符 |
如果您看到这里并且对此感兴趣,那么请一条一条的和我写下来,我在题目上基本都有会提示,并且会 一 一 介绍碰到的知识。如果您能看懂每一条语句,并且您都可以独立写下来,那么您对SQL查询语句就已经基本掌握。后续如果能继续练习,那么基本上您以后遇到的SQL查询,都可以用以下的方法做出来。
第一个数据库是学校库,有学生表、老师表、课程表、学院表、选课记录表。表与表之间都存在着关系,分别是1对1、一对多和多对多,我们建表之间应该对他们的关系应该做到心里有数,不过增删改不是这篇分享的重点。
-- 如果存在名为school的数据库就删除它
drop database if exists `school`;
-- 创建名为school的数据库并设置默认的字符集和排序方式
create database `school` default character set utf8mb4;
-- 切换到school数据库上下文环境
use `school`;
-- 创建学院表
create table `tb_college`
(
`col_id` int unsigned auto_increment comment '编号',
`col_name` varchar(50) not null comment '名称',
`col_intro` varchar(500) default '' comment '介绍',
primary key (`col_id`)
) engine=innodb auto_increment=1 comment '学院表';
-- 创建学生表
create table `tb_student`
(
`stu_id` int unsigned not null comment '学号',
`stu_name` varchar(20) not null comment '姓名',
`stu_sex` boolean default 1 not null comment '性别',
`stu_birth` date not null comment '出生日期',
`stu_addr` varchar(255) default '' comment '籍贯',
`col_id` int unsigned not null comment '所属学院',
primary key (`stu_id`),
constraint `fk_student_col_id` foreign key (`col_id`) references `tb_college` (`col_id`)
) engine=innodb comment '学生表';
-- 创建教师表
create table `tb_teacher`
(
`tea_id` int unsigned not null comment '工号',
`tea_name` varchar(20) not null comment '姓名',
`tea_title` varchar(10) default '助教' comment '职称',
`col_id` int unsigned not null comment '所属学院',
primary key (`tea_id`),
constraint `fk_teacher_col_id` foreign key (`col_id`) references `tb_college` (`col_id`)
) engine=innodb comment '老师表';
-- 创建课程表
create table `tb_course`
(
`cou_id` int unsigned not null comment '编号',
`cou_name` varchar(50) not null comment '名称',
`cou_credit` int not null comment '学分',
`tea_id` int unsigned not null comment '授课老师',
primary key (`cou_id`),
constraint `fk_course_tea_id` foreign key (`tea_id`) references `tb_teacher` (`tea_id`)
) engine=innodb comment '课程表';
-- 创建选课记录表
create table `tb_record`
(
`rec_id` bigint unsigned auto_increment comment '选课记录号',
`stu_id` int unsigned not null comment '学号',
`cou_id` int unsigned not null comment '课程编号',
`sel_date` date not null comment '选课日期',
`score` decimal(4,1) comment '考试成绩',
primary key (`rec_id`),
constraint `fk_record_stu_id` foreign key (`stu_id`) references `tb_student` (`stu_id`),
constraint `fk_record_cou_id` foreign key (`cou_id`) references `tb_course` (`cou_id`),
constraint `uk_record_stu_cou` unique (`stu_id`, `cou_id`)
) engine=innodb comment '选课记录表';
use school;
-- 插入学院数据
insert into `tb_college`
(`col_name`, `col_intro`)
values
('Python学院', 'Python 是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的。Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。'),
('Java学院', 'Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。Java 可运行于多个平台,如 Windows, Mac OS 及其他多种 UNIX 版本的系统。后来 Sun 公司被 Oracle (甲骨文)公司收购,Java 也随之成为 Oracle 公司的产品。Java 语言是简单的、Java 语言是面向对象的、Java语言是分布式的、Java 语言是健壮的、Java语言是安全的、Java 语言是体系结构中立的、Java 语言是可移植的、Java 语言是解释型的、Java 是高性能的、Java 语言是多线程的、Java 语言是动态的'),
('HTML学院', 'HTML 指的是超文本标记语言: HyperText Markup Language,它不是一种编程语言,而是一种标记语言,标记语言是一套标记标签 (markup tag),HTML 使用标记标签来描述网页,HTML文档包含了HTML标签及文本内容,HTML文档也叫做 web 页面');
-- 插入学生数据
insert into `tb_student`
(`stu_id`, `stu_name`, `stu_sex`, `stu_birth`, `stu_addr`, `col_id`)
values
(1001, '留一手', 1, '1990-3-4', '湖南长沙