MySQL~(详细)案例

Posted lxw-pro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL~(详细)案例相关的知识,希望对你有一定的参考价值。

SQL目录


以案例来学习知识,也是一种不错的学习方法。可以更好的给人以兴趣,毕竟,实践才是唯一的真理。

例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.........!!!精彩回顾且听下篇慢慢到来。

以上是关于MySQL~(详细)案例的主要内容,如果未能解决你的问题,请参考以下文章

linux实战应用案例: 如何在 Linux 安装 MySQL 8 数据库?(图文详细教程)

linux实战应用案例: 如何在 Linux 安装 MySQL 8 数据库?(图文详细教程)

Mysql DBA 高级运维学习笔记-MySQL备份与恢复实战案例及生产方案

大数据DataX:HBase导入到MySQL

实战案例:京东到家MySQL容器化实践

MySQL案例05:CPU负载优化