1.外键
方式一、在创建表的时候,增加约束(麻烦,比较复杂)
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
-- 学生表的gradeid字段要去引用年级表的gradeid
-- 定义外键key
-- 给这个外键添加约束(执行引用)reference引用
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(30) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`brithday` DATETIME DEFAULT NULL COMMENT '出生日期',
`gradeid` INT(10)NOT NULL COMMENT '学生的年级',
`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
方式二、创建表后,增加约束(麻烦,比较复杂)
-- 创建表没有外键关系
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`);
以上操作都是物理外键,不建议使用,之后用程序实现,数据库层面最好解耦。
二.DML语言(全部记住)
数据管理语言
- insert
- update
- delete
2.1、添加(INSERT)
-- 插入多个字段
insert into `grade`(`gradename`)values('大二'),('大一')
insert into `student`(`name`)values('张三')
insert into `student`(`name`,`pwd`,`sex`)values('李四','32556','男')
语法:insert into 表名([字段名1,字段名2,字段名3])values('值1'),('值2'),...
2.2、修改(UPDATE)
-- 修改学员的名字,不指定where会改所有数据
update `student` set `name`='狂神' where id=1;
-- 语法:UPDATE 表名 set column_name = value where [条件]
-- 修改多个属性
UPDATE `student` set `name`='狂神',email='3213124@qq.com' where id=2;
-- 语法:UPDATE 表名 set column_name = value,[column_name = value] where [条件]
条件:where子句运算符id等于某个值,大于某个值,在某个区域修改。
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | 5=6 | false |
<>或!= | 不等于 | 5<>6 | true |
BETWEEN...AND... | 在某个范围内 | [2,5] | |
AND | 我和你&& | 5>1AND1>2 | false |
OR | 我或你|| | 5>1or1>2 | true |
-- 通过多个条件定位数据
UPDATE `student` SET `name`='狂神1' WHERE sex='女' AND pwd='32556';
语法:UPDATE 表名 SET column_name = value WHERE [column_name = value] AND [column_name = value];
2.3、删除(DELETE)
-- 删除数据
DELETE FROM `student` WHERE id=1
-- 清空
TRUNCATE `student`
DELETE和TRUNCATE区别在于后者自增会归零。
三.DQL查询语言(重点)
3.1、指定查询字段
简单查询
-- 查询全部学生 SELECT 字段 FROM 表
SELECT * FROM student
-- 查询指定字段
SELECT `studentno`,`studentname` FROM student
-- 别名,给结果起一个名字 AS 可以给表起别名
SELECT `studentno` AS 学号,`studentname` AS 名字 FROM student
-- 函数 Concat(a,b)
SELECT CONCAT('姓名:',`studentname`) AS 新名字 FROM student
语法:SELECT 字段...FROM 表
去重
-- 查询一下有哪些同学参加了考试,成绩
SELECT * FROM result-- 查询全部考试成绩
SELECT `studentno` FROM result -- 查询哪些同学参加了考试
SELECT DISTINCT `studentno` FROM result -- 发现重复数据,去重
数据库的列(表达式)
-- 查看系统版本
SELECT VERSION()-- 查询版本(函数)
SELECT 100*3-1 AS 计算结果-- 用来计算(表达式)
SELECT @@auto_increment-- 自增的步长(变量)
-- 学员考试成绩+1分查看
SELECT `studentno`,`studentresult`+1 AS '提分' FROM result
数据库中的表达式:文本值,列,Null,函数,计算表达式,系统变量...
3.2、where条件子句
作用:检索数据中符合条件的值
逻辑运算符
操作符 | 语法 | 描述 |
---|---|---|
and && | a and b a&&b | 逻辑与 |
or || | a or b a||b | 逻辑或 |
Not ! | not a !a | 逻辑非 |
-- ======================where======================
SELECT `studentno`,`studentresult` FROM result
-- 查询考试成绩在95~100分之间
SELECT `studentno`,`studentresult` FROM result
WHERE `studentresult`>=85 AND `studentresult`<=100
-- 模糊查询(区间)
SELECT `studentno`,`studentresult` FROM result
WHERE `studentresult`BETWEEN 85 AND 100
-- 除了1000号学生之外的同学成绩
SELECT `studentno`,`studentresult` FROM result
WHERE `studentno`!=1000
3.3、模糊查询
运算符 | 语法 | 描述 |
---|---|---|
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 like b | SQL匹配,如果a匹配b,则结果为真 |
In | a in(a1,a2,a3...) | 假设a在a1,或者a2...其中一个值中,结果为真 |
-- ===============模糊查询===============
-- 查询姓刘的同学
-- 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 '刘__'
-- 查询名字后面有嘉字
SELECT `studentno`,`studentname` FROM student
WHERE `studentname` LIKE '%嘉%'
-- ===============in(具体的一个或者多个值)====================
-- 查询1001,1002,1003号学员
SELECT `studentname`,`studentno` FROM student
WHERE studentno IN(1001,1002,1003);
-- 查询在北京的学生
SELECT `studentno`,`studentname` FROM `student`
WHERE `address` IN('安徽');
-- ==== null not null====
-- 查询地址为空的学生 null
SELECT `studentno`,`studentname` FROM `student`
WHERE address='' OR address IS NULL
-- 查询有出生日期的同学不为空
SELECT `studentno`,`studentname` FROM `student`
WHERE `borndate` IS NOT NULL
3.4、联表查询
JOIN对比
-- ============联表查询join===============
-- 查询参加了考试的同学(学号,姓名,科目编号,分数)
select * from student
select * from result
select s.studentno,studentname,subjectno,studentresult
from student as s
inner join result as r
where s.studentno=r.studentno
-- Right Join
select s.studentno,studentname,subjectno,studentresult
from student as s
right join result as r
on s.studentno=r.studentno
-- Left Join
SELECT s.studentno,studentname,subjectno,studentresult
FROM student AS s
left JOIN result AS r
ON s.studentno=r.studentno
操作符 | 描述 |
---|---|
Inner join | 如果表中至少有一个匹配,就返回匹配的值 |
left join | 会从左表中返回所有的值,即使右表中没有匹配 |
right join | 会从右表中返回所有的值,即使左表中没有匹配 |
3.5、分页和排序
排序
-- 排序:升序(ASC)和降序(DESC)
SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult`
FROM `student` s
INNER JOIN `result` r
ON s.`studentno`=r.`studentno`
INNER JOIN `subject` sub
ON r.`subjectno`=sub.`subjectno`
WHERE subjectname LIKE '高等数学%'
ORDER BY `studentresult` ASC
分页
-- 分页:每页只显示五条数据
-- 语法:limit当前页,页面的大小
-- LIMIT 第n页每页k条数据 (n-1)*k,k
SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult`
FROM `student` s
INNER JOIN `result` r
ON s.`studentno`=r.`studentno`
INNER JOIN `subject` sub
ON r.`subjectno`=sub.`subjectno`
-- WHERE subjectname LIKE '高等数学%'
-- ORDER BY `studentresult` ASC
LIMIT 0,5
3.6、子查询
本质在where语句中签到一个子查询语句
SELECT s.`studentno`,`studentname`
FROM `student` s
INNER JOIN `result` r
ON r.`studentno`=s.`studentno`
WHERE `studentresult`>=80 AND `subjectno`=(
SELECT `subjectno` FROM `subject`
WHERE `subjectname`='高等数学-2'
)
四.MySQL函数
4.1、常用函数
-- ========常用函数==========
-- 数学运算
SELECT ABS(-8) -- 绝对值
SELECT CEILING(9.4) -- 向上取整
SELECT FLOOR(9.4) -- 向下取整
SELECT SIGN(-10) -- 判断一个数的符号
SELECT RAND() -- 返回一个0~1的随机数
-- 字符串函数
SELECT CHAR_LENGTH('小汉堡') -- 字符串长度
SELECT CONCAT('我爱','你们') -- 拼接字符串
SELECT INSERT('我爱编程',1,2,'超级爱') -- 插入替换,从1处替换2个长度
SELECT LOWER('KuanSheng') -- 小写字母
SELECT UPPER('KuanSheng') -- 大写字母
SELECT INSTR('KuanSheng','u') -- 返回出现索引
SELECT REPLACE('坚持就能成功','坚持','努力') -- 替换指定字符串
SELECT SUBSTR('坚持就能成功',1,6) -- 从1处开始截取6个
SELECT REVERSE('坚持就能成功') -- 反转字符串
-- 查询姓周的同学,改为㑇
SELECT REPLACE(studentname,'张','章') FROM `student`
WHERE `studentname` LIKE '张%'
-- 时间和日期
SELECT CURRENT_DATE() -- 获取当前日期
SELECT CURDATE()
SELECT NOW()
SELECT YEAR(NOW())
SELECT MONTH(NOW())
SELECT DAY(NOW())
SELECT HOUR(NOW())
SELECT MINUTE(NOW())
SELECT SECOND(NOW())
-- 系统
SELECT SYSTEM_USER()
SELECT VERSION()
4.2、聚合函数(常用)
函数名称 | 描述 |
---|---|
COUNT() | 计数 |
SUM | 求和 |
AVG | 平均值 |
MAX() | 最大值 |
MIN() | 最小值 |
... |
5.3、数据库级别的MD5加密
主要增强复杂度不可逆性
CREATE TABLE `testMD5`(
`id` INT(4) NOT NULL,
`name` VARCHAR(20) NOT NULL,
`pwd` VARCHAR(50) NOT NULL,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 明文密码
INSERT INTO `testmd5` VALUE(1,'zhangsan','123456'),(2,'lisi','123456'),(3,'wangwu','123456')
-- 加密
UPDATE `testmd5` SET pwd=MD5(pwd)
-- 插入的时候加密
INSERT INTO `testmd5` VALUE(4,'xiaoming',MD5('123456'))
-- 如何校验,将用户传递进来的密码进行md5加密,然后比对加密后的值
SELECT * FROM `testmd5` WHERE `name`='xiaoming' AND pwd=MD5('123456')