数据库
mysql基础
1、sql分类
DQL 数据查询语言
select
dml 数据操作语言
insert
delete
updata
ddl 数据定义语言
ddl主要操作的是表的结构 不是表的数据
create 创建表
drop 删除表
alter 修改表
tcl 事务控制语言
包括:事务提交和事务回滚 commit rollback
dcl 数据控制语言
授权grant 撤销权限revoke
2、常用命令: 注意:不见分号不执行
show database; 显示数据库
show table; 显示表
select database; 显示当前数据库
\c用来终止一条命令的执行
exit 退出mysql
3、数据库查询
1、select 字段名 from 表名 查询表
2、desc 表名 查询表结构
3、varchar就是java中的string
4、注意:所有的sql语句是通用的,以分号结尾
sql语句不区分大小写
5、查询两个字段:
使用分号隔开即可
6、给查询的列起别名:
1、as关键字
2、select xuehao,name as xuehaoname from student;
3、注意:这是给显示的显示结果进行的起别名!
表本身不会改变,只是自己看到了变化了
记住:select永远不会修改了表的数据 只用于查询
4、as关键字可以省略;
假设别名里面有空格?
不做处理的时候 编译报错
解决办法 单引号或者双引号括起来;单引号更加通用,奥瑞克就用不了双引号
注意 :sql语句的标准语句是单引号
7、可以在结果上进行乘法
select name sal*12 from stu; 可以进行年薪的计算
select name sal*12 as yearsal from stu; 起别名
别名是中文的需要用单引号括起来
select name sal*12 as '年薪' from stu;
8、条件查询
select
...字段,字段,字段
from
...表名
where
...条件
1、条件详细
1、注意不等号:<>或者!=
select name sal from stu where sal < 2000;
2、多条件: 用and连接
在什么和什么之间:between and
注意:在使用between and的时候 注意必须是左小右大
并且是闭区间
3、判空
is null 不能使用= 必须是is或者is not
4、 or 并集 只满足一个
and 交集 两个都满足
同时出现时,and 的优先级比or高
先执行and 再执行or
所以应加括号
5、in 他不是一个区间 他是一个具体的值
select name sal from stu where sal in (800,5000);
他只会输出800和5000的值
select name sal from stu where sal in (800,5000,11111);
他只会输出800和5000和11111的值
区间的语句是between and
6、not in 就是不是这几个值的
7、模糊查询
% _ 都是特殊字符
%任意多个字符
_任意一个字符
例如: 以g开头的 ‘g%’
以n结尾的 ‘%n’
第二字母是a的 ‘_a%’
注意:名字中有_的怎么办?
加\ ‘%\_%’
但是别写成‘%_%’
9、排序
1、select
...字段,字段,字段
from
...表名
order by
sal
默认是升序
2、指定降序:
select
...字段,字段,字段
from
...表名
order by
sal desc
3、指定升序
select
...字段,字段,字段
from
...表名
order by
sal esc
4、多字段排序
select
...字段,字段,字段
from
...表名
order by
sal esc,name esc;
先按照薪资进行排序 再按照名字进行拍寻
只有薪资相等的时候 才启动后续排序
5、按照字段位置排序:
select
...字段,字段,字段
from
...表名
order by
2;
不建议这样写 不健壮
因为列的顺序很容易发生变化
6、关键字顺序:
select
...字段,字段,字段
from
...表名
where
...条件
order by
sal esc,name esc;
注意先进行查询 再进行排序
(排序总是在最后执行)
4、数据处理函数
1、数据处理函数又被称为单行处理函数
特点:一个输入对应一个输出
相对的就是多行处理函数:多个输入对应1个输出
2、单行处理函数有哪些呢
lower lower(name) 转成小写
upper 转成大写
substr 取字符串的一部分
substr(被截取的字符串,起始下标,截取的长度)
注意:起始下标从1开始
select
...字段,字段,字段
from
...表名
where
substr(name,1,1)='A';
第一个字母大写的
length 取长度
trim 去除前后空白的
select rand() from 表名 生成随机数
5、多行处理函数
5个:
count 计数
max 最大
min 最小
sum 求和
avg 平均值
select max(sal) from 表名
1、注意: 1、分组函数自动忽略null 例如count在计数的时候就不会计算在内 不需要对null进行处理
记住null他不是一个值 他代表什么也没有
2、分组函数不能使用在where子语句当中
2、分组查询可以一起用
3、分组查询(非常重要):
select
...字段,字段,字段
from
...表名
where
条件
group by
...
order by
...
注意顺序不能颠倒
执行顺序: 1、from 最终要展现的字段
2、where 条件
3、group by 根据条件进行分组 参数为执行对象
3.1having 对where无法进行过滤的进行进一步过滤 尤其是有分组函数的操作
4、select 等前面分好组之后再查询
5、order by 排序肯定是最后的
分组函数再使用的时候必须再分组之后才能使用
所以where后面不能出现分组函数
重要结论!:
当sql语句当中有group by 语句的时候 ,
select的后面 只能跟 参加分组的字段和分组函数!
其他的一律不能跟 但是可能一些软件不会报错 而且也没有意义
eg:select
job,max(sal)
from
stu
group by
job;
而不能
select
job,name,max(sal)
from
stu
group by
job;
技巧:
两个字段连成一个字段看
联合起来分组不就成两个组了吗
select
job,name,max(sal)
from
stu
group by
job,xuehao;
4、having可以对分组进行进不去过滤
但是having不能单独使用
必须和group by一起使用
不能代替where
2、但是优先选择where 实在解决不了的再用having
例如:
select
xuehao,avg(sal)
from
stu
group by
xuehao
having
avg(sal)>2500;
此时就不能使用where了
因为where后面无法使用分组函数
6、 把查询结果去除重复记录
distinct 所有字段联合起来去除重复记录
注意:只能出现在字段的最前方
7、连接查询:
跨表查询 多表联合查询
1、分类:
年代分类 sql92
sql99
表连接的方式分类
内连接
等值连接
非等值连接
自连接
外连接
左外连接(左连接)
右外连接(右连接)
全连接
2、两张表连接 没有任何的条件限制
怎么避免笛卡尔积的现象?
select
stu.ename,stu2.dname
from
stu,stu2
where
stu.xuehao =stu2.xuehao
可以起别名
select
e.ename,d.dname
from
e stu,d stu2
where
e.xuehao =d.xuehao
3、内连接之等值连接
select
e.ename,d.dname
from
stu e join stu2 d
on
e.xuehao =d.xuehao
1、带着inner可读性更好
2、为什么是等值连接呢
条件是一个等量关系
4、内连接之非等值连接
select
e.ename,d.dname,e.sal
from
e stu
join
d stu2
in
e.xuehao betweend e.sal and d.sal;
5、内连接之自连接
a领导的员工编号等于b员工的领导编号
一张表看成两张表
6、外连接
内连接的特点:完全能匹配到条件的查询出来
外连接 没匹配上的也显示出来
select
e.ename,d.dname
from
stu e right join stu2 d
on
e.xuehao =d.xuehao
(右连接)right代表 这个表是主表
他会把主表的剩余内容捎带显示出来
把左表捎带显示出来了
他给a,b两张表出来了一个主次关系
select
e.ename,d.dname
from
stu e left join stu2 d
on
e.xuehao =d.xuehao
主表就是jion的左右
可以通过right和left来区分外连接和内连接
全连接就是ab两个都是主表
很少用
7、三张表连接
select
。。。
from
a
join
b
on
a和b的连接条件
join
c
on
a和c的连接条件
join
d
on
a和d的连接条件
一个sql语句当中可以内连接和外连接混合 都可以出现
8、子查询
被嵌套的select语句被称为子查询
1、可以出现在哪里呢
select
...(select)
from
...(select)
where
...(select)
9、union
要求 前后返回的两个表的列数相同
也就是字段数相同
数据类型相同
10、limit
1、将查询结果集的一部分取出来
通常使用在分页当中
2、分页的作用是什么?
提高用户体验
3、select
...(select)
from
...(select)
where
...(select)
limit 5;
取前5
参数 startindex length
一个参数:取前几
注意:limit必须写在order by之后
11、select
...(select)
from
...(select)
where
...(select)
limit 4,5;
第[5,9]的员工
12、分页
第1页 limit 0,3 [0,1,2]
第2页 limit 3,3 [3,4,5]
第3页 limit 6,3 [6,7,8]
第4页 limit 9,3 [9,10,11]
第n条
limit (n-1)*3,3
13、表
1、表的创建
属于ddl
creat table 表名(
字段名1,数据类型,
字段名2,数据类型,
字段名3,数据类型,
字段名4,数据类型,
)
表名:建议以t_开头 或者以tbl_开头
字段名:见名知意
2、数据类型、
varchar:255
可变的长度
都按实际的长度分配
但是节省空间速度慢
char:255
不可变的长度
都按分配的长度分配 不管实际长度
但是浪费资源速度快
int11
bigint
float
double
date 短日期
datetime 长日期
clob 字符大对象(4G 比如大文章)
blob 二进制大对象(图片 声音 视频)
需要用流的方式进行
3、
删除表
drop 表名;
drop 表名 if exists;
插入数据
insert into 表名(字段1,字段2,字段3) value(值1,值2,值3);
字段和值要一一对应
4、数据库的命名规范
所有的标识符全部小写
单词和单词之间用下划线连接
5、date
str_to_date函数可以把字符串varchar转换成date数据类型
通常用在insert 因为此时要假如数据类型
但是假如写的是年月日的格式 mysql会自动进行类型转换
6、date_format
将日期类型进行特定的格式
select id,name,date_format(birth,'%m/%d') as birth from 表名
通常使用在查询方面 设置展示的日期格式
但是直接查询时 他会显示标准的格式类型
7、长日期类型
加上时分秒
14、update
改
属于dml
update 表名 set 字段名=值 where 条件;
注意数据类型对应
15、删除 delete
属于dml
delet 表名 where 条件;
注意加条件 不然全部删除了
16、插入多条记录
insert into 表名(字段1,字段2,字段3)values
(值1,值2,值3),
(值1,值2,值3),
(值1,值2,值3);
17、快速复制表
creat table stu2 as select * from stu1;
原理就相当于重新创建了一个新的表
18、查询一部分呢进行复制
creat table stu2 as select id name from stu1 where id=1;
19、
快速删除表中数据
delete from stu; 删除方式比较慢 但是还可以回滚 属于dml
truncat table stu ; 删除方式快 但是不支持回滚 属于ddl
注意上面时删除表数据,但是表还在
删除表是drop table 表名;