多表联查:
一对一,一对多,多对多时要用第三张表关联
合并结果集(联合查询)
联合查询是将多个表的查询结果,纵向拼接后展现
语法格式:
select * from 表1名 union select * from 表2名 -- =========================================== /* union 会将完全一致的数据去重 union all 会将所有数据保留 合并的两表的列数,数据类型都要一致 ps:一般用在将一个大表拆成两个表 */
连接查询:
连接查询是将多个表的查询 结果,横向拼接后展现。
连接查询又分为:内连接和外连接
内连接语法格式:
-- 标准写法 select * from 表1名 inner join 表2名 on 表1名.列 = 表2名.列; -- 简化的写法: select * from 表1名,表2名 where 表1名.列 = 表2名.列; /* on 后面跟的是关联的条件.内连接只会保留完全符合关联条件的数据 */
外连接语法格式:
又分为左外连接和右外连接。左外保留左表中不符合条件的数据,右外保留右表中不符合条件的数据
select * from 表1名 left outer join 表2名 表1名.列 = 表2名.列; select * from 表1名 right outer join 表2名 表1名.列 = 表2名.列; /* 所谓的左右就是这个语句的左右 */
子查询:(subquery)
子查询其实就是在一个表中嵌套查询,它可以嵌套在where后面当条件,也可以嵌套在from后面当表。
在where后面当条件的语法格式:
select * from 表名 where 列1名 =(select 列1名 from 表名 where 列2名 = 条件); select * from 表名 where 列1名 in (select 列1名 from 表名 where 列2名 = 条件); /* 注意:子查询当条件时,如果返回的结果是一个话,条件可以使用 = > < 等等 如果返回的结果是多个时,条件用in */
函数:
函数分为:字符串函数、数学函数、日期函数
字符串函数:
函数 | 说明 | 结果 |
---|---|---|
charset(str) | 返回指定的字符串的字符集 | 字符串的字符集 |
concat() | 将多个字符串连接乘一个字符串,连接符用 ' '包起来(分隔符不能为null) | 字符串 |
inset(sting,substring) | 返回substring在string中出现的位置,没有返回0 | 判断存不存在 |
Ucase() | 转换成大写 | |
Lcase() | 转换成小写 | |
left(string ,length) | 从string中的 左边起去length个字符 | 就是截取 |
length(string) | 字符串的长度 | int类型的数据 |
replace(str,string,string1) | 用string1替换在str中的string | 替换 |
strcmp(str1,str2) | 逐字比较两个字符串大小 | |
substring(str,position[length]) | 在str中截取从position开始,的length个字符 | 截取 |
lirim(str) rtrim(str1) trim | 去掉前端空格或后端空格 | 去空格 |
注意:where 后面不能跟聚合函数,但是能跟普通函数。
数学函数:
函数 | 说明 |
---|---|
abs() | 绝对值 |
bin(decimal_number) | 十进制转二进制 |
ceiling() | 向上取整 |
conv(num,from_base,to_base) | 进制转换 |
floor() | 向下取整 |
format(num,decimal_places) | 保留这个数小数的位数 |
hex(DecimalNumber) | 转十六进制 |
least() | 求最小值 |
mod() | 求余 |
rand(seed) | 随机数,seed是种子,可不写,如果seed赋值了就固定了随机数 |
round() | 四舍五入 |
truncate(x,d) | 将 x 数值保留d位小数(截断) |
日期函数:
函数 | 说明 |
---|---|
sysdate() | 获取当前系统时间 |
now() | 获取当前系统时间 |
addtime(date,time_interval) | 将一个时间加到date中 |
date_add(date,interval d_value d_type) | 将一个时间加到date中 |
date_sub(date,interval d_value d_type) | 将一个时间在date中减去 |
datediff(date1,date2) | 两个时间差 |
current_date() | 当前日期(年月日) |
current_time() | 当前时间(时分秒) |
current_timestamp() | 当前时间戳(年月日时分秒) |
date(datetime) | 返回达特time的日期部分 |
year | month | date() | 年 | 月 | 日 |
字符和日期的互转:
-
日期格式化字符串 date_format(date,'%Y-%m-%d')
-
字符串解析为日期 str_to_date(date,'%Y-%m-%d')
格式化符号:
%Y:代表4位的年份 %y:代表2位的年份 %m:代表月, 格式为(01……12) %c:代表月, 格式为(1……12) %d:代表月份中的天数,格式为(00……31) %e:代表月份中的天数, 格式为(0……31) %H:代表小时,格式为(00……23) %k:代表 小时,格式为(0……23) %h: 代表小时,格式为(01……12) %I: 代表小时,格式为(01……12) %l :代表小时,格式为(1……12) %i: 代表分钟, 格式为(00……59) %r:代表 时间,格式为12 小时(hh:mm:ss [AP]M) %T:代表 时间,格式为24 小时(hh:mm:ss) %S:代表 秒,格式为(00……59) %s:代表 秒,格式为(00……59)
流程控制函数:
函数 | 说明 |
---|---|
if(expr1,expr2,expr3) | 如果expr1为真,则返回expr2,否则返回expr3 |
ifnull(expr1,expr2) | 如果expr1不是null,则返回expr1,否则返回expr2.用来替换null,null不能参加运算 |
case when [expr] then[result] else[default] end | 如果expr是真,返回result,否则返回default。--------------------------expr |
case[value] when [value1] then[result] else[default] end | 如果value等于value1,返回result,否则返回default。------------------- result结果 |
数据库设计:
数据库设计流程:
1.根据应用系统的功能,分析数据实体 (实体,就是要存储的数据对象)
2.提取实体的数据项(数据项,就是实体的属性)
3.根据数据库设计三范式规范视图的数据项
4.绘制E-R图 (实体关系图,直观的展示实体与实体之间的关系)
矩形代表实体 椭圆形代表属性 菱形代表关系 实线关联
5.数据库建模
○ 三线图进行数据表设计
○ PowerDesigner
○ PDManer
6.建库建表 编写SQL指令创建数据库、数据表
添加测试数据,SQL测试
数据库设计的三范式:
第一范式:要求数据表中的字段(列)不可再分
如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
第二范式:不存在非关键字段对关键字段的部分依赖
在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
第三范式:不存在非关键字段之间的传递依赖
确保数据表中的每一列数据都和主键直接相关,而不能间接相关。