一、多表查询
- 什么是多表查询呢?
比如说,一个老师肯定会有不止一个学生,一个学生也会有不止一个老师,这样就存在了一种多对多的关系。
- 多对多关系表的创建
CREATE DATABASE moreandmore;
USE moreandmore;
//先创建三张表 分别是 老师表 学生表 学生老师关系表
CREATE TABLE teach(tid INT PRIMARY KEY ,NAME VARCHAR(50));
CREATE TABLE stu(sid INT PRIMARY KEY,NAME VARCHAR(50));
CREATE TABLE tea_stu_rel(tid INT,sid INT);
//给学生老师关系表中的tid 和 sid 添加外键
ALTER TABLE tea_stu_rel ADD CONSTRAINT FOREIGN KEY(tid) REFERENCES teach(tid);
ALTER TABLE tea_stu_rel ADD CONSTRAINT FOREIGN KEY(sid) REFERENCES stu(sid);
- 内连接
select r.SubjectNo,StudentName,SubjectName,StudentResult
from student as s
inner join result as r
on r.StudentNo = r.StudentNo
inner join subject as su
on su.SubjectNo = r.SubjectNo
where SubjectName = '高等数学-1' and StudentResult < 80
order by StudentResult desc ;/*降序*/
- 左连接
//left join 左连接:匹配左边的表,哪怕右边没有对应结果,返回左边表的所有列
select s.StudentNo,StudentName,SubjectNo,StudentResult
from student as s
left join result as r
on 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;
二、常用的数据库函数
函数分类:字符串函数,数值函数,日期和时间函数,流程函数,其他函数
- 字符串函数
concat(s1,s2,…,sn) 拼接字符串
SELECT CONCAT('aaa','bbb');
所有字符串和null拼接,结果都为null
SELECT CONCAT('aaa','bbb',NULL);
SELECT INSERT('mysql123',6,3,'hello');//mysqlhello
SELECT LOWER('ASd');//asd
SELECT UPPER('asdA');//ASDA
SELECT LEFT('asdf',2);//as
SELECT RIGHT('gfds',2);//ds
//用字符串he向左填充,直到字符串的长度为10个
SELECT LPAD('hello',10,'he');//hehehhello
//用字符串he向右填充,直到字符串的长度为10个
SELECT RPAD('hello',10,'he');//helloheheh
SELECT LTRIM(' hellovfvfdvf ');//去字符串左边空格
SELECT RTRIM(' hello ');//去字符串右边空格
SELECT TRIM(' hello ');//去掉字符串两端空格
SELECT REPEAT('hello',5);//字符串hello重复5次
SELECT REPLACE('hello','e','a');//hello字符串中的e替换成a
SELECT SUBSTRING('hello',2,3);//ell从第二个位置截取三个字符
- 数值函数
SELECT ABS(-1.0);//绝对值 1.0
SELECT CEIL(4.3);//向上取整 5
SELECT FLOOR(4.9);//向下取整 5
SELECT MOD(2.43243,3);//取余 2.43243
SELECT RAND();//返回0-1的随机小数
- 日期时间函数
SELECT CURDATE();//2019-07-11
SELECT CURTIME();//19:10:00
SELECT NOW();//2019-07-11 19:10:00
SELECT UNIX_TIMESTAMP();//1562843465
SELECT FROM_UNIXTIME(1562843465);//2019-07-11 19:11:05
SELECT WEEK(NOW());//27
SELECT HOUR('19:10:00');//19
SELECT YEAR('2019-07-11');//2019
SELECT MINUTE('19:10:00');//10
SELECT DATE_ADD(NOW(),INTERVAL 31 DAY);//2019-08-11 19:19:26
select date_add(now(),interval 3 year);//2022-08-11 19:19:26
SELECT DATEDIFF(NOW(),'2018-07-11');//365
- 流程函数
SELECT IF(2>3,'true','false');//FALSE
//如果value1为null,则返回value2,否则 返回value1
select ifnull(value1,value2);
SELECT IFNULL(NULL,'nonull');//nonull
- 其他函数
SELECT DATABASE();//返回当前数据库的名字
SELECT VERSION();//返回当前数据库的版本5.7.19
SELECT USER();//root@localhost 返回当前的用户
SELECT PASSWORD('root');//81F5E21E35407D884A6CD4A731AEBFB6AF209E1B