MySQL~(详细)案例
Posted lxw-pro
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL~(详细)案例相关的知识,希望对你有一定的参考价值。
SQL目录
- `例3-1` 创建一个名为“Bookstore”的数据库:
- `例3-2` 创建一个名为“Bookstore” 的数据库,采用字符集 gb2312 和校对规则gb2312_chinese_ci
- `例3-3` 修改数据库 “Bookstore”的默认字符集为 “utf8mb4”、校对规则为“utf8mb4_09900_ai_ci”:
- 例3-4: 假设已经创建了数据库Bookstore,则在该数据库中创建图书目录表“book”。
- 例3-5 :假设已经在数据库Bookstore中创建了表book,表中存在”书名“列。在表book中增加”浏览次数“列,并将表中的”书名“列删除。
- 例 3-6:假设数据库Bookstore中已经存在表book,将表book重命名为mybook。
- 例 3-7:假设数据库Bookstore中已经存在表mybook和members,将表mybook重命名为mylist,表Members 重命名为memberlist。
- 例 3-8:假设数据库Bookstore中有一个表book,创建表book的一个名为book_copy1的副本。
- 例 3-9:创建表book的一个名为book_coopy2的副本,并且复制其内容。
- 例 3-10:删除表test:
- 例 3-11:显示Bookstore数据库建立的数据表文件。
- 例 3-12:用DESCRIBE语句查看book表中列的信息。
- 例 3-13:查看book表”图书编号“列的信息。
- 例3-14:创建表book_copy,将”书名“定义为主键。
- 例3-15:创建course表来记录每门课程的学生的”学号“”姓名“”课程号“”学分““毕业日期“。其中”学号“”课程号“”毕业日期“构成复合主键。
- 例 3-16:参照例3-15中的course表创建course1表,将索引命名为“INEDX_course”.
- 例 3-17:在表book_copy1中,将“图书编号”作为主键,将“书名”列定义为一个替代键。
- 例 3-18:假设book表中主键为设定,为book表建立主键约束为“图书编号”,“书名”为替代键约束。()
- 例 3-19:删除book表中的主键和替代键约束。()
- 例 3-20:创建book_ref表,book_ref表中所有“图书编号”都必须出现在book表中,假设已经使用“图书编号”列作为book表主键。()
- 例 3-21:创建带有参照动作“cascade”的book_ref1表。
- 例 3-22:在网络图书销售系统中,只有会员才能下订单。因此sell表中的所有“用户号”也必须出现在members表的“用户号”列中。这种约束通过定义参照完整性约束来实现。(须先创建表sell)
- 例 3-23:创建表student,只考虑学号和性别两列,性别只包含“男“或”女“两项。()
- 例 3-24:创建表student1,只考虑”学号“”出生日期“”学分“列,出生日期必须大于2001年1月1日。()上
- 例 3-25:创建表student2,有“学号“”最好成绩“”平均成绩“3列,要求最好成绩必须大于平局成绩。
- 例3-26:创建表student3,有”学号“”最好成绩“”平均成绩“3列,要求最好成绩必须大于平均成绩,且最好成绩不得超过100分。
- 例3-27:删除book表的主键,删除book_ref表的外键book_ref_ibfk_1,删除student表的check完整性约束student_chk_1.修改student1表的check完整性约束student1_chk_1属性,暂时不强制执行。
- 例4-1:向Bookstore数据库中的表book(表中列包括图书编号、图书类别、书名、作者、出版社、出版时间、单价、数量、折扣及封面图片)中插入一行数据"TP.9501,计算机,Dreamwearer,宝丽嘉,高等教育出版社,2022-01-20,33.25,52,0.8.null"。
- 例4-2:若表book中”图书类别“列的默认值为“计算机”,“封面图片”列的默认值为null,插入例4-1那行数据。
- 例4-3:向book表中插入一行数据“TP.2467,计算机,计算机基础,林华中,高等教育出版社,2022-01-23,42.5,45,0.8,ic.jpg"。
- 例4-4:向members表中插入两行数据”C0138,李华,女,147369,17885091065,2022-01-20“”C0139,张明,男,258456,17684271352,2020-09-23“。
- 例4-5:将bookstore数据库中book表的所有书籍数量都增加10.将members表中姓名为”张三”的员工的联系电话改为:“18798372060”,密码改为“147369”。
- 例4-6:订单号为6的客户因某种情况退回2本图书,请在sell表中修改订购册数,同时书退回后,book表中该图书的数量增加2。
- 例4-7:将bookstore数据库中姓名为“张三“的员工的记录删除。
- 例4-8:将book表中数量小于5的所有行删除。
- 例4-9:用户号为“D1973”的客户注销例,请在members表中将该用户记录删除,同时将其在sell表中的记录也删除。
- 例5-1:查询bookstore数据库的members表中各会员的姓名、联系电话和注册时间。
- 例5-2:查询book表中图书类别为“计算机”的图书书名、作者和出版社,结果中各列的标题分别指定为name、auther和publicsher。
- 例5-3:查询book表中的图书编号、书名和数量,对其库存数量按一下规则进行替换:若数量为空值,则替换为“尚未进货”;若数量小于5本,替换为“需进货”;若数量在5~50本的范围内,替换为“库存正常”;若数量大于50本,替换为“库存积压”。列标题更改为“库存”。
- 例5-4:对sell表中已发货的记录计算订购金额(订购金额=订购册数*订购单价),并显示图书编号和订购金额;
- 例5-5:对book表中只选择图书类别和出版社两列,消除结果集中的重复行。
- 例5-6:查询bookstore数据库book表中书名为“网页程序设计”的记录:
- 例5-7:查询book表中单价大于30元的图书情况:
- 例5-8:查询sell表中还未收货的订单号、订购时间和是否收货:
- 例5-9:查询book表中“清华大学出版社”or 出版社=“北京大学出版社”出版的价格大于等于35元的图书:
- 例5-10:查询sell表中已收货且已结清的订单情况:
- 例5-11:查询members表中姓”李“的用户的用户号、姓名及注册时间:
- 例5-12:查询book表中图书编号倒数第二位位6的图书的图书编号和书名:
- 例5-13:查询book表中书名包含下划线的图书:‘
- 例5-14:查询book表中2020年出版的图书的情况:
- 例5-15:a查询book表中”高等教育出版社“ ”北京大学出版社“”人民邮电出版社“出版的图书的情况:
- 例5-16:查询sell表中尚未发货的订单记录:
- 例5-17:从members表中检索出所有客户的信息,并使用表别名users。
- 例5-18:查找bookstore数据库中客户订购的图书书名、订购册数和订购时间。
- 例5-19:使用内连接实现例5-18所要求的查询:
- 例5-·20:用join关键字表达下列查询:查找购买《mysql数据库》且订购数量大于5本的图书信息。
- 例5-21:用join关键字表达下列查询:查找购买《mysql数据库》且订购数量大于5本的图书信息及用户姓名和订购册数:
- 例5-22:查找bookstore数据库中订单不同、图书编号相同的图书的订单号、图书编号和订购册数:
- 例5-23:查找members表中所有订购过图书的用户的姓名:
- 例5-24:查找所有“计算机”类图书的图书编号、单价及订购啦图书的客户的用户号,若用户号从未订购过,也要包括其情况:
- 例5-25:查找订购了图书的男性用户的订单号、图书编号、订购册数以及用户的姓名和联系电话:
- 例5-26:查找bookstore数据库中“张三”的订单信息:
- 例5-27:查找购买了除《mysql数据库》以外图书的用户信息:
- 例5-28:查找购买了图书编号为“TP.2525"的图书的用户信息:
- 例5-29:查找book表中所有比”网页设计“类图书价格都高的图书基本信息:
- 例5-30:查找sell表中订购册数不少于图书编号为”Ts.3035'的图书的任何一个订单的订购册数的订单信息:
- 例5-31:查找每次订购10本以上图书的用户的姓名:
- 例5-32:将sell表中用户“C0138"的订单的sql语句如下:
- 例5-33:将sell表中订购册数大于30本的订单和book表中数量大于50本的距离合并:
- 例5-34:求会员总人数:
- 例5-35:统计已收货的订单数:
- 例5-36:统计订购册数在5本以上的订单数:
- 例5-37:求图书编号为“TP.3035”的图书的额最高订购册数和最低订购册数:
- 例5-38:求图书编号为“Ts.3035”的图书的订购总册数:
- 例5-39:求图书编号为“Ts.3035”的图书的每笔订单平均册数:
- 例5-40:输出book表中的图书类别名:
- 例5-41:按图书类别统计book表中各类图书的库存数:
- 例5-42:按图书编号分类统计订单数和订单的平均订购册数:();
- 例5-43:按图书类别、出版社分类统计book表中各类图书的库存数:
- 例5-44:查找sell表中每个用户平均订购册数在5本以上的用户号和平均订购册数。
- 例5-45:查找sell表中用户的订单数在2笔及以上且每笔订购册数都在5本以上的用户。
- 例5-46:将book表中的记录按出版时间的先后排序:
- 例5-47:将sell表中的记录按订购册数从多到少排序:
- 例5-48:查找members表中注册时间最靠前的5位会员的信息:
- 例5-49:查找book表中从第四条记录开始的5条记录:
- 例6-1:创建Bookstore数据库上的jsj_sell视图,包括计算机类图书的销售订单号、图书编号、书名、订购册数等情况;要保证对该视图的订单修改都要符合计算机类这个条件。
- 例6-2:创建Bookstore数据库中”计算机“类图书销售视图sale_avg,包括书名(在视图中列名为”name")和该图书的平均订购册数(在视图中列名为sala_avg);
- 例6-3:在视图jsj_sell中查找“计算机”类图书的订单号和订购册数。
- 例6-4:查找平均订购册数大于5本的订购客户的用户号和平均订购册数。
- 例6-5:创建视图jsj_book,视图中包含“计算机”类图书的信息,并向jsj_book视图中插入一条记录"TP.0837,计算机,Office应用实例,李天威,人民邮电出版社,2026-5-20,36,null,null,null";
- 例6-6:将jsj_book视图中的所有单价降低5%。
- 例6-7:将jsj_book视图中图书编号为”TP.2525"的书名改为“PHP网站制作”,将订单号位5的订购册数改为100册。
- 例6-8:删除jsj_book中“人民邮电出版社”的记录。(删除数据):
- 例6-9:将 jsj_book 视图修改为只包含“计算机”类图书的图书编号、书名和单价。
- 例7-1:根据book表“书名”列上的前6个字符建立一个升序索引name_book.
- 例7-2:在sell表的“用户号”列和”图书编号“列上建立一个复合索引user_bh_sell。
- 例7-3:在book表的”书名“列上创建一个普通索引。
- 例7-4:假设book表中主键未设定,为book表创建以”图书编号“为主键的索引,”出版社“”出版时间“为复合索引,以加快表的检索速度。
- 例7-5:创建sell_copy(sell) 表,设置”用户号“”图书编号“为联合主键,并在”订购册数"列上创建索引。
- 例7-6:删除book表上索引名为“书名”的索引。
- 例7-7:删除book表上的主键和name_book索引。
- 例7-8:在book表的“出版社”列上创建隐形索引。
- 例7-9:将sell表中的数据按”订购时间“进行分区,2010年前的数据放在p1分区,2011年——2015年的数据放在p2分区,2015年以后的数据放在p3分区。
- 例7-10:假设sell表中的”是否结清“列为整数类型,1表示结清,0表示未结清。将sell表中的数据按”是否结清“进行分区,已结清的放在p1分区,未结清的放在p2分区。
- 例7-11:假设sell表中”订单号“为主键,字段为整数类型。将sell表中的数据按订单号进行hash分区,共分为3个分区。
- 例7-12:假设sell表中”订单号“为主键,字段为整数类型。将sell表中的数据按订单号进行key分区,共分为3个分区。
- 例7-13:在例7-10中,对sell表的数据按”是否结清”分成啦2个分区,“是否结清”字段中1表示已结清,放在p1分区;0表示未结清,放在p2分区。现在,因为业务需要,对于免单的订单,中”是否结清“字段中用2表示,需要增加 一个分区p3,用于存放免单的订单。
- 例7-14:sell表已经按”是否结清“列分为3个分区,请将p2和p3分区合并为一个分区m.
- 例7-15:将sell 表中的分区删除。
- 例7-16:将sell表中的分区移除。
- 例8-1:查询book表中图书编号为”Ts.3035"(TP.0837)的书名,并存储在变量b_name中。
- 例8-2:显示members表中的会员姓名,要求在一列中显示姓氏,在另一列中显示名字。(无)
- 例8-3:求members表中会员注册的年数:
- 例8-4:返回members表中名字为两个字的会员姓名和性别。性别为女则显示为“0”,为男则显示为1.
- 例8-5:判断输入的两个参数n1和n2哪一个更大,结果放在变量result中。( 不能单独执行)
- 例8-6:判定变量str,当其值为U时返回“上升”,其值为D时返回“下降”,为其他值时返回“不变”。()
- 例8-7:采用case语句的第二种格式来实现。()
- 例8-8:使用while语句创建一个执行5次的循环。
- 上一章链接:[petsotre数据库](https://blog.csdn.net/m0_66318554/article/details/124960260)
以案例来学习知识,也是一种不错的学习方法。可以更好的给人以兴趣,毕竟,实践才是唯一的真理。
例3-1
创建一个名为“Bookstore”的数据库:
create database Bookstore;
例3-2
创建一个名为“Bookstore” 的数据库,采用字符集 gb2312 和校对规则gb2312_chinese_ci【注意:mysql校对规则的命名约定:它们以其相关的字符集名开始,通常包括一个语言名,并且以_ci(对大小写不敏感)、_cs(对大小写敏感)、_bin(二元)结束】:
create database lxw
default character set gb2312
collate gb2312_chinese_ci;
例3-3
修改数据库 “Bookstore”的默认字符集为 “utf8mb4”、校对规则为“utf8mb4_09900_ai_ci”:
alter database lxw
default character set utf8mb4
default collate utf8mb4_09900_ai_ci;
Unknown collation: ‘utf8mb4_09900_ai_ci’
报错原因:
生成转储文件的数据库版本为8.0,要导入sql文件的数据库版本为5.6,因为是高版本导入到低版本,引起1273错误
解决方法:
打开sql文件,将文件中的所有
utf8mb4_0900_ai_ci替换为utf8_general_ci
utf8mb4替换为utf8
保存后再次运行sql文件,运行成功
alter database lxw
default character set utf8
default collate utf8_general_ci;
例3-4: 假设已经创建了数据库Bookstore,则在该数据库中创建图书目录表“book”。
use Bookstore;
create table book (
图书编号 char(10) not null primary key,
图书类别 varchar(20) not null default '计算机',
书名 varchar(40) not null,
作者 char(10) not null,
出版社 varchar(20) not null,
出版时间 date not null,
单价 float(5,2) not null,
数量 int(5),
折扣 float(3,2),
封面图片 blob
) engine=innodb;
例3-5 :假设已经在数据库Bookstore中创建了表book,表中存在”书名“列。在表book中增加”浏览次数“列,并将表中的”书名“列删除。
use Bookstore;
alter table book
add 浏览次数 tinyint null,
drop column 书名;
例 3-6:假设数据库Bookstore中已经存在表book,将表book重命名为mybook。
use Bookstore;
alter table book
rename to mybook;
例 3-7:假设数据库Bookstore中已经存在表mybook和members,将表mybook重命名为mylist,表Members 重命名为memberlist。
use Bookstore;
rename table mybook to booklist,members to memberlist;
例 3-8:假设数据库Bookstore中有一个表book,创建表book的一个名为book_copy1的副本。
create table book_copy1 like book;
例 3-9:创建表book的一个名为book_coopy2的副本,并且复制其内容。
create table book_copy2
as
(select * from book);
例 3-10:删除表test:
drop table if exists test;
例 3-11:显示Bookstore数据库建立的数据表文件。
use Bookstore;
show tables;
例 3-12:用DESCRIBE语句查看book表中列的信息。
describe book;
例 3-13:查看book表”图书编号“列的信息。
desc book 图书编号;
疑惑:Empty set (0.00 sec)
解决:提示你实体表为空,说的是你的数据库或表里数据为空,添加上数据就可以了。
例3-14:创建表book_copy,将”书名“定义为主键。
create table book_copy (
图书编号 varchar(6) null,
书名 varchar(20) not null primary key,
出版日期 date
);
例3-15:创建course表来记录每门课程的学生的”学号“”姓名“”课程号“”学分““毕业日期“。其中”学号“”课程号“”毕业日期“构成复合主键。
create table course
(
学号 varchar(6) not null,
姓名 varchar(8) not null,
毕业日期 date not null,
课程号 varchar(3),
学分 tinyint,
primary key (学号,课程号,毕业日期)
);
例 3-16:参照例3-15中的course表创建course1表,将索引命名为“INEDX_course”.
create table coursel
(
学号 varchar(6) not null,
姓名 varchar(18) not null,
毕业日期 datetime not null,
课程号 varchar(3),
学分 tinyint,
primary key index_course1(学号,课程号,毕业日期)
);
例 3-17:在表book_copy1中,将“图书编号”作为主键,将“书名”列定义为一个替代键。
create table book_copy3
(
图书编号 varchar(20) not null,
书名 varchar(20) not null unique,
出版日期 date null,
primary key(图书编号)
);
create table book_copy4
(
图书编号 varchar(20) not null,
书名 varchar(20) not null,
出版日期 date null,
primary key(图书编号),
unique(书名)
);
例 3-18:假设book表中主键为设定,为book表建立主键约束为“图书编号”,“书名”为替代键约束。()
alter table book
add primary key(图书编号),
add unique u_idx(书名);
错误点
:ERROR 1068 (42000): Multiple primary key defined
原因:有两个主键,删除其中一个即可用。
例 3-19:删除book表中的主键和替代键约束。()
alter table booklist
drop primary key,
drop index u_idx;
例 3-20:创建book_ref表,book_ref表中所有“图书编号”都必须出现在book表中,假设已经使用“图书编号”列作为book表主键。()
create table book_ref
(
图书编号 varchar(20) null,
书名 varchar(20) not null,
出版日期 date null,
primary key (书名),
foreign key (图书编号)
references booklist (图书编号)
on delete restrict
on update restrict
);
—如下select语句不会返回任何行—
select * from book_ref
where 图书编号 not in
(select 图书编号 from booklist);
例 3-21:创建带有参照动作“cascade”的book_ref1表。
create table book_ref1
(
图书编号 varchar(20) null,
书名 varchar(20) not null,
出版日期 date null,
primary key (书名),
foreign key (图书编号)
references booklist (图书编号)
on update cascade
);
例 3-22:在网络图书销售系统中,只有会员才能下订单。因此sell表中的所有“用户号”也必须出现在members表的“用户号”列中。这种约束通过定义参照完整性约束来实现。(须先创建表sell)
alter table booksell
add foreign key (用户号)
references members (用户号)
on delete cascade
on update cascade;
例 3-23:创建表student,只考虑学号和性别两列,性别只包含“男“或”女“两项。()
create table student
(
学号 char(6) not null,
性别 char(2) not null check(性别 in (`男`,`女`))
);
出错点
:ERROR 3813 (HY000): Column check constraint ‘student_chk_1’ references other column
MySQL错误代码3813:“列检查约束”,无法创建表
例 3-24:创建表student1,只考虑”学号“”出生日期“”学分“列,出生日期必须大于2001年1月1日。()上
create table student1
(
学号 char(6) not null,
出生日期 date not null,
学分 int null,
check (出生日期>`2001-01-01`)
);
错误点
:ERROR 3820 (HY000): Check constraint ‘student1_chk_1’ refers to non-existing column ‘2001-01-01’
例 3-25:创建表student2,有“学号“”最好成绩“”平均成绩“3列,要求最好成绩必须大于平局成绩。
create table student2
(
学号 char(6) not null,
最好成绩 int(1) not null,
平均成绩 int(1) not null,
check(最好成绩>平均成绩)
);
出错点
: 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 ‘骞冲潎鎴愮哗`))’ at line 1
例3-26:创建表student3,有”学号“”最好成绩“”平均成绩“3列,要求最好成绩必须大于平均成绩,且最好成绩不得超过100分。
create table student3
(
学号 char(6) not null,
最好成绩 int(1) not null,
平均成绩 int(1) not null,
check(最好成绩<=100),
check(最好成绩>平均成绩)
);
错误点
: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 ‘鏈?ソ鎴愮哗
<= 100))’ at line 1
例3-27:删除book表的主键,删除book_ref表的外键book_ref_ibfk_1,删除student表的check完整性约束student_chk_1.修改student1表的check完整性约束student1_chk_1属性,暂时不强制执行。
alter table book drop primary key;
alter table book_ref drop foreign key book_ref_ibfk_1;
alter table student drop check student_chk_1;
alter table student1 alter check student1_chk_1 not enforced;
—查看表的所有信息—
show create table;
例4-1:向Bookstore数据库中的表book(表中列包括图书编号、图书类别、书名、作者、出版社、出版时间、单价、数量、折扣及封面图片)中插入一行数据"TP.9501,计算机,Dreamwearer,宝丽嘉,高等教育出版社,2022-01-20,33.25,52,0.8.null"。
use bookstore;
insert into booklist values (
'TP.9501','计算机','宝丽嘉','高等教育出版社','2022-01-20',33.25,52,0.8,'Dreamwearer',2);
错误点
:ERROR 1406 (22001): Data too long for column ‘作者’ at row 1
解决方案(暂定):alter table booklist modify column 作者 char(20);
解决:与表一一对应
例4-2:若表book中”图书类别“列的默认值为“计算机”,“封面图片”列的默认值为null,插入例4-1那行数据。
insert into booklist (
图书编号,作者,出版社,出版时间,单价,数量,折扣)
values ('TP.9502','宝丽嘉','高等教育出版社','2022-01- 20',33.25,52,0.8);
insert into booklist
set 图书编号='TP.9503',作者='宝丽嘉',图书类别='DEFAULT',
出版社='高等教育出版社',出版时间='2021-02-06',单价=32,数量=20,折 扣=0.6;
replace into booklist values('TP.9504','计算机','林小红','高等教育出版社','2020-06-08',23.5,30,0.6);
错误点
:ERROR 1136 (21S01): Column count doesn’t match value count at row 1
出现问题:新插入一行数据时候,返回错误
解决方法:检查表格:select * from 表名; desc 表名;
然后与表一一对应加入或改正即可:
replace into booklist values('TP.9504','计算机','林小红','高等教育出版社','2020-06-08',23.5,30,0.6,62015,3);
例4-3:向book表中插入一行数据“TP.2467,计算机,计算机基础,林华中,高等教育出版社,2022-01-23,42.5,45,0.8,ic.jpg"。
insert into booklist
values('TP.2467','计算机','林华中','高等教育出版社','2020-01-23',42.5,45,0.8,'D:\\pic\\ic.jpg',null);
例4-4:向members表中插入两行数据”C0138,李华,女,147369,17885091065,2022-01-20“”C0139,张明,男,258456,17684271352,2020-09-23“。
insert into booklist values
('C0138','李华','女','147369','17885091065','2022-01-20'),
('C0139','张明','男','258456','17684271352','2020-09-23');
----数据修改----
例4-5:将bookstore数据库中book表的所有书籍数量都增加10.将members表中姓名为”张三”的员工的联系电话改为:“18798372060”,密码改为“147369”。
update booklist
set 数量=数量+10;
update members
set 联系电话='18798372060',密码='147369'
where 姓名='张三';
例4-6:订单号为6的客户因某种情况退回2本图书,请在sell表中修改订购册数,同时书退回后,book表中该图书的数量增加2。
update sell,booklist
set sell愉快的时光总是过得很快,月亮悠哉游哉爬上了半空遥望着太阳。上一篇中剩余排序还没回顾,本篇就暂时先来回顾一下排序吧!
特点:
1.ASC 代表升序,DESC代表降序
2.如果不写默认就是升序
3.ORDER BY 后面支持单个字段,多个字段,表达式,函数,别名
4.ORDER BY 子句一般是放在查询语句的最后面,但LIMIT除外。
#案例1:查询员工信息,要求工资从高到低排序
SELECT *
FROM employees
ORDER BY salary ASC;
#案例2.查询部门编号>=90的员工信息,按入职时间的先后排序。【添加筛选条件】
SELECT *
FROM employees
WHERE department_id >= 90
ORDER BY hiredate ASC;
#案例3.按年薪的高低显示员工的信息。【按表达式排序】
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM employees
ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
=========================================
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM employees
ORDER BY 年薪 DESC;
#案例4.按姓名的长度显示员工的姓名和工作。【按函数排序】
SELECT LENGTH(\'john\');
======================================
SELECT LENGTH(last_name) AS 字节长度,last_name,salary
FROM employees
ORDER BY 字节长度 DESC;
=======================================
SELECT LENGTH(CONCAT(last_name,first_name)) AS 字节长度,
CONCAT(last_name,first_name) AS 姓名,
salary AS 工资
FROM employees
ORDER BY 字节长度 ASC;
#案例5.查询员工信息,要求先按工资排序,再按员工编号排序。
#【ORDER BY 按多个字段排序】
SELECT *
FROM employees
ORDER BY salary ASC,employee_id DESC;
在日常的学习中,我们在Mysql数据库中的查询会用到一些函数,函数千千万,今天就来看一看。
#进阶4.常见的函数
功能:类似于Java中的方法,
概念:是指将我们实现某个功能的这一组逻辑语句封装到了方法中,对外暴露了一个公开的名字。
然后回头再用这些逻辑语句,只需要调用方法名就行了。
好处:
1.隐藏了实现细节。
2.提高代码的复用性。
调用: SELECT 函数名(实参列表) 【FROM 表】;
特点:
①叫什么(函数名)
②干什么(函数功能)
分类:
1.单行函数
如: CONCAT,LENGTH,IFNULL等
2.分组函数
功能:做统计使用,又称为统计函数,聚合函数,简称组函数。
接下来会学习到:字符函数,数学函数,日期函数,其他函数,流程控制函数(下一篇在介绍)
#一.字符函数
#①length 获取参数数值的字节个数
SELECT LENGTH(\'john\');
SELECT LENGTH(\'张三丰haha\')
SHOW VARIABLES LIKE \'%char%\';
#②CONCAT 拼接字符串
SELECT CONCAT(last_name,\'_\',first_name)
FROM employees;
#③UPPER 转大写
#④LOWER 转小写
SELECT UPPER(\'john\');
SELECT LOWER(\'JOHN\');
#示例:将姓变大写,名变小写,然后拼接。【结论:函数可以嵌套,一个函数的返回值可以做为另一个函数的参数】
SELECT CONCAT(UPPER(last_name),\'_\',LOWER(first_name)) AS 姓名
FROM employees;
#⑤SUBSTR 字符串截取两个通用,重载有四种
#SUBSTRING
#SQL语言中索引从1开始
SUBSTR(‘字符串’,开始位) ,一个参数截取后面全部
SELECT SUBSTR(\'仁爱为接物之本信义为立业之本\',11) AS out_put;
#SUBSTR(\'字符串\',开始位,截取数),从指定索引数,指定字符长度的字符
SELECT SUBSTR(\'仁爱为接物之本信义为立业之本\',1,2) AS out_put;
#案例:姓名中首字母大写,其他字符小写,然后用_拼接,显示出来。
SELECT CONCAT(
SUBSTR(UPPER(last_name),1,1),
\'_\',
SUBSTR(LOWER(CONCAT(last_name,first_name)),2)
)
FROM employees;
#一.字符函数
#⑥INTSTR 查起始索引,返回子串第一次出现的索引,如果找不到就返回0
#INSTR(字符串,substr)
SELECT INSTR(\'仁爱为接物之本信义为立业之本\',\'仁爱\') AS out_put;
SELECT INSTR(\'为接物之本信义为立业之本,尧立孝慈仁爱\',\'仁爱\') AS out_put;
SELECT INSTR(\'仁爱为接物之本信义为立业之本\',\'亲爱精诚\') AS out_put;
#⑦TRIM 去除空格
#去除指定的前后字符
SELECT LENGTH(\' 亲爱精诚 \') AS out_put;
SELECT LENGTH(TRIM(\' 亲爱精诚 \')) AS out_put;
SELECT TRIM(\'a\' FROM \'aaaaa亲aaa爱aaaa精诚aaaaaaaaa\') AS out_put;
===============================================================
SELECT TRIM(\'aa\' FROM \'aaaaa亲aaa爱aaaa精诚aaaaaaaaa\') AS out_put;
#⑧LAPD用指定的字符实现左填充指定的长度
SELECT LPAD(\'亲爱精诚\',\'10\',\'a\') AS out_put;
SELECT LPAD(\'亲爱精诚\',\'2\',\'a\') AS out_put;
#⑨RAPD用指定的字符实现右填充指定的长度
SELECT RPAD(\'亲爱精诚\',6,\'c\') AS tou_pus;
SELECT RPAD(\'亲爱精诚\',2,\'c\') AS tou_pus;
#⑩replace 替换
SELECT REPLACE(\'太阳当空照,花儿对我笑\',\'花儿\',\'白云\') AS out_put;
#二.数学函数
#①ROUND 四舍五入,保留小数
SELECT ROUND(1.45);
SELECT ROUND(1.65);
SELECT ROUND(1.578,2)
#②CAIL向上取整,返回大于等于该参数的最小整数
SELECT CEIL(1.003);
SELECT CEIL(1.000);
SELECT CEIL(-1.003);
#③FLOOR向下取整,返回<=该参数的最大整数
SELECT FLOOR(9.99);
SELECT FLOOR(9.23);
SELECT FLOOR(-9.99);
SELECT FLOOR(-9.23);
#④TRUNCATE 截断 (小数,位数)
SELECT TRUNCATE(1.65,1);
SELECT TRUNCATE(1.759,1);
#⑤MOD 取余
被除数如果是正,则结果为正,被除数如果为负,那结果为负
SELECT MOD(10,3);
SELECT MOD(-10,3);
SELECT MOD(7,-3);
SELECT 10%3;
#三.日期函数
#NOW 返回当前系统日期+时间
SELECT NOW();
#CURDATE 返回当前系统日期,不包含时间
SELECT CURDATE();
#CURTIME 返回当前的时间,不包含日期
SELECT CURTIME();
#可以获取指定的部分,年,月,日,小时,分钟,秒
YEAR()
SELECT YEAR(NOW()) AS 年;
SELECT YEAR(\'1998-1-1\') AS 年;
SELECT YEAR(hiredate) 年 FROM employees;
SELECT MONTH(NOW()) 月;
SELECT MONTHNAME(NOW()) 月英文;
STR_TO_DATE 将日期格式的字符转换成指定格式的日期
DATE_FORMAT 将日期转换成字符
SELECT STR_TO_DATE(\'07-12-2020\',\'%m-%d-%Y\');
SELECT DATE_FORMAT(\'2020/07/12\',\'%Y年%m月%d日\');
#查询入职日期为1992-4-3的员工信息。上面理想输入,下面为实际输入。
SELECT *
FROM employees
WHERE hiredate = \'1992-4-3\';
==================================================
SELECT *
FROM employees
WHERE hiredate = STR_TO_DATE(\'4-3 1992\',\'%c-%d %Y\');
#案例:查询有奖金的员工名和入职日期(XX月/XX日 XX年)
SELECT last_name,DATE_FORMAT(hiredate,\'%m月/%d日 %Y年\')
FROM employees
WHERE commission_pct IS NOT NULL;
#四.其他函数
SELECT VERSION(); #查看版本号
SELECT DATABASE(); #查看当前的数据库
SELECT USER(); #查看当前的用户
日常学习中的函数就暂时介绍到这里,各位看官可能有疑问你的流程控制函数能?
这emmmm.........!!!精彩回顾且听下篇慢慢到来。