连接数据库
mysql -uroot -p123456 --连接数据库
update mysql.user set authentication_string=password('123456') where user='root' and Host='localhost'; --修改用户权限
flush privileges; --刷新权限
--------------------------------------------------------------
--所有语句都用;结尾
show databases; --查看所有数据库
mysql> use school --切换数据库 使用school
Database changed
show tables; --查看数据库下所有表
describe student; --显示数据库中所有表信息
create database study; --创建数据库
exit; --退出连接
四种语言 | |
---|---|
DDL | 数据库定义语言 |
DML | 数据库操作语言 |
DQL | 数据库查询语言 |
DML | 数据库操作语言 |
操作数据库
1、创建数据库
create database [if not exists] study;
2.删除数据库
drop database [if exists] study;
3.使用数据库
-- 如果字段为特殊字符,需要使用``
use 'study';
4、查看数据库
数据类型
字段属性
Unsigned:
(1)无符号的整数
(2)声明了该列不能为负数
zerofill:
(1)0填充的
(2)不足的位数,使用0来填充,int(3),5—005
自增:
(1)通常理解为自增,自动在上一条记录的基础上+1(默认)
(2)通常用来设计唯一的主键~ index,必须为整数
(3)可以设置起始值和增量
非空:
假设设置为not null,如果不给它赋值,会报错!
默认:
设置默认的值
每个表必须存在以下五个字段:
id 主键
‘version’ 乐观锁
is_delete 伪删除
gmt_create 创建时间
gmt_update 修改时间
创建数据库表
-- ``是为了保证字段名不与一些特殊符号的冲突,字符串用''就行
-- auto_increment自增
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(1) 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
数据库引擎
INNODB 默认使用
MYISAM 早些年使用
MYISAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持(表锁定) | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间的大小 | 较小 | 较大,约为前者2倍 |
常规使用操作:
(1)MYISAM 节约空间,速度较快
(2)INNODB 安全性高,事务的处理,多表多用户操作
物理空间存储的位置:
所有数据库文件都存在data目录下
本质还是文件的存储
设置数据库表的字符集编码:
CHARSET=utf8
不设置,会是mysql默认的字符集编码(不支持中文)
在my.ini中配置默认的编码
修改删除表
-- 修改表名
alter table student1 rename as student
-- 添加表字段
alter table student add age int(11)
-- 修改表字段 (重命名,修改约束)
alter table student modify age varchar(11) -- 修改约束
alter table student change age age1 int(11) -- 重命名
-- 删除表字段
alter table student drop age1
-- 删除表
drop table if exists student
外键
create table grade(
gradeid int(10) not null auto_increment comment '年级id',
gradename varchar(50) not null comment '年级名称',
primary key (gradeid)
)engine=innodb DEFAULT charset=utf8
drop table student
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(1) not null DEFAULT '女' comment '性别',
`birthday` datetime DEFAULT NULL comment '出生日期',
`gradeid` int(10),
`address` varchar(100) DEFAULT null comment '家庭住址',
`email` VARCHAR(50) DEFAULT null COMMENT '邮箱',
primary key (`id`),
key `FK_gradeid`(`gradeid`),
constraint `FK_gradeid` foreign key(`gradeid`) references `grade`(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
删除由外键关系的表的时候,必须要先删除引用别人的表,再删除被引用的表
DML语言
数据库意义:数据存储,数据管理
DML语言:数据操作语言
(1)insert
-- 添加 不加字段名默认全部
insert into student (`name`,pwd,sex,birthday,address,email) values ('小明','123456','男','2022-10-3 10:32:10','河工大','123@163.com')
insert into student (`name`,pwd,sex,birthday,address,email) values ('小红','123456','女','2021-10-3 10:35:10','河工大','123@163.com')
insert into student (`name`,pwd,sex,birthday,address,email) values ('小李子','123456','男','2020-10-3 10:32:10','河工大','123@163.com')
insert into student (`name`,pwd,sex,birthday,address,email) values ('小红','123456','女','2026-10-3 10:35:10','河工大','123@163.com')
insert into grade (`gradename`) values ('大二')
insert into grade (`gradename`) values ('大二'),('大三'),('大二'),('大三')
(2)update
update student set `name`='小明',address='c' where `name`='d'
(3)delete
delete from student where id=1
-- 完全清空
truncate student
delete与truncate的区别:
(1)truncate重新设置自增列,计数器会归零
(2)truncate不会影响事务
DQL语言
select * from student;
-- 别名
select studentno as 学号,studentname as 姓名 from student as s;
-- 函数
select concat('姓名:',studentno) as 新名字 from student;
输出:
-- 去重
select distinct studentno from result;
-- 查询学号,成绩+1
select studentno,studentresult+1 as '加一分后' from result;
where子句之逻辑运算符
select studentno,studentresult from result where studentresult>=95 and studentresult<=100
select studentno,studentresult from result where studentresult between 95 and 100
-- 除了学号一千的学生成绩
select studentno,studentresult from result where not studentno = 1000
模糊查询
-- 查询姓赵的同学
-- like结合 %(代表0到任意个字符) _(一个字符)
select studentno,studentname from student where studentname like '赵%';
-- 查询赵姓且名字只有一个字
select studentno,studentname from student where studentname like '赵_';
-- 查询学号在指定范围的学生 in里不能加通配符
select studentno,studentname from student where studentno in (1000,1001);
-- 查询地址为空的学生
select studentno,studentname from student where address = '' or adddress is null;
联表查询
join on 和where分开用。where是筛选。join on是组成表,a和b表笛卡尔积,inner join on相当于where,left join和right join是左连接和右连接,左连接是左表所有数据都有,哪怕不符合on条件,on条件只会使筛选右表数据,会显示null,右连接类似。若三表连接,则在两表连接后接… join c on。
select s.studentno,s.studentname,r.subjectno,r.studentresult from student as s inner join result as r on s.studentno = r.studentno;
select s.studentno,s.studentname,r.subjectno,r.studentresult from student as s right join result as r on s.studentno = r.studentno;
select s.studentno,s.studentname,r.subjectno,r.studentresult from student as s left join result as r on s.studentno = r.studentno;
-- 查询缺考学生信息
select s.studentno,s.studentname,r.subjectno,r.studentresult from student as s left join result as r on s.studentno = r.studentno where subjectno is null;
-- 查询参加考试的学生学号,姓名,科目名和分数 三表联合查询
select s.studentno,s.studentname,subjectname,studentresult from student s right join result r on s.studentno = r.studentno
inner join `subject` sb on sb.subjectno = r.subjectno;
自连接(了解)
分页和排序
-- order by排序 asc升序,desc降序
-- 查询参加高等数学-1考试的学生学号,姓名,科目名和分数,并升序排序
select s.studentno,s.studentname,subjectname,studentresult from student s right join result r on s.studentno = r.studentno
inner join `subject` sb on sb.subjectno = r.subjectno and sb.subjectname = '高等数学-1' order by studentresult asc;
-- limit分页 起始页,页面大小
select s.studentno,s.studentname,subjectname,studentresult from student s right join result r on s.studentno = r.studentno
inner join `subject` sb on sb.subjectno = r.subjectno and sb.subjectname = '高等数学-1' order by studentresult asc limit 0,2;
子查询和嵌套查询
-- 查询高等数学-1成绩大于等于80的学生学号、姓名
select s.studentno,s.studentname from student s,result r where s.studentno = r.studentno and r.studentresult>=80 and r.subjectno = (select subjectno from `subject` where
subjectname='高等数学-1')
常用函数
-- 常用函数
select abs(-1) --绝对值
select ceiling(9.4) --向上取整
select floor(9.4) --向下取整
select randn() --返回0-1的随机数
select sign(10) --判断符号 0-0 负数--1 正数-1
-- 字符串函数
select CHAR_LENGTH('aaaaaaaa') --长度
select concat('a','b') --拼接
select insert('abcdabc',1,2,'acc') --查询,替换
select lower('abcDabc') --小写
select upper('abcDabc') --大写
聚合函数
count()总数
sum()求和
max,min,avg
-- 查询不同课程的平均分、最高分、最低分 group by 和聚合函数一起用,计算每个组的某某
select subjectname,AVG(studentresult),MAX(studentresult),MIN(studentresult) from result r,`subject` sub where r.subjectno = sub.subjectno
GROUP BY r.subjectno;
-- 查询不同课程的平均分、最高分、最低分 且平均分大于等于50 having 筛选分组
select subjectname,AVG(studentresult) as pingjun,MAX(studentresult),MIN(studentresult) from result r,`subject` sub where r.subjectno = sub.subjectno GROUP BY r.subjectno HAVING pingjun >= 50;
数据库级别MD5加密
什么是MD5?
主要增强算法复杂度和不可逆性。
MD5不可逆,具体的值的md5是一样的
MD5破解网站的原理,背后有一个字典,MD5加密后的值,加密的前值。
加密后:
校验时也对用户的输入进行md5加密,然后查询。