DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;操作数据库
DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);表的增删改
DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;用户的操作创建修改权限
DQL(Data Query Language):数据查询语言,用来查询记录(数据);表的查询
一、数据库的增、删、改、查
create database myschool default character set utf8;
drop database myschool
alter database myschool default character set gbk;
show databases/show create database MySchool --查看数据库的默认字符集;
二、表的增、删、改、查(DDL)
create table [if not exists] student(id int(3),name varchar(20) commit '姓名');
drop table student;
show tables/desc student;
show create table student \G; --格式化输出表结构
show engines \G; --查看mysql存储引擎
create table 新表名 like 旧表名; --复制表结构。
*******修改表**********
添加字段
alter table student add [column] From varchar(20);
删除字段
alter table student drop [column] From;
修改字段类型
alter table student modify [column] StudentNo varchar(11);
alter table student modify StudentNo int primary key;
alter table student modify StudentNo int auto_increment; -- 自动增长必须为主键
alter table student charset=utf8; --修改表的编码
修改字段名称
alter table student change [column] StudentNo SNo varchar(11);
修改表结构
alter table student rename to student;
修改表的默认存储引擎为MyISAM
alter table student engine=MyISAM;
三、表数据的增、删、改、查(DML)
**********增删改数据**********
增加数据
insert into student values(1,'男',20);
insert into student(id,age) values(2,23),(3,24);
修改数据
update student set gender='女';
update student set gender='男' where id=1;
update student set gender='男',age=24 where id=2;
删除数据
delete from student where id=2;
delete from student/truncate table student
-- delete from: 可以全表删除 1)可以带条件删除 2)只能删除表的数据,不能删除表的约束 3)使用delete from删除的数据可以回滚(事务)
-- truncate table: 可以全表删除 1)不能带条件删除 2)即可以删除表的数据,也可以删除表的约束 3)使用truncate table删除的数据不能回滚
*********查询********
基本查询
select * from student;
select id,concat(name,'00') from student; --concat()是mysql系统函数,‘连接’字符串,还有now()当前时间
select id,name AS '名字' from student;
select id,(math+english) AS '总成绩' from student;
select distinct(gender) from student;
条件查询
1> 逻辑条件 and,or,not
select * from student where id=2 and name='Yann'; -- 交集and --并集or
select * from student where not(sex='女');
2> 比较条件 > < >= <= <> in not in between and
select * from student where score between 60 and 100; --[60,100]
select * from student where gradeid in (2,3,4);
如果为in可查出多条数据,in经常被使用到在表查询的时候
如果为=则只能查出一条数据
3> 判空条件 *判断null:is null / is not null
*判断空字符串:='' / <>''
4> 模糊条件 like
% :表示任意个字符
_ :表示一个字符
select * from student where name like '李%';
select * from student where name like '李_'; --名字只有两个字
select * from student where gradeid in (2,3,4);
in 子查询
all子查询
select * from tab2 where id > all (select id from tab1);
any子查询
select * from product where price < any(select price from produce);
some子查询,同any
exists子查询
union子查询 union distinct 默认消除重复行
union all 不消除重复行
聚合查询
sum() avg() max() min() count(),
分页查询
limit -- select * from student limit 0,2;
排序查询
order by 字段 asc/desc
分组查询
group by -- select gender,group_concat(studentname),count(*) from student group by gender with rollup;
分组查询后筛选
having -- select gender,count(*) from student where group by gender having count(*)>2;
***************数据约束******************
1.默认值 create table student(id int,name varchar(20),address varchar(20) default '广州天河' );
2.非空 not null
3.唯一 unique
4.主键 primary key
5.自增长 auto_increment
6.外键 constraint 外键名称 foreign key(外键) references 参考表(参考字段)
************关联查询**************
1.交叉查询
select empname,deptname from employee,dept;
2.内连接查询:只有满足结果才会显示出来,否则为空
select empname,deptname from employee inner join dept on employee.deptid=dept.id;
select empname,deptname from employee,dept where employee.deptid=dept.id;
3.左(外)连接:不管有没有查询结果,左表的数据一定会完成显示
select d.deptname,e.empname from dept d left outer join employee e on d.id=e.deptid;
4.右(外)连接:不管有没有查询结果,右表的数据一定会完成显示
select d.deptname,e.empname from employee e right outer join dept d on d.id=e.depid;
5.自连接:用表的别名实现自身的连接
select * from score A,score B where A.id=B.id and B.sco>80;
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序
select * from student where id=1
union
select * from student where id=2;
Union All:对两个结果集进行并集操作,包括重复行,不进行排序
*********************事务*************************
事务:Transaction
原子性(A):执行事务,要不都成功,要么都不成功
一致性(C):执行后,保持数据的一致
隔离性(I):事务之间相互独立,互不影响
持久性(D):数据永久存储在数据库中
事务隔离级别:
读取未提交(read-uncommitted)
事务间可以查看未提交(commit)的数据
读取提交(read-committed)
事务间只能查看已提交(commit)的数据
重复读取(repeatable-read)
串行化(serializable)-->加锁 竞争锁
脏读:当一个事务在执行操作时未提交,
另一个事务查看数据时将刚才未提交的数据查询到
幻读:
读取到数据,因某一个事务的原因,导致刚才数据消失
查看默认事务隔离级别
mysql> select @@tx_isolation;
mysql> select @@global.tx_isolation;
mysql> select @@session.tx_isolation;
修改当前会话默认事务隔离级别:
mysql> set tx_isolation='read-uncommitted';
修改全局事务隔壁级别
mysql> set @@global.tx_isolation='read-uncommitted';
查看默认事务提交方式
mysql> select @@autocommit;
关闭自动提交事务:
mysql> set autocommit = 0;
开启自动提交事务
mysql> set autocommit = 1;
过程:
## 开始事务
mysql> start transaction; --也可写成begin
## 执行一系列SQL
mysql> update tbl_name set name=12 where name=999;
## 假设出异常事务回滚
mysql> rollback;
## 假设一切正常
mysql> commit;
*************索引***************
MySQL中的索引的存储类型有两种:BTREE、HASH
show index from table;
单列索引:
普通索引:没什么限制,允许在定义索引的列中插入重复值和空值
唯一索引:索引列中的值必须是唯一的,但是允许为空值
主键索引:是一种特殊的唯一索引,不允许有空值
组合索引:多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用
全文索引:只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引,就是在一堆文字中,通过其中的某个关键字等
1.普通索引
–直接创建索引
create index index_name on student(name)
–修改表结构的方式添加索引
alter table student add index index_name on (name)
–创建表的时候同时创建索引
create table student(
id int(4) primary key,
name varchar(32) not null,
grade varchar(3) not null,
index index_name(name)
);
–删除索引
drop index index_name on student;
alter table student drop index index_name;
2.唯一索引
–直接创建索引
create unique index index_name on student(name)
–修改表结构的方式添加索引
alter table student add unique index_name on (name)
–创建表的时候同时创建索引
create table student(
id int(4) primary key,
name varchar(32) not null,
grade varchar(3) not null,
unique index_name(name)
);
3.全文索引
–直接创建索引
create fulltext index index_name on student(name)
–修改表结构的方式添加索引
alter table student add fulltext index_name on (name)
–创建表的时候同时创建索引
create table student(
id int(4) primary key,
name varchar(32) not null,
grade varchar(3) not null,
fulltext(name)
);
4.外键索引
foreign key (字段名) references 其他表(对应其他表中的字段名);
#创建多列索引
create index index_zone student(name,age)
#查看表中索引
show index from student
*************MYSQL的备份与还原********************
备份
①命令
C:\Users\Adminstrator>mysqldump -u root -p myschool grade > d:\grade.sql
C:\Users\Adminstrator>mysqldump --no-defaults -u root -p myschool grade > d:\grade.sql
②mysql语句
select * into outfile 'D:\\customer.sql' from customer;
还原
①source
mysql> source D:\\myschool.txt
在执行以上命令时,一定要指定数据库即(use dbname)
若想还原到新的数据库中,则可以create database dbname
②mysql
C:\Users\Adminstrator>mysql -u root -p myschool < D:\\student.sql
*******************触发器*********************
## 当操作了某张表时,希望同时触发一些动作/行为,可以使用触发器完成
eg.当向员工表插入一条记录时,希望mysql自动同时往日志表插入数据
创建触发器(添加数据时)
create trigger tri_empadd after insert on employee for each row
insert into test_log(content) values('员工表插入了一条记录');
插入数据
insert into employee(id,empname,deptid) values(2,'Yann',1);
相应的日志test_log写入了一条信息
创建触发器(修改数据时)
create trigger tri_empadd after update on employee for each row
insert into test_log(content) values('员工表更新了一条记录');
修改数据
update employee set empname='yuanhua' where id=2;
创建触发器(删除数据时)
create trigger tri_empadd after delete on employee for each row
insert into test_log(content) values('员工表删除了一条记录');
删除数据
delete from employee where id=2;
*************MYSQL存储引擎*************
MyISAM:不支持事务,不支持外键,但访问速度快
InnDB:支持事务,支持外键(mysql5.5以后默认的存储引擎)
种类:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE
两种存储引擎的大致区别表现在:
1)InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。
2)MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用
3)InnoDB支持外键,MyISAM不支持
4)从MySQL5.5.5以后,InnoDB是默认引擎
5)InnoDB不支持FULLTEXT类型的索引
6)InnoDB中不保存表的行数,如select count(*) from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含where条件时MyISAM也需要扫描整个表
7)对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引
8)清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表
9)InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like '%lee%'
*********视图**********
视图:通过一个条件,把一部分数据从一张表里面提取出来,形成一张中间表,这张表就是视图
注意:视图随着主表的改变而改变
1、创建视图
create view view_name as select *from table_naem where id > 4 and id <= 10;
2、查看创建了哪些视图
showtables; --视图就是一个中间表
3、查看视图中数据
select* from view_name; --与查看表数据相同
4、删除视图
drop view view_name;
******mysql内置函数******
1、字符串函数
1)lcase(“string”)/ucase(“string”) --转换成小写/大写,与lower(str)/upper(str)作用相同
2)length(“string”) --返回字符串的长度
3)repeat(“string”,n) --将字符从重复n次
4)space(n) --生成n个空格
2、数学函数
1)bin(decimal_number) --十进制转二进制
2)ceiling(n) --作用与ceil相同,向下取整
3)sqrt(n) --开平方
4)max(col)/min(col) --取最大/最小值,聚合时使用
5)rand() --生成随机数
select * from table_name order by rand(); #使用rand函数作为排序基准
3、日期函数
1)datediff(expr1,expr2) --返回expr1和expr2相差的天数,如果expr1> expr2,则返回正值
*********mysql语句执行顺序及执行效率********
执行顺序:
from > on > join > where > group by > having > select > distinct > union > order by > limit
where 执行顺序是从左往右执行的
## hive、sparksql
1.列转行 lateral view explode(split(column, ',')) num
2.行转列 concat_ws(',',collect_set(column))
说明:collect_list 不去重,collect_set 去重。 column 的数据类型要求是 string
-- 窗口函数:rank() dense_rank() row_number()
rank() OVER(PARTITION BY advus_usid ORDER BY advrr_rechargetime DESC) as rk
dense_rank() OVER(PARTITION BY advus_usid ORDER BY advrr_rechargetime DESC) as drk
row_number() over (distribute by advus_usid sort BY advrr_rechargetime desc) as rn
三者区别如下表,按相同name的num排序
name num rank dense_rank row_number
yann 6 1 1 1
yann 2 2 2 2
yann 2 2 2 3
yann 1 4 3 4