MySQL基础(一)
MySQL
JavaEE:企业级java开发 Web
前端(页面:展示,数据!)
后台(连接点:连接数据库JDBC,连接前端【控制视图跳转,和前端传递数据】)
数据库(存数据库,Text,Excel,Word)
只会写代码,学好数据库,基本混饭吃
操作系统,数据结构与算法! 当一个不错的程序员!
高散数据,数学电路,体系结构,编译原理+实战经验,高级程序员~优秀程序员~
为什么学习数据库
- 岗位需求
- 现在的世界,大数据时代,得数据者得天下
- 被迫需求:存数据
- 数据库是所有软件体系中最核心的存在
什么是数据库
数据库(DB,DataBase)
- 概念:数据仓库,软件,安装在操作系统(window,linux,mac)之上,可以存储大量的数据。500万
- 作用:存数据,管理数据
数据库分类
关系型数据库 (SQL)
- MySQL、Oracle,Sql Server,DB2,SQLite
- 通过表和表之间,行和列之间的关系进行数据库的存储,学员信息表,考勤表,......
非关系型数据库 (NoSQL)Not Only SQL
- Redis,MongDB
- 非关系型数据库,对象存储,通过对象的自身的属性来决定
DBMS(数据库管理系统)
- 数据库的管理软件,科学有效地管理我们的数据。维护和获取数据;
- MySQL,数据库管理系统
MySQL简介
MySQL是一个关系型数据库管理系统
前世:瑞典MySQL AB公司
今生:属于Oracle旗下产品
MySQL是最好RDBMS(RelationalDatabaseManagement System,关系型数据库管理系统)应用软件之一。
开源的数据库软件
体积小、速度快、总体拥有成本低,招人成本比较低,所有人必须会
总小型网站、或者大型网站,集群~
常用MySQL版本
- 5.7
- 8.0
安装MySQL
- 解压
- 把这个包放到自己的电脑环境目录下
- 配置环境变量
- 新建mysql配置文件ini
[mysql]
# 目录一定要换成自己的
basedir=[目录]\
datadir=[目录]\data\
port=3306
skip-grant-tables
- 启动管理员模式下的CMD,运行所有的命令
连接数据库
命令行连接
mysql -uroot -p123456 -- 连接数据库
update mysql.user set authentication_string=password('123456') where user='root' and Host='localhost'; -- 修改用户密码
flush privileges; -- 刷新权限
-----------------------------------------------------------
-- 所有的语句都用分号结尾:结尾
show databases; -- 查看所有数据库
use school; -- 切换数据库 use 数据库名
show tables; -- 查看所有数据库中所有的表
describe student; -- 显示数据库中所有表信息
create database westos; -- 创建一个数据库
exit; 退出数据库连接
注释
-- 单行注释(SQL的本来的注释)
/* (SQL的多行注释)
hello
asds
dasdas
*/
操作数据库
操作数据库
创建数据库
mysql关键字不区分大小写
CREATE DATABASE westos;
-- 一般会加一个判断
CREATE DATABASE IF NOT EXISTS westos;
使用数据库
USE `school`;
删除数据库
DROP DATABASE IF EXISTS `hello`;
查看数据库
SHOW DATABASES; -- 查看所有数据库
数据库的列类型
数值
- tinyint 十分小的数据 1个字节
- smallint 较小的数据 2个字节
- mediumint 中等大小的数据 3个字节
- int 标准整数 4个字节
- bigint 较大的数据 8个字节
- float 浮点数 4个字节
- double 浮点数 8个字节
- decimal 字符串形式的浮点数 金融计算的时候一般使用decimal
字符串
- char 字符串固定大小 0~255
- varchar 可变字符串 0~65535 常用的变量
- tinytext 微型文本 2^8 - 1
- text 文本串 2^16-1 保存大文本
时间日期
- date YYYY-MM-DD 日期
- time HH:mm:ss 时间格式
- datetime YYYY-MM-DD HH:mm:ss 常用的时间格式
- timestamp 时间戳,1970.1.1 到现在的秒数 较为常用
- year 年份
null
- 没有值,未知
- 注意,不要使用NULL进行运算个,结果一定为NULL
数据库的字段属性(重点)
Unsigned
- 无符号的整数
- 声明了该列不能声明为负数
zerofill
- 0填充的
- 不足的位数,使用0来填充,int(3)
自增
- 通常理解为自增,自动在上一条记录的基础上 +1 (默认)
- 通常用来设计唯一的主键 index,必须是整数类型
- 可以自定义设计主键自增的起始值和步长
非空 NOT NULL
- 假设设置为 not null,如果不给它赋值,就会报错
- null,如果不填写值,默认就是null
默认
- 设置默认的值
- sex,默认为男,如果不填值,默认为男
创建数据库表
-- 目标:创建一个student表(列,字段) 使用SQL创建
-- 学号int 登陆密码varchar(20) 姓名,性别varchar(2),出生日期(datetime),家庭住址,email
-- 注意点,使用英文(),表的名称 和字段尽量用 ``括起来
-- AUTO_INCREMENT 自增
-- 字符串使用 单引号括起来
-- 所有语句后面加英文逗号
-- PRIMARY KEY 主键,一般一个表只有一个主键!
CREATE TABLE IF NOT EXISTS `student` (
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
格式
CREATE TABLE [IF NOT EXIST] `表名`(
`字段名1` 列类型 [属性] [索引] [注释],
`字段名2` 列类型 [属性] [索引] [注释],
......
`字段名n` 列类型 [属性] [索引] [注释]
)[表类型][字符集设置][注释]
SHOW语句
SHOW CREATE DATABASE `school`; -- 查看创建数据库的语句
SHOW CREATE TABLE `student`; -- 查看创建表的语句
显示表结构
DESC `student`;
数据表的类型
-- 关于数据库引擎
/*
INNO默认使用
MYISAM早些年使用
*/
MYISAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间的大小 | 较小 | 较大,约为2倍 |
常规使用操作:
- MYISAM 节约空间,速度较快
- INNODB 安全性高,事务的处理,多表用户的操作
在物理空间存在的位置
所有的数据库文件都存在data目录下,一个文件夹对应一个数据库
本质还是文件的存储
MySQL引擎在物理文件上的区别
- InnoDB 在数据库表中只有一个 *.frm文件,以及上级目录下的ibdata1文件
- MYISAM 对应文件
- *.frm 表结构的定义文件
- *.MYD 数据文件(data)
- *.MYI 索引文件(index)
设置数据库表的字符集编码
CHARSET=utf8
不设置的话,会是mysql默认的字符集编码(不支持中文!)
MySQL的默认编码时Latin1,不支持中文
在my.ini中配置默认的编码
character-set-server=utf8
修改删除表
修改
-- 修改表名
ALTER TABLE `student` RENAME AS `teacher`;
-- 增加表字段
ALTER TABLE `teacher` ADD `age` INT(11);
-- 修改表的字段 (重命名、修改约束)
ALTER TABLE `teacher` MODIFY `age` VARCHAR(11);
ALTER TABLE `teacher` CHANGE `age` `age1` INT(1); -- change 用来重命名
-- 删除表的字段
ALTER TABLE `teacher` DROP `age1`;
删除
-- 删除表
DROP TABLE IF EXISTS `teacher`;
所有的创建和删除操作尽量加上判断,以免报错
MySQL数据管理
外键(了解即可)
-- 创建grade表
CREATE TABLE IF NOT EXISTS `grade`(
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
`gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
PRIMARY KEY(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
-- 创建student表
-- 学生表的 干扰的ID字段,要去引用年级表的 gradeid
-- 定义外键key
-- 给这个外键添加约束(执行引用) references 引用
CREATE TABLE IF NOT EXISTS `student` (
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`gradeid` INT(10) DEFAULT 1 NOT NULL COMMENT '学生的年级',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
-- 创建表的时候没有外键关系
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);
-- ALERT TABLE 表 ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列) REFERENCES 哪个表(字段)
删除所有外键关系的表的时候,必须要先删除引用别人的表(从表),再删除被引用的表(主表)
以上的操作都是物理外键,数据库级别的外键,我们不建议使用!(避免数据库过多造成困扰)
最佳实践
- 数据库就是存粹的表,只用来存数据,只有行(数据)和列(字段)
- 我们想使用多张表的数据,想使用外键(程序去实现)
DML语言(全部记住)
DML语音:数据操作语音
- insert
- update
- delete
增加
insert
-- 插入语句(添加)
-- INSERT INTO 表名(字段1,字段2,字段3) VALUES(值1,值2,值3)
INSERT INTO `grade`(`gradename`) VALUES('大四');
-- 由于主键自增我们可以省略(如果不写表的字段,他们会一一匹配)
INSERT INTO `grade` VALUES('大四');
-- 一般写插入语句,我们一定要数据和字段一一对应!
-- 插入多个字段
INSERT INTO `grade`(`gradename`)
VALUES('大二'),('大一');
INSERT INTO `student`(`name`) VALUES("张三");
INSERT INTO `student`(`name`,`pwd`,`sex`)
VALUES("李四","5tgb^YHN","男"),("王五","1qaz@WSX","男");
注意事项
- 字段和字段之间使用英文逗号隔开
- 字段是可以省略的,但是后面的值必须一一对应
修改
update 修改 (条件) set 原来的值=新值
-- 修改
update `student` SET `name` = "冰渣渣" WHERE id = 1;
-- 语法 :
-- UPDATE 表名 SET COLUMN_name = VALUE WHERE 条件[]
-- 修改多个属性,逗号隔开
update `student` SET `name` = "逗比",`email`= "475377482@qq.com" WHERE id = 2;
条件:where 子句,运算符 id等于某个值,在某个区间内修改......
删除
delete
-- 删除
-- DELETE FROM 表名 WHERE 条件
-- 删除数据(避免这样写,会全部删除)
DELETE FROM `student`
-- 删除指定数据
DELETE FROM `student` WHERE `id` = 1;
TRUNCATE
作用:完全清空一个数据库表,表的结构和索引约束不会变
-- 清空student表
TRUNCATE `student`;
delete 和 TRUNCATE区别
- 相同点 都能删除数据,都不会删除表结构
- 不同点
- TRUNCATE 重新设置自增列 计数器会归零
- TRUNCATE 不会影响事务
-- 测试delete 和 TRUNCATE的区别
CREATE TABLE `test`(
`id` INT(4) NOT NULL AUTO_INCREMENT,
`coll` VARCHAR(20) NOT NULL,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO `test`(`coll`) VALUES('1'),('2'),('3');
DELETE FROM `test`; -- 不会影响自增
TRUNCATE `test`; -- 自增会归零
了解即可:DELETE删除的问题,重启数据库现象
- InnoDB 自增列会从1开始(存在内存当中的,断电即失)
- MyISAM 继续从上一个自增开始(存在文件中的,不会丢失)
DQL查询数据(最重点)
DQL
(Data Query Language: 数据查询预语言)
- 所有的查询操作都用它 select
- 简单的查询,复杂的查询都能做
- 数据库中最核心的语言,最重要的语言
- 使用频率最高的语句
准备表及数据
--创建表
CREATE DATABASE IF NOT EXISTS `library`;
--查看当前表有哪些
SHOW TABLES;
--查看表字段详情
DESC `bookinfo`;
DESC `readerinfo`;
DESC `borrowinfo`;
--删除表
--删除方式有两种:有关联关系、无关联关系的表
DROP TABLE `bookinfo`;
DROP TABLE `bookcategory`;
DROP TABLE `readerinfo`;
DROP TABLE `borrowinfo`;
--多个表一起删除
DROP TABLE `borrowinfo`,`readerinfo`;
--创建图书类别表bookcategory
CREATE TABLE `bookcategory`(
`category_id` INT PRIMARY KEY AUTO_INCREMENT,
`category` VARCHAR(20) NOT NULL UNIQUE,
`parent_id` INT NOT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8;
--创建图书信息表bookinfo
CREATE TABLE `bookinfo`(
`book_id` INT PRIMARY KEY,
`book_category_id` INT,
`book_name` VARCHAR(100) NOT NULL UNIQUE,
`author` VARCHAR(100) NOT NULL,
`price` FLOAT(5,2) NOT NULL,
`press` VARCHAR(40) DEFAULT '机械工业出版社',
`pubdate` DATE NOT NULL,
`store` INT NOT NULL,
CONSTRAINT `fk_bcid` FOREIGN KEY(book_category_id) REFERENCES bookcategory(category_id)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
--创建读者信息表readerinfo
CREATE TABLE `readerinfo`(
`card_id` CHAR(18) PRIMARY KEY,
`name` VARCHAR(20) NOT NULL,
`sex` ENUM('男','女','保密') DEFAULT '保密',
`age` TINYINT NOT NULL,
`tel` CHAR(11) NOT NULL,
`balance` DECIMAL(7,3) DEFAULT 200
)ENGINE=INNODB DEFAULT CHARSET=utf8;
--创建借阅信息表borrowinfo
CREATE TABLE `borrowinfo`(
`book_id` INT,
`card_id` CHAR(18),
`borrow_date` DATE NOT NULL,
`return_date` DATE NOT NULL,
`status` CHAR(1) NOT NULL,
PRIMARY KEY(`book_id`,`card_id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
--查看已创建表
SHOW TABLES;
-- 插入数据
insert into `bookcategory`(`category`,`parent_id`)values('计算机',0),('医学',0),('文学',0),('编程语言',1),('数据库',1),('儿科学',2),('国内文学',3),('国外文学',3);
/*图书信息表*/
insert into `bookinfo`(`book_id`,`book_category_id`,`book_name`,`author`,`price`,`press`,`pubdate`,`store`)
values
(20150201,4, 'Java编程思想', '(美)埃克尔', 79.8, default, '2007-04-01', 5),
(20150202,5, 'PHP和MySQL Web开发', 'Luke Welling等',95, default, '2009-04-01', 2),
(20150301,4, 'Spring源码深度解析', '郝佳',69, '人民邮电出版社', '2013-09-01', 3),
(20160801,6, '中医儿科学', '汪受传', 136, '人民卫生出版社', '2011-04-01', 1),
(20170401,6, '小儿推拿秘笈', '李德修', 24.5, '人民卫生出版社', '2011-04-01',4),
(20150802,4, 'Python编程思想', '(英)斯特林', 79.8, default, '2005-04-01', 6),
(20150203,5, 'Drango Web开发', 'Duk 等',95, default, '2010-04-01', 3),
(20150304,4, 'SpringCloud源码深度解析', '袁媛',69, '人民工程出版社', '2014-09-01', 4),
(20160805,6, '西医儿科学', '赵传', 136, '人民卫生出版社', '2012-04-01', 2),
(20170406,6, '小儿健康宝典', '孔莉', 24.5, '人民卫生出版社', '2012-04-01',5),
(20170201,4, 'C++编程思想', '(美德)隆美尔', 69.8, default, '2017-04-01', 5),
(20170702,5, 'PHP和Oracle Web开发', '威廉姆斯',85, default, '2012-04-01', 5),
(20170301,4, 'HTML源码深度解析', '邵佳一',59, '人民邮电出版社', '2015-09-01', 6),
(20170801,6, '中医幼儿科学', '王向平', 126, '人民卫生出版社', '2013-04-01', 4),
(20190401,6, '小儿推拿手册', '胡凯', 14.5, '人民卫生出版社', '2014-04-01',7),
(20170202,4, 'Python基础入门', '(日)山本一木', 69.8, default, '2005-07-01', 9),
(20170203,5, 'Vue Web开发', '新街',85, default, '2010-05-01', 5),
(20170304,4, 'Spring深度解析', '贾斯丁',59, '人民工程出版社', '2014-10-01', 6),
(20190805,6, '西医小儿科学', '艾薇儿', 126, '人民卫生出版社', '2012-06-01', 4),
(20190406,6, '小儿健康手册', '泡芙dog', 24, '人民卫生出版社', '2012-05-01',7),
(20200101,7, '中国文学史', '空的都', 54, '中国教育出版社', '2007-01-01',27),
(20200103,7, '菜根谭', '洪应明', 44, '中国友谊出版社', '2022-04-01',203),
(20200104,7, '太平广记', '李昉等', 49, '中华书局', '2020-04-01',801),
(20200105,7, '文献中的百年党史', '李颖', 49, '学林出版社', '2020-11-01',1002),
(20200106,7, '李太白全集', '李白', 29, '中华书局', '2011-03-01',702),
(20200107,7, '李银河:性学入门', '李银河', 49, '上海三联书店', '2021-01-01',12),
(20200109,7, '极限正义:刑案之道', '高艳东', 38, '北京大学出版社', '2021-04-01',32),
(20200110,7, '监狱琐记', '王学泰', 57, '生活·读书·新知三联书店', '2021-03-01',73),
(20200111,7, '汉武时代漫谈', '草说木言', 40, '海天出版社', '2022-04-01',103),
(20200201,8, '生活与命运', '[俄] 瓦西里·格罗斯曼', 62, '四川人民出版社', '2020-03-01',9),
(20200202,8, '堂吉诃德', '[西班牙] 塞万提斯 ', 42, '人民文学出版社', '2019-05-01',27),
(20200203,8, '卡拉马佐夫兄弟', '[俄] 陀思妥耶夫斯基', 38, '人民文学出版社', '2020-11-01',7),
(20200204,8, '一生', '[法] 莫泊桑', 42, '人民文学出版社', '2020-01-01',57),
(20200205,8, '傲慢与偏见', '[英] 简·奥斯丁', 32, '人民文学出版社', '2020-03-01',2037),
(20200206,8, '巴黎圣母院', '[法] 雨果', 32, '人民文学出版社', '2019-05-01',3037),
(20200207,8, '永别了武器', '[美] 欧内斯特·海明威', 62, '人民文学出版社', '2020-04-01',631),
(20200208,8, '瓦尔登湖', '[美] 亨利·戴维·梭罗', 63, '人民文学出版社', '2019-05-01',32),
(20200209,8, '帝国游戏', '(智利)罗贝托·波拉尼奥', 37, '上海人民出版社', '2020-05-10',332),
(20200210,8, '神秘岛', '凡尔纳', 67, '西安交通大学出版社', '2017-08-01',3),
(20200301,4, 'Python编程快速上手 让繁琐工作自动化', '[美] 阿尔·斯维加特', 67, '人民邮电出版社', '2021-03-01',29),
(20200302,4, 'Python编程练习与解答', '[加拿大] 本·斯蒂芬森', 47, '清华大学出版社', '2021-01-01',32),
(20200303,4, 'Python编程入门与算法进阶', '中国电子学会', 47, '人民邮电出版社', '2022-04-01',106),
(20200304,4, 'Spring微服务实战', '[美] 约翰·卡内尔', 54, '人民邮电出版社', '2022-05-01',86),
(20200305,4, 'Spring Boot实战派', '龙中华', 34, '电子工业出版社', '2020-01-01',6),
(20200306,5, '高性能MySQL', 'Baron Schwartz,Peter Zaitsev,Vadim Tkachenko', 34, '电子工业出版社', '2013-04-01',2),
(20200307,5, 'MySQL基础教程', '[日] 西泽梦路', 24, '人民邮电出版社', '2020-01-01',22),
(20200401,6, '张素芳小儿推拿技法图谱', '周奕琼,刘晓峰', 54, '江苏凤凰科学技术出版社', '2018-07-01',22);
/*读者信息表*/
insert into `readerinfo`(`card_id`,`name`,`sex`,`age`,`tel`,`balance`)
values
(20210199801010500,'张飞','女',18,'18217054300',300),
(20210199801010501,'李月','女',19,'18217054301',200),
(20210199801010502,'王鹏','男',20,'18217054302',300),
(20210199801010503,'刘鑫','男',21,'18217054303',400),
(20210199801010504,'杨磊','男',22,'18217054304',500),
(20210199801010505,'李飞','女',18,'18217054305',300),
(20210199801010506,'李月气','女',29,'18217054306',200),
(20210199801010507,'王鹏站','男',30,'18217054307',300),
(20210199801010508,'刘鑫饿','男',41,'18217054308',400),
(20210199801010509,'杨磊从','男',42,'18217054309',500),
(20210199801010510,'张飞册','女',38,'18217054310',300),
(20210199801010511,'刘月','女',29,'18217054100',200),
(20210199801010512,'钱鹏','男',40,'18217054200',300),
(20210199801010513,'牛鑫','男',51,'18217054330',400),
(20210199801010514,'陈磊','男',32,'18217054400',500),
(20210199801010515,'胡飞','女',48,'18217054500',200),
(20210199801010516,'孔月','女',19,'18217054600',200),
(20210199801010517,'孙鹏','男',10,'18217054700',200),
(20210199801010518,'徐鑫','男',31,'18217054800',200),
(20210199801010519,'潘磊','男',22,'18217054900',200),
(20210199801010520,'庞飞','女',48,'18217054010',100),
(20210199801010521,'施月','女',39,'18217051300',100),
(20210199801010522,'金鹏','男',30,'18217052300',100),
(20210199801010523,'管鑫','男',41,'18217053300',100),
(20210199801010524,'藏磊','男',42,'18217054340',100),
(20210199801010525,'李飞','女',18,'18217055300',300),
(20210199801010526,'王月','女',19,'18217056300',200),
(20210199801010527,'张鹏','男',20,'18217057300',300),
(20210199801010528,'刘子','男',21,'18217058300',400),
(20210199801010529,'陈磊','男',22,'18217059300',500),
(20210199801010530,'徐飞','女',18,'18217050380',300),
(20210199801010531,'钱月气','女',29,'18211054300',200),
(20210199801010532,'金鹏站','男',30,'18212054300',300),
(20210199801010533,'卢鑫饿','男',41,'18213054300',400),
(20210199801010534,'潘磊从','男',42,'18214054300',500),
(20210199801010535,'周飞册','女',38,'18215554350',300),
(20210199801010536,'梁月','女',29,'18217064300',200),
(20210199801010537,'林鹏','男',40,'18217074300',300),
(20210199801010538,'季鑫','男',51,'18217084300',400),
(20210199801010539,'邹磊','男',32,'18217094300',500),
(20210199801010540,'许飞','女',48,'18217004900',200),
(20210199801010541,'孙月','女',19,'18217154300',200),
(20210199801010542,'孔鹏','男',10,'18217254300',200),
(20210199801010543,'陆鑫','男',31,'18217354300',200),
(20210199801010544,'黎磊','男',22,'18217454300',200),
(20210199801010545,'冯飞','女',48,'18217554300',100),
(20210199801010546,'葛月','女',39,'18217654300',100),
(20210199801010547,'胡鹏','男',30,'18217754300',100),
(20210199801010548,'江鑫','男',41,'18217854300',100),
(20210199801010549,'黄磊','男',42,'18217954300',100),
(20210199801010550,'张的飞','女',18,'18217005300',300),
(20210199801010551,'李吃月','女',19,'18211054300',200),
(20210199801010552,'王充鹏','男',20,'18212054300',300),
(20210199801010553,'刘强鑫','男',21,'18213054300',400),
(20210199801010554,'杨票磊','男',22,'18214054300',500),
(20210199801010555,'李龙飞','女',18,'18215054300',300),
(20210199801010556,'李学气','女',29,'18216054300',200),
(20210199801010557,'王额站','男',30,'18217774300',300),
(20210199801010558,'刘三饿','男',41,'18218054300',400),
(20210199801010559,'杨额从','男',42,'18219054300',500),
(20210199801010560,'张票册','女',38,'18210884300',300),
(20210199801010561,'刘月三','女',29,'18227054300',200),
(20210199801010562,'钱鹏婆','男',40,'18237054300',300),
(20210199801010563,'牛鑫城','男',51,'18247054300',400),
(20210199801010564,'陈磊钱','男',32,'18257054300',500),
(20210199801010565,'胡飞车','女',48,'18267054300',200),
(20210199801010566,'孔月才','女',19,'18277054300',200),
(20210199801010567,'孙鹏中','男',10,'18287054300',200),
(20210199801010568,'徐鑫人','男',31,'18297054300',200),
(20210199801010569,'潘磊林','男',22,'18299054300',200),
(20210199801010570,'庞飞新','女',48,'18117054300',100),
(20210199801010571,'施月饿','女',39,'18222054300',100),
(20210199801010572,'金鹏牌','男',30,'18317054300',100),
(20210199801010573,'管鑫客','男',41,'18417054300',100),
(20210199801010574,'藏磊排','男',42,'18517054300',100),
(20210199801010575,'李次飞','女',18,'18617054300',300),
(20210199801010576,'王月如','女',19,'18717054300',200),
(20210199801010577,'张鹏粗','男',20,'18817054300',300),
(20210199801010578,'刘子我','男',21,'18917054300',400),
(20210199801010579,'陈磊类','男',22,'18017054300',500),
(20210199801010580,'徐长飞','女',18,'18222054300',300),
(20210199801010581,'钱次气','女',29,'18333054300',200),
(20210199801010582,'金苦站','男',30,'18444054300',300),
(20210199801010583,'卢裁饿','男',41,'18555054300',400),
(20210199801010584,'潘磊从','男',42,'18666054300',500),
(20210199801010585,'周葱册','女',38,'18777054300',300),
(20210199801010586,'梁囱月','女',29,'18888054300',200),
(20210199801010587,'林鹏都','男',40,'18999054300',300),
(20210199801010588,'季春','男',51,'18210004300',400),
(20210199801010589,'邹兰','男',32,'18909054300',500),
(20210199801010590,'许飞琮','女',48,'18808054300',200),
(20210199801010591,'孙思月','女',19,'18707054300',200),
(20210199801010592,'孔鹏从','男',10,'18606054300',200),
(20210199801010593,'陆鑫看','男',31,'18505054300',200),
(20210199801010594,'黎磊犯','男',22,'18404054300',200),
(20210199801010595,'冯龙飞','女',48,'18303054300',100),
(20210199801010596,'葛粗','女',39,'18220254300',100),
(20210199801010597,'胡鄂','男',30,'18210154300',100),
(20210199801010598,'江搭','男',41,'18201054300',100),
(20210199801010599,'裘磊','男',42,'18202054300',100);
-- borrowinfo 数据
INSERT INTO `borrowinfo`(`book_id`, `card_id`, `borrow_date`, `return_date`, `status`)
VALUES
(20150201,20210199801010500,'2012-07-06','2021-10-21',1),
(20150202,20210199801010501,'2011-07-01','2021-10-01',1),
(20150301,20210199801010502,'2010-07-02','2021-10-11',1),
(20160801,20210199801010503,'2009-07-03','2021-10-31',1),
(20170401,20210199801010504,'2009-07-04','2021-10-01',1),
(20150802,20210199801010505,'2009-07-05','2021-11-11',1),
(20150203,20210199801010506,'2009-07-06','2021-09-21',1),
(20150304,20210199801010507,'2009-07-07','2021-07-11',1),
(20160805,20210199801010508,'2016-07-08','2017-06-14',1),
(20170406,20210199801010509,'2019-07-09','2021-10-13',1),
(20170201,20210199801010510,'2018-07-10','2019-06-12',1),
(20170702,20210199801010511,'2019-07-11','2019-08-11',1),
(20170301,20210199801010512,'2017-07-12','2019-03-11',1),
(20170801,20210199801010513,'2019-07-13','2019-10-08',1),
(20190401,20210199801010514,'2019-07-14','2021-10-07',0),
(20170202,20210199801010515,'2019-07-15','2021-10-06',1),
(20170203,20210199801010516,'2019-07-16','2021-10-05',1),
(20170304,20210199801010517,'2019-07-17','2021-10-04',1),
(20190805,20210199801010518,'2019-07-18','2020-10-03',1),
(20190406,20210199801010519,'2019-07-19','2020-10-02',1),
(20200101,20210199801010520,'2019-07-20','2021-11-30',1),
(20200103,20210199801010521,'2019-07-21','2021-10-30',1),
(20200104,20210199801010522,'2019-07-22','2021-10-29',1),
(20200105,20210199801010523,'2019-07-23','2021-10-28',1),
(20200106,20210199801010524,'2019-07-24','2021-10-27',1),
(20200107,20210199801010525,'2019-07-25','2021-10-26',1),
(20200109,20210199801010526,'2019-07-26','2021-10-25',1),
(20200110,20210199801010527,'2019-07-27','2021-10-24',1),
(20200111,20210199801010528,'2019-07-28','2021-10-23',1),
(20200201,20210199801010529,'2019-07-29','2021-10-22',1),
(20200202,20210199801010530,'2019-07-30','2021-10-21',1),
(20200203,20210199801010531,'2019-08-06','2021-10-20',1),
(20200204,20210199801010532,'2019-09-06','2021-10-09',1),
(20200205,20210199801010533,'2019-01-06','2021-10-08',0),
(20200206,20210199801010534,'2019-02-06','2021-10-07',1),
(20200207,20210199801010535,'2019-03-06','2021-10-06',1),
(20200208,20210199801010536,'2019-04-06','2021-10-05',1),
(20200209,20210199801010537,'2019-05-06','2021-10-04',1),
(20200210,20210199801010538,'2019-06-06','2021-10-03',1),
(20200301,20210199801010539,'2019-07-06','2021-10-02',1),
(20200302,20210199801010540,'2001-07-06','2021-10-01',0),
(20200303,20210199801010541,'2002-07-06','2021-10-31',1),
(20200304,20210199801010542,'2003-07-06','2021-10-21',1),
(20200305,20210199801010543,'2004-07-06','2021-10-16',1),
(20200306,20210199801010544,'2005-07-06','2021-10-11',1),
(20200307,20210199801010545,'2006-07-06','2021-10-17',1),
(20200401,20210199801010546,'2007-07-06','2021-10-18',1),
(20150201,20210199801010547,'2008-07-06','2021-10-19',0),
(20150202,20210199801010548,'2009-07-06','2021-09-11',1),
(20150301,20210199801010549,'2010-07-06','2021-11-11',1),
(20160801,20210199801010550,'2011-07-06','2021-10-11',1),
(20160805,20210199801010551,'2012-07-06','2020-10-11',1);
指定查询字段
-- 查询全部字段 SELECT * FROM 表
SELECT * FROM `bookcategory`;
SELECT * FROM `bookinfo`;
SELECT * FROM `readerinfo`;
-- 指定查询字段
SELECT `card_id` FROM `readerinfo`;
SELECT `card_id`,`name`,`balance` FROM `readerinfo`;
-- 别名,给结果起一个名字 AS,可以给字段、表起别名
SELECT `card_id` AS "身份id",`name` AS "姓名",`balance` AS "余额" FROM `readerinfo` AS s;
-- 函数 Concat (a,b)
SELECT CONCAT("书名:",`book_name`) AS "新书名" FROM `bookinfo`;
语法:==SELECT 字段,... FROM 表==
去重 distinct
-- 查询用户余额都有哪些 , 重复数据多,需要去重
SELECT DISTINCT`balance` AS "余额" FROM `readerinfo`;
作用:去除select查询出来的结果中重复的数据,只显示一条
数据库的列 (表达式)
-- 查看系统的版本 (函数)
SELECT VERSION();
-- 用来计算 (表达式)
SELECT 100*3-1 AS '计算结果';
-- 查询自增的步长 (变量)
SELECT @@auto_increment_increment;
-- 图书库存 +1 查看
SELECT `book_name` AS '图书名称', `store`+1 AS '库存' FROM `bookinfo`;
数据库中的表达式:文本值、列、Null、函数、计算表达式、系统变量
select 表达式 from 表
where条件子句
作用:检索数据中符合条件
的值
搜索结果由一个或多个结果表达式表示
逻辑运算符
运算符 | 语法 | 描述 |
---|---|---|
and && | a and b a&&b | 逻辑与,两个为真,结果为真 |
or || | a or b a||b | 逻辑或,其中一个为真,则结果为真 |
not ! | not a !a | 逻辑非 |
-- 查询性别为男,余额大于等于300的用户姓名,性别,余额
SELECT `name` AS "性别",`sex` AS "性别",`balance` AS "余额"
FROM `readerinfo`
WHERE `sex` = "男" AND `balance`>=300;
-- 模糊查询(区间)
-- 查询价格在50到100之间的图书,作者,价钱
SELECT `book_name` AS "书名",`author` AS "作者",`price` AS "价钱"
FROM `bookinfo`
WHERE `price` BETWEEN 50 AND 100;
-- != not
-- 查询出版社不是“机械工业出版社”的所有书籍名称,出版社
SELECT `book_name` AS "书名",`author` AS "作者",`press` AS "出版社"
FROM `bookinfo`
WHERE `press` != "机械工业出版社";
模糊查询
比较运算符
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | a is null | 如果操作符为NULL,结果为真 |
IS NOT NULL | a is not null | 如果操作符为not null,结果为真 |
BETWEEN | a between b and c | 若a在b和c之间,则结果为真 |
LIKE | a like b | SQL匹配,如果a匹配b,则结果为真 |
IN | a in(a1,a2,a3...) | 假设a在a1,或者a2...其中的某一个值中,结果为真 |
-- 查询2017年的图书
-- like结合 %(代表0到任意个字符串)
SELECT `book_id` AS "书号",`book_name` AS "书名",`author` AS "作者"
FROM `bookinfo`
WHERE `book_id` LIKE "2017%";
-- 查询图书中带有“web”的图书
SELECT `book_name` AS "书名",`author` AS "作者"
FROM `bookinfo`
WHERE `book_name` LIKE "%Web%";
-- in (具体的一个或者多个值)
SELECT `book_name` AS "书名",`author` AS "作者"
FROM `bookinfo`
WHERE `book_name` IN ("Java编程思想","Python基础入门","Spring深度解析");
-- NULL not NULL
-- 查询地址为空的学生 NULL
SELECT `name` AS "姓名",`sex` AS "性别",`tel` AS "电话"
FROM `readerinfo`
WHERE `name`= "" OR `tel` IS NULL;
联表查询
JOIN 对比
-- 联表查询
/*
1、分析需求,分析查询的字段来自哪些表,(连接查询)
2、确定使用哪种连接查询? 7种
3、确定交叉点(这两个表中哪个数据是相同的)
判断的条件:bookcategory表的category_id = bookinfo表的book_category_id
*/
-- 查询图书名称,作者,出版社以及图书类别
SELECT bc.category AS "图书类型",bi.book_name AS "图书名称",bi.author AS "作者",bi.press AS "出版社"
FROM `bookinfo` AS bi
INNER JOIN `bookcategory` AS bc
ON bi.book_category_id = bc.category_id;
-- RIGHT JOIN
SELECT bc.category AS "图书类型",bi.book_name AS "图书名称",bi.author AS "作者",bi.press AS "出版社"
FROM `bookinfo` AS bi
RIGHT JOIN `bookcategory` AS bc
ON bi.book_category_id = bc.category_id;
-- LEFT JOIN
SELECT bc.category AS "图书类型",bi.book_name AS "图书名称",bi.author AS "作者",bi.press AS "出版社"
FROM `bookinfo` AS bi
LEFT JOIN `bookcategory` AS bc
ON bi.book_category_id = bc.category_id;
操作 | 描述 |
---|---|
INNER JOIN | 如果一个表中至少有一个匹配,就返回行 |
LEFT JOIN | 会从左表中返回值,即使右表中没有匹配 |
RIGHT JOIN | 会从右表中返回值,即使左表中没有匹配 |
案例
-- 案例:查询价钱大于50的图书名称,作者,出版社以及图书类别
SELECT bc.category AS "图书类型",bi.book_name AS "图书名称",bi.author AS "作者",bi.press AS "出版社",`price` AS "价钱"
FROM `bookinfo` AS bi
LEFT JOIN `bookcategory` AS bc
ON bi.book_category_id = bc.category_id
WHERE bi.price > 50;
-- 思路
/*
1、我要查询哪些数据 select ...
2、从哪几个表中查 from 表 xxx join 连接的表 on 交叉条件
3、假设存在一种多张表查询,慢慢来,先查询两张表然后再慢慢增加
-- FROM a LEFT JOIN b 以a表为基准查
-- FROM a RIGHT JOIN b 以b表为基准查
*/
自连接
自己的表和自己的表连接,核心:一张表拆为两张一样的表
案例
根据category表查询复制信息
category_id | category | parent_id |
---|---|---|
1 | 计算机 | 0 |
2 | 医学 | 0 |
3 | 编程语言 | 1 |
4 | 数据库 | 1 |
5 | 儿科学 | 2 |
-- 查询父子信息
SELECT bc.category AS "图书子类",bc2.category AS "图书父类"
FROM `bookcategory` AS bc
INNER JOIN `bookcategory` bc2
ON bc.category_id = bc2.parent_id;
联表查询
案例
-- borrowinfo表插入数据
INSERT INTO `borrowinfo`(`book_id`, `card_id`, `borrow_date`, `return_date`, `status`) VALUES (20150201, '210210199901011111', '2022-09-22', '2022-09-30', '1');
INSERT INTO `borrowinfo`(`book_id`, `card_id`, `borrow_date`, `return_date`, `status`) VALUES (20150202, '210210199901012222', '2022-09-21', '2023-02-24', '1');
INSERT INTO `borrowinfo`(`book_id`, `card_id`, `borrow_date`, `return_date`, `status`) VALUES (20170301, '210220199901015555', '2022-09-01', '2022-09-20', '0');
INSERT INTO `borrowinfo`(`book_id`, `card_id`, `borrow_date`, `return_date`, `status`) VALUES (20170406, '210250199901011111', '2022-08-02', '2022-10-28', '1');
-- 查询正在借阅的书籍,书名,借阅人
SELECT bi.book_name AS "书名",ri.`name` AS "借阅人"
FROM `borrowinfo` AS br
INNER JOIN `bookinfo` AS bi
ON bi.book_id = br.book_id
INNER JOIN `readerinfo` AS ri
ON br.card_id = ri.card_id
WHERE br.`status` = 1;
分页和排序
分页
为什么要分页
- 为什么要分页?
- 缓解数据库压力,给人的体验更好,瀑布流
-- 分页
-- 读者信息,每页显示5条数据
-- 语法:limit 当前页,页面的大小
-- 第一页 LIMIT 0,5 (1-1) * 5
-- 第二页 LIMIT 5,5 (2-1) * 5
-- 第三页 LIMIT 10,5 (3-1) * 5
-- 第n页 LIMIT 0,5 (n-1) * pagesize,pagesize
-- pagesize代表页面大小,n代表当前页
-- (n-1) * pagesize: 起始页
-- n 当前页
-- 数据总数/页面大小 = 当前页
SELECT *
FROM `readerinfo`
LIMIT 1,5;
语法:limit(查询起始下标,pagesize)
排序
-- 排序:升序ASC , 降序:DESC
-- ORDER BY 通过哪个字段排序,怎么排
-- 查询读者信息的结果根据 年龄 降序 排序
SELECT *
FROM `readerinfo`
ORDER BY `age` DESC;
-- 查询借阅信息,书名、借阅人、借阅时间,根据借阅时间倒序排列
SELECT bi.book_name AS "书名",ri.`name` AS "借阅人",br.borrow_date AS "借阅时间"
FROM `borrowinfo` AS br
INNER JOIN `bookinfo` AS bi
ON bi.book_id = br.book_id
INNER JOIN `readerinfo` AS ri
ON br.card_id = ri.card_id
ORDER BY br.borrow_date DESC;
案例
-- 查询已借书籍,最近借阅的前十本书(书名,作者,借阅人,库存,借阅时间)
SELECT bi.book_name AS "书名",bi.author AS "作者",ri.`name` AS "借阅人",bi.store AS "剩余库存",br.borrow_date AS "借阅时间"
FROM `borrowinfo` AS br
INNER JOIN `bookinfo`AS bi
ON br.book_id = bi.book_id
INNER JOIN `readerinfo` AS ri
ON br.card_id = ri.card_id
WHERE br.`status`=1
ORDER BY br.borrow_date DESC
LIMIT 10;
子查询
where (这个值是计算出来的)
本质: 在where语句中嵌套一个子查询语句
-- 查询王鹏的借书情况(书名,作者,借阅人姓名,电话)
-- 方式一:使用联表查询
SELECT bi.book_name,bi.author,ri.`name`,ri.tel
FROM `borrowinfo` bri
INNER JOIN `readerinfo` ri
ON bri.card_id = ri.card_id
INNER JOIN `bookinfo` bi
ON bri.book_id = bi.book_id
WHERE ri.`name` = "王鹏";
-- 方式二 子查询
SELECT bi.book_name,bi.author,ri.`name`,ri.tel
FROM `borrowinfo` bri
INNER JOIN `readerinfo` ri
ON bri.card_id = ri.card_id
INNER JOIN `bookinfo` bi
ON bri.book_id = bi.book_id
WHERE bri.card_id = (
SELECT card_id
FROM `readerinfo`
WHERE `name` = "王鹏"
);
分组和过滤
-- 查询不同类别书籍的评价书价,最高书架,最低书价,平均价钱大于50
-- 核心(根据不同类型书籍分组)
SELECT bc.category AS "书籍类别",AVG(bi.price) AS "平均价钱",MAX(bi.price) AS "最高价",MIN(bi.price) AS "最低价"
FROM `bookinfo` AS bi
INNER JOIN `bookcategory` AS bc
ON bi.book_category_id=bc.category_id
GROUP BY bi.book_category_id; -- 通过平均字段来分组
HAVING bi.price > 50