主要具体记录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 后查看