mysql的基本概念及使用


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










 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章