1— 操作数据库
1.1–创建数据库表(重要)
-- 创建一个数据库的表格
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 comment'密码',
`sex` varchar(2) not null 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
show create database school -- 查看创建school数据库
show create table student -- 查看创建student数据表的定义语句
desc student -- 显示表的结构
1.2–数据表的类型
-- 关于数据库的引擎
-- INNODB 是默认使用
-- MyISAM 是早些年使用的
MYISAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 行锁定 |
外键 | 不支持 | 支持 |
全文索引 | 支持 | 支持(新版本) |
表空间大小 | 较小 | 较大,约为2倍 |
优势 | 节约空间,速度快 | 安全性高,支持事务处理,支持外键多表多用户操作 |
所有的数据库文件都存储在data 文件夹中D:\mysql\mysql-8.0.23\mysql-8.0.23\data
数据库本质还是文件的存储。
MySQL引擎在物理文件上的区别:
- —innode 在MySQL8.0版本只有.idb文件
- —myisam在MySQL8.0版本有三个文件 .MYD— 数据文件 .MYI—放置索引 .frm --表结构的定义文件
1.3–设置数据库表的字符集编码
1.4–修改删除表
ALTER TABLE teacher RENAME AS teacher1 -- 修改表的名称
ALTER TABLE teacher1 ADD age INT(9) -- 给标准增加字段
ALTER TABLE teacher1 MODIFY age VARCHAR(7) -- modify 修改表的字段
ALTER TABLE teacher1 CHANGE age age1 INT(19) -- change 字段重命名 可以修改表的字段
ALTER TABLE teacher1 DROP age1 -- 删除表的字段
DROP TABLE IF EXISTS teacher1 -- 删除表
2–MySQL数据管理
2.1 DML 语言
DML= Data Manipulation Language 数据操作语言
包括了增删改查四个部分
- insert 插入
- update 更新 改动
- delete 删除
- truncate 删除
2.2 insert
-- 插入语言insert
-- INSERT INTO tablename (field1, field2, .…, fieldn)VALUES (value1, value2, ..……, valuen);
INSERT INTO `school` (`name`) VALUES ('李四')
INSERT INTO `school` (`name`) VALUES ('王五'),('赵六') -- 插入一个字段的多个列属性
INSERT INTO `school` (`name`,`sex`) VALUES ('王五','boy'),('赵六','girl') -- 插入不同字段的不同属性
2.3 update
-- 修改学员名称,带了条件
UPDATE `school` SET `name` ='oliver' WHERE id=0015
-- 不指定条件的话 会改动所有表
UPDATE `school` SET `name` ='oliver'
-- 修改多个属性,逗号隔开
UPDATE `school` SET `name` ='oliver',`sex`='boy'WHERE id<0018
where 操作符会返回布尔值
操作符 | 含义 | 结果 |
---|---|---|
= | 等于 | |
!= 或者<> | 不等于 | |
> | 大于 | |
< | 小于 | |
<= | 小于等于 | |
>= | 大于等于 | |
BETWEEN…AND… | 在某个范围内 | |
…AND… | 我和你两者都要满足 | |
…OR… | 我或者你其中一个成立就可 |
UPDATE `school` SET `name` ='elio',`sex`='boy' WHERE id<0018 and id>0015
2.4delete/truncate
-- DELETE FROM tablename [where CONDITION]
DELETE FROM `school` -- 不会影响自增
--可以一次删除多个表的数据
--DELETE t1, t2, ..., tn FROM t1, t2, ..., tn [WHERE CONDITION]
TRUNCATE TABLE `school` -- 自增会归为0
所以一般推荐使用 truncate来进行删除
3-- DQL查询数据(最重点)
DQL=data query language=数据查询语言
DML(Database Manipulation Language)数据库表数据操作语言
关键字:Insert,Delete,Update,Truncate
DDL(Database Definition Language)数据库表结构操作语言
关键字:Create,Alter
DCL(Database Control language)数据库权限控制操作语言
关键字:Grant,Remove
DQL(Database Query Language)
关键字:Select
- 所以的查询操作都用它
- 简单复杂的查询它都能做
- 数据库最核心的语言,最重要的语言,使用频率最高的语句
1— 简单查询
-- 查询所有的学生 SELECT 字段(如果为*,表示所有字段) FROM 表名
SELECT * FROM student
-- 查询指定字段
SELECT `StudentNo`,`Phone` FROM student
-- 别名,可以给字段起名字,可以给表起名字
SELECT `StudentNo` AS `学号`,`Phone` AS `电话` FROM student AS A
-- 函数 concat (a,b)
SELECT CONCAT ('姓名:',StudentName) AS 新名字 FROM student
2–去重
-- distanct 去除select 查询出来的结果中重复的数据,
-- 查询全部的成绩
SELECT * FROM result
-- 查询有哪些学生参加了考试
SELECT `StudentNo` FROM result
-- 发现重复数据 去重
SELECT DISTINCT `StudentNo` FROM result
3 数据库的表达式
-- 查看系统版本
SELECT VERSION()
-- 用来计算
SELECT 100-9 AS jisuan --(别名)
-- 查询自增的步长
SELECT @@auto_increment_increment
-- 学员成绩+1分查看
SELECT `StudentNo`,`StudentResult` +1 AS '提分后' FROM result
-- AS 后跟的始终是新的名字
数据库中 的表达式:文本值,列,null,函数,计算表达式,系统变量…
4–where 条件子句
作用: 检索数据中符合条件的值
返回结果为布尔值
-- 逻辑运算符
-- ====================== where ==================
SELECT StudentNo ,`StudentResult` FROM result
-- 查询成绩在95-100之间
SELECT StudentNo ,`StudentResult` FROM result
WHERE StudentResult>=95 AND StudentResult<=100
-- 模糊查询
SELECT StudentNo ,`StudentResult` FROM result
WHERE StudentResult BETWEEN 90 AND 100
-- 学生学号不等于1000 的学生
SELECT StudentNo ,`StudentResult` FROM result
WHERE NOT StudentNo=1000
运算符 | 语法 | 描述 |
---|---|---|
and && | a and b // a && b | 两个为真才为真 |
or || | a or b // a || b | 一个为真即为真 |
not ! | not a // !a | 取反,真为假,假为真 |
模糊查询
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | a is null | 如果操作符为null ,则结果为真 |
IS NOT NULL | a is not null | 如果操作符不为null ,则结果为真 |
BETWEEN | a between b and c | 如a 在b和c之间,则结果为真 |
Like | a Lile b | SQL 匹配 如果a 匹配b ,则结果为真 |
In | a in ( b,c,d…) | 如果a 在b,huoc,d 里面的某一个值中,结果为真 |
-- ===========模糊查询========
-- 查询姓什么的同学
-- like 结合% (代表0到任意个字符) _ (一个字符)
SELECT StudentNo ,`StudentName` FROM student
WHERE StudentName LIKE '张%'
-- 查询姓什么的同学 名字后面只有一个字
-- like 结合% (代表0到任意个字符) _ (一个字符)
SELECT StudentNo ,`StudentName` FROM student
WHERE StudentName LIKE '张_'
-- 查询姓什么的同学 名字后面只有两个字
SELECT StudentNo ,`StudentName` FROM student
WHERE StudentName LIKE '张__'
-- 查询名字中带有嘉
SELECT StudentNo ,`StudentName` FROM student
WHERE StudentName LIKE '%强%'
5 —联表查询JoinON
-- 查询参加了考试的同学(姓名,学号,科目编号,分数)
SELECT * FROM student,result
/*
思路
1. 分析需求,需要查询的字段来自那些表格中,分别找到
2.确定是使用那种连接,left join
inner join right join
3.确定交叉点(这两个表中那些数据是相同的)这个是判断的条件
*/
-- inner join
SELECT s.StudentNo,StudentName,SubjectNo,StudentResult
FROM student s
INNER JOIN result r
ON s.StudentNo=r.StudentNo
-- right join
SELECT s.StudentNo,StudentName,SubjectNo,StudentResult
FROM student s
RIGHT JOIN result r
ON s.StudentNo=r.StudentNo
-- left join
SELECT s.StudentNo,StudentName,SubjectNo,StudentResult
FROM student s
INNER JOIN result r
ON s.StudentNo=r.StudentNo
-- 查询姓名和学号没有填写的同学
SELECT s.StudentNo,StudentName,SubjectNo,StudentResult
FROM student s
RIGHT JOIN result r
ON s.StudentNo=r.StudentNo
WHERE s.studentNo IS NULL
-- where 是等值查询
-- on 是连接查询
思考题
/*
查询参加考试的学生信息:( 学号,学生姓名,科目名,分数)
1。分析需求,分析查询的字段来自哪些表
2.确定使用哪种连接查询? 7种网上百度
3.确定交叉点(这两个表中哪些数据是相同的)
判断的条件: 学号==学号
*/
SELECT s.StudentNo,StudentName,SubjectName,StudentResult
FROM student s
RIGHT JOIN result r
ON s.StudentNo=r.StudentNo
INNER JOIN `subject` sub
ON sub.subjectNo=r.subjectNo
6–自连接
自己的表和自己的表连接,核心:一张表拆为两张一样的表即可
pid | categoryid | categoryname |
---|---|---|
1 | 2 | 信息技术 |
1 | 3 | 软件开发 |
1 | 5 | 美术设计 |
2 | 8 | 办公信息 |
3 | 6 | web开发 |
3 | 4 | 数据库 |
5 | 7 | ps技术 |
-- 查询父子信息,把一张表看出两张一模一样的表
SELECT a.`categoryName` AS'父栏目' ,b.`categoryName`AS'子栏目'
FROM `category` AS a,`category`AS b
WHERE a.`categoryid`=b.`pid`
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xwesOru3-1619838334500)(C:\Users\小石小石\AppData\Roaming\Typora\typora-user-images\image-20210415151717964.png)]
7–查询练习
-- 查询学生所属的年纪(学号,姓名,年级名称)
SELECT `StudentNo`,`StudentName`,`GradeName`
FROM student s
INNER JOIN grade g
ON s.`GradeId`=g.`GradeId`
-- 查询考试高等数学-1的同学信息(考试科目,学生姓名,学生成绩)
SELECT `SubjectName`,`StudentName`