数据库深入

本文详细介绍了字符串函数如拼接、大小写转换、空格处理及截取,数字函数包括向上取整、向下取整等,同时涵盖时间函数如当前日期、时间计算和日期差。此外,讲解了流程控制、数据库约束、外键关联、链表查询、自联查询和子查询的运用,以及组合查询和关键标签解析。
摘要由CSDN通过智能技术生成

1、字符串函数
  常用函数:
函数    功能
CONCAT(s1, s2, ..., sn)    字符串拼接,将s1, s2, ..., sn拼接成一个字符串
LOWER(str)    将字符串全部转为小写
UPPER(str)    将字符串全部转为大写
LPAD(str, n, pad)    左填充,用字符串pad对str的左边进行填充,达到n个字符串长度
RPAD(str, n, pad)    右填充,用字符串pad对str的右边进行填充,达到n个字符串长度
TRIM(str)    去掉字符串头部和尾部的空格
SUBSTRING(str, start, len)    返回从字符串str从start位置起的len个长度的字符串

-- 字符串拼接函数
    select name from tudent;
     
    select concat('我的名字叫:',name,",年龄:",age) as n from student;
     
    -- 字符串转换为大写和小写
    select name,upper(name),LOWER(name) from student;
     
    -- 去除前后空格
    select address,trim(address) from student;
     
    -- 找到姓李得学生 字符串得截取
    select * from student where name like '李%';
     
    select * from student where substr(name,1,1)='李'

 2、数字函数
函数          功能
CEIL(x)    向上取整
FLOOR(x)    向下取整
MOD(x, y)    返回x/y的模
abs(x)    求某个数得绝对值

 -- 向上取整 5.1你给定得值
    select ceil(5.1),floor(5.9),mod(10,3),abs(-5.9) from t_student;
     
    -- 要求如果status为0变为1 为1变为0  update
    update aaa set status=abs(status-1);
3、时间函数
函数               功能
CURDATE()    返回当前日期
CURTIME()    返回当前时间
NOW()    返回当前日期和时间
YEAR(date)    获取指定date的年份
MONTH(date)    获取指定date的月份
DAY(date)    获取指定date的日期
DATE_ADD(date, INTERVAL expr type)    返回一个日期/时间值加上一个时间间隔expr后的时间值
DATEDIFF(date1, date2)    返回起始时间date1和结束时间date2之间的天数

CURDATE()返回当前日期  后面可以不用跟表名

    select curdate();
    -- 可以用在where
    select * from tb_emp where curdate()-entrydate=1
 
     
    -- CURTIME()返回当前时间
    select curtime() ;
     
    -- NOW()返回当前日期和时间
    select now();
     
    -- YEAR(date)获取指定date的年份
    select year('2022-04-25');
     
    select * from tb_emp where year(entrydate)=2022
     
    -- DATE_ADD(date, INTERVAL expr  type)返回一个日期/时间值加上一个时间间隔expr后的时间值
    SELECT DATE_ADD('2020-04-25', INTERVAL 3 YEAR);
     
    -- DATEDIFF(date1, date2)返回起始时间date1和结束时间date2之间的天数
    select datediff('2020-05-25','2020-04-25');


4 、流程函数
函数                            功能
IF(value, t, f)    如果value为true,则返回t,否则返回f
IFNULL(value1, value2)    如果value1不为空,返回value1,否则返回value2
CASE WHEN [ val1 ] THEN [ res1 ] ... ELSE [ default ] END    如果val1为true,返回res1,... 否则返回default默认值
CASE [ expr ] WHEN [ val1 ] THEN [ res1 ] ... ELSE [ default ] END    如果expr的值等于val1,返回res1,... 否则返回default默认值

    -- 如果年龄>30妇女  否则少女
    select age,if(age>30,'妇女','少女') from tb_emp;
     
    -- ifnull 如果为null,则
    select job,ifnull(job,'工作待定') from tb_emp;
 5、约束
什么是约束? 就是在表中为某些列添加约束,使该列得值必须符合这个约束。

分类:
约束    描述    关键字
非空约束    限制该字段的数据不能为null    NOT NULL
唯一约束    保证该字段的所有数据都是唯一、不重复的    UNIQUE
主键约束    主键是一行数据的唯一标识,要求非空且唯一    PRIMARY KEY
默认约束    保存数据时,如果未指定该字段的值,则采用默认值    DEFAULT
检查约束(8.0.14版本后)    保证字段值满足某一个条件    CHECK
外键约束    用来让两张图的数据之间建立连接,保证数据的一致性和完整性    FOREIGN KEY

6、外键约束
 add contraint 约束得名称  foregin key 外键得列名 REFERENCES 主表名(主键)  

alter table 从表名 add contraint 约束名随便起 foreign key 外键列名 references  主表(主键)

create table t_class(
        cid int primary key auto_increment,
            cname varchar(20)
    );
    create table t_stu(
         sid int primary key auto_increment,
             sname varchar(20),
             classid int -- 表示外键列。
    );
     
    alter table t_stu add CONSTRAINT fk_stu_class FOREIGN key (classid) REFERENCES t_class(cid);
     
    insert into t_class values(null,'QY145'),(null,'QY151');
     
    insert into t_stu values(null,'李四',2);
    -- 因为classid=3 这个值 在我们得班级表中不存在。所以不能添加
    insert into t_stu values(null,'张三',1);

7.链表查询
为什么需要连表查询?

1.如果查询得结果在一张表中无法获取,需要关联多张表,那么这时就需要连表查询。

2.连表查询大多数都作用在外键得基础上。--- 表与表之间有关联

7.1 表与表之间存在得关系
一对多: 在多得一方添加外键列

多对多: 需要在创建一个中间表,该表中至少有两个外键列

7.2 连表查询


 7.3 内连接
 隐式查询 select 列名.... from 表1,表2 where 连表得条件。
-- 连表查询时,如果不使用连表条件则出现笛卡尔集。
-- 所谓笛卡尔集 就是A表中每一条记录关联B中中得每条记录
-- 查询每一个员工的姓名,及关联的部门的名称〔隐式内连接实现)
select * from tb_emp,tb_dept where tb_emp.dept_id=tb_dept.id;
-- 查询每一个员工的姓名,及关联的部门的名称〔显式内连接实现)
select * from tb_emp  e inner join tb_dept d on e.depte_id=d.id; 
7.4 外连接
-- 语法: select 查询列集 from A表 left join B表 on 连表条件
-- 查询emp表的所有数据, 和对应的部门信息(左外连接)
select *from tb_emp e left join tb_dept d on e.dept_id = d.id;
-- 查询dept表的所有数据,和对应的员工信息(右外连接)
select *from tb_emp e right join tb_dept d on e.dept_id = d.id;
 
8 自联查询
自己和自己相连接查询。
select * from A表 join A表 on 连表条件。

-- 自己和自己相连接查询。
-- select * from A表 join A表 on 连表条件。
-- 查询员工及其所属领导的名字。你要查询的结果再一张表中,但是还不能使用单表查询得到结果
select a.name,b.name from tb_emp a join tb_emp b on a.managerid=b.id;
-- 查询所有员工 emp及其领导的名字emp,如果员工没有领导,也需要查询出来
select a.name,b.name from tb_emp a left join  tb_emp b on a.managerid=b.id;
9 子查询
-- 查询市场部的员工信息
-- 子查询返回的结果一列一条记录
 select * from tb_emp where dept_id=(select id from tb_dept where name ='市场部');
 
 
-- 查询市场部和研发部员工的信息。in 
select * from tb_emp where dept_id in (select id from tb_dept where name in ('市场部','研发部'));
 
 
 -- 查询入职之后的员工信息
select * from tb_emp where entrydate>(select entrydate from tb_emp where name='张无忌');
 
 
-- 查询比财务部所有人工资都高的员工信息
select * from tb_emp where salary>(    select max(salary) from tb_emp e join tb_dept d on e.dept_id=d.id where d.name='财务部')

10 组合查询
-- sql union sql --->把这两条sql查询的结果组合到一起。如果有重复记录则合并成一条。
-- sql union all sql--->把这两条sql查询的结果组合到一起。如果有重复记录,不合并。 
 
select * from tb_emp where salary>8000
    UNION all 
select * from tb_emp where age>40;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值