MySQL学习笔记day3

发布于:2022-12-11 ⋅ 阅读:(164) ⋅ 点赞:(0)

主要具体记录MySQL里函数和多表查询的语法

函数

select 函数(字段列表) from 表名;
函数
类别 关键字 用处
字符串函数 concat(s1,s2,...sn) 字符串拼接
lower(str) 将字符串str全部转为小写
upper(str) 将字符串str全部转为大写
lpad(str,n,pad) 用pad对str左边进行填充直到n个长度
rpad(str,n,pad) 用pad对str右边进行填充直到n个长度
trim(str) 去掉字符串头部和尾部的空格
substring(str,start,len) 返回str从start位置起len长度的字符串
数值函数 ceil(x) 向上取整
floor(x) 向下取整
mod(x,y) 返回x/y的模
rand() 返回0-1内的随机数
round(x,y) 求参数x的四舍五入值,保留y位小数
日期函数 curdate() 返回当前日期
curtime() 返回当前时间
now() 返回当前日期和时间
year(date) 获取指定date的年份
month(date) 获取指定date的月份
day(date) 获取指定date的天
date_add(date,interval exper type) 返回一个日期/时间值加上一个时间间隔exper后的时间值
datediff(date1,date2) 返回起始时间date1和结束时间date2之间的天数
流程函数 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 [exper] when [val1] then [res1] ...else [default] end 如果exper的值等于val1返回res1,...否则返回默认值default

语法规则可以借鉴day1里介绍的聚合函数

约束

在介绍多表查询前先来了解SQL里的约束,

约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束

------示例
creat table id(
                 ----身份证号唯一且非空
                 idcard primary key varchar(18),
                 -----性别非空
                 gender not null char,
  );
关键词 作用
not null 非空约束,限制字段的数据不为null
unique 唯一约束,保证该字段的所有数据都是唯一,不重复的
primary key 主键约束,主键是一行数据的唯一标识,要求非空且唯一
default 默认约束,保存数据时如果未指定该字段的值,则使用默认值
check 检查约束,保证字段值满足某一个条件
foreign key 外键约束,用来让两个表之间建立连接,保证数据的一致性和唯一性

添加外键

creat table 表名(
        字段名 数据类型,
        .....
        [constraint] [外键名称] foreign key (外键字段名) references 主表 (主表列名)

);

-------或者

alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表 (主表列名);

删除外键

alter table 表名 drop foreign key 外键名称;

删除更新行为

alter table 表名 add constraint 外键名称 foreign key (外键字段) references
主表名(主表字段名) on update 行为 on delete 行为;
行为 说明
no action 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新
restrict 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新
cascade 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则也删除/更新外键在字表中的记录
set null 当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置该字表外键值为null(前提该外键允许取null值)
set default 父表有变更时,字表将外键列设置成一个默认的值

多表查询

指从多张表中查询数据,需要注意的是要消除无效的笛卡尔积(简单理解就是消除多余重复的数据)

多表关系
多边关系 查询思路
一对多 在多的一方建立外键,指向一的一方
多对多 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
一对一 多用于单表拆分,一张表拆成两份,在任意一方加入外键关联另一方主键,并且设置外键为唯一的

多表查询的种类:内连接查询,外连接查询(左外连接查询,右外连接查询),自连接查询,子查询

-----内连接查询

-----隐式内连接查询
select 字段列表 from 表1,表2 where 条件;

-----显式内连接查询
select 字段列表 from 表1 [inner] join 表2 on 条件;



-----外连接查询

-----左外连接查询
select 字段列表 from 表1 left [outer] join 表2 on 条件;

-----右外连接查询
select 字段列表 from 表1 right [outer] join 表2 on 条件;



-----自连接查询
select 字段列表 from 表A 别名A join 表A 别名B on 条件;
----自连接可以是内连接也可以是外连接

联合查询--union,union all(俩关键词区别在于前者会把重复数据消除再拼接,而后者只是简单的拼接)

对于union查询就是把多次查询的结果合并起来,形成一个新的查询结果集

select 字段列表 from 表a....
union [all]
select 字段列表 from 表b....;
------值得注意的是,a,b的列数需一样,针对的字段列表也得一样

子查询

SQL语句中嵌套select语句,称为嵌套查询,又称子查询

select * from t1 where column1 = (select column1 from t2);

----select可换成insert/update/delete,该语句可出现在where,from,select后
子查询种类
种类 用到的关键词或符号
标量子查询 比较符号
列子查询 in, not in, any ,some,all
行子查询 =, <> ,in ,not in
表子查询 in

因为外键约束和多表查询语法这一块比较抽象,有一些概念笔者可能单独的解释不好,所以就没敢解释,等着下一期笔记结合着案例题目来理解.

本文含有隐藏内容,请 开通VIP 后查看