數據庫服務器:運行數據管理軟件的計算機mysql
數據庫:顧名思義數據倉庫,是一個文件夾、存儲多個文件(數據表)linux
數據表:對應一個文件,存儲在數據庫下程序員
數據:對應文件中的每一行,描述事物特徵的符號redis
關係型:須要有表結構(mysql,sqlserver,db2,oracle)sql
非關係型:key-value結構(redis,mongodb)mongodb
安裝爲系統服務:mysqld --install
數據庫
mysqladmin -uroot -proot password "root"
mysql -uroot -proot
net start mysql56
中止:net stop mysql56
安全
mysqld --skip-grant-tables
update mysql.user set password=password("密碼") where user="root" and host="localhost";
flush privileges;
殺:taskkill /F /PID ....
服務器
查看登錄用戶:select user();
網絡
mysql_safe --skip-grant-tables
# 修改配置文件 [mysqld] default-character-set=utf8 [client] default-character-set=utf8 [mysql] default-character-set=utf8 #mysql5.5以上:修改方式有所改動 [mysqld] character-set-server=utf8 collation-server=utf8_general_ci [client] default-character-set=utf8 [mysql] default-character-set=utf8 # 這樣在控制檯輸入mysql能夠直接登陸 user='root' password='root'
切換文件夾:use db1;
create database db1 charset utf8;
建庫語句:show create database db1;
全部數據庫:show databases;
查看當前所在數據庫:select database();
alter database db1 charset gbk;
刪除:drop database db1;
增:create table t1(id int,name char) engine=innodb;
刪除:drop table t1;
清空表結構:truncate table t1;
修改表字段類型:alter table t1 modify name char(6);
修改表字段名稱:alter table t1 change name Name varchar(8);
查看建表語句:show create table t1;
show tables;
查看錶結構:desc t1;
增:insert into t1(id,name) values(1,'egon'),(2,'egon'),(3,'alex');
delete from t1
; 自增加並無改變,不是1,因此儘可能與where搭配。
delete from t1 where id=1;
update t1 set name='sb';
update t1 set name='alex' where id=2;
select * from t1;
select id,name from t1;
DDL語句:數據庫定義語言,create drop alter
DML語句:數據庫操做語言,insert update delete select
DCL語句:數據庫控制語言,grant revoke
現實生活中咱們用來存儲數據的文件有不一樣的類型,每種文件類型對應各自不一樣的處理機制:好比處理文本用txt類型,處理表格用excel,處理圖片用png等
數據庫中的表也應該有不一樣的類型,表的類型不一樣,會對應mysql不一樣的存取機制,表類型又稱爲存儲引擎
。
存儲引擎說白了就是如何存儲數據、如何爲存儲的數據創建索引和如何更新、查詢數據等技術的實現方法。由於在關係數據庫中數據的存儲是以表的形式存儲的,因此存儲引擎也能夠稱爲表類型(即存儲和操做此表的類型)
show engines;
create table 表名( 字段名1 類型[(寬度) 約束條件], 字段名2 類型[(寬度) 約束條件], 字段名3 類型[(寬度) 約束條件] );
注意:
desc table1
show create table table1
修改表名: ALTER TABLE 表名 RENAME 新表名;
ALTER TABLE 表名 ADD 字段名 數據類型 [完整性約束條件…], ADD 字段名 數據類型 [完整性約束條件…];
ALTER TABLE 表名 ADD 字段名 數據類型 [完整性約束條件…] FIRST;
ALTER TABLE 表名 ADD 字段名 數據類型 [完整性約束條件…] AFTER 字段名;
刪除字段:ALTER TABLE 表名 DROP 字段名;
修改字段
sql ALTER TABLE 表名 MODIFY 字段名 數據類型 [完整性約束條件…]; ALTER TABLE 表名 CHANGE 舊字段名 新字段名 舊數據類型 [完整性約束條件…]; ALTER TABLE 表名 CHANGE 舊字段名 新字段名 新數據類型 [完整性約束條件…];
create tale t1 select host,user from mysql.user;
複製表結構:
-- 條件不成立,空記錄 create table t2 select host,user from mysql.user where 1>5; create table t3 like mysql.user;
drop table t3;
create table student( id int, name char(6), born_year year, birth_date date, class_time time, reg_time datetime ); insert into student values(1,'egon',now(),now(),now(),now()); insert into student values(2,'alex','1997','1996-10-19','12:12:12','2018-09-13 12:12:12');
datetime與timestamp的區別
'''
'''
char定長(0-255):簡單粗暴,浪費空間(以空格來填充),存取速度快
varchar變長(0-65535):省內存,可是查詢速度慢
'''
create table consumer( id int, name char(4), sex enum('male','female','other'), level enum('vip1','vip2','svip'), hobbies set('game','music','run') ); insert into consumer values(1,'egon','male','svip','music,game'); -- 不在範圍內就爲空 insert into consumer values(1,'egon','xx','svip','music,game');
create table t1( id int not null , name char(4), sex enum('male','female') not null default 'male' ); insert into t1(id,name) values('1','alex');
不爲空和默認值
惟一約束
單列惟一
create table dpt( id int, name char(10) unique ); insert into dpt values(1,"IT"); insert into dpt values(2,"IT"); -- 方式一 create table dpt( id int unique, name char(10) unique ); -- 方式二 create table dpt( id int, name char(10), unique(id), unique(name) );
聯合惟一
--ip和端口聯合惟一 create table services( id int , ip char(15), port int, unique(ip,port), unique(id) ); insert into services values (1,'127.0.0.1',80), (2,'127.0.0.1',81), (3,'118.25.126.94',80);
主鍵
單列主鍵
create table t1( id int primary key, name char(16), );
複合主鍵
create table services1( ip char(15), port int, primary key(ip,port) );
自增
create table t3( id int primary key auto_increment, name char(4) ); insert into t3(name) values ('egon'), ('alex'), ('wpq'); insert into t3(id,name) values('5','jw')
查看:show variables like 'auto_inc%';
步長:auto_increment_increment
起始偏移量:auto_increment_offset
設置步長:
set session auto_increment_increment=3;
set gloable auto_increment_increment=3;
設置偏移量:
set gloable auto_increment_offset=3;
注意
delete from student;
:清空表,可是自增按照刪除前的位置繼續自增truncate table t1;
:清空表,且自增也初始化。用來創建表與表之間的關係
-- 先建立dep表 create table dep( id int primary key auto_increment, name char(16), comment char(50) ); -- 插入數據 insert into dep(name,comment) values('CEO','一羣吹牛的部門'), ('IT','技術通常的部門'), ('財務','花錢特別多的部門'), ('銷售','不會賣東西的部門'); -- 再建立關聯的emp表 create table emp( id int primary key, name char(10), sex enum('male','female'), dep_id int, constraint fk_dep foreign key(dep_id) references dep(id) on delete cascade on update cascade ) -- 插入數據 insert into emp(name,sex,dep_id) values ('alex','male',1), ('egon','male',2), ('yuanhao','female',3), ('wupeiqi','male',4);
1. 插入完整數據(順序插入) 語法一: INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n); 語法二: INSERT INTO 表名 VALUES (值1,值2,值3…值n); 2. 指定字段插入數據 語法: INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…); 3. 插入多條記錄 語法: INSERT INTO 表名 VALUES (值1,值2,值3…值n), (值1,值2,值3…值n), (值1,值2,值3…值n); 4. 插入查詢結果 語法: INSERT INTO 表名(字段1,字段2,字段3…字段n) SELECT (字段1,字段2,字段3…字段n) FROM 表2 WHERE …;
語法: UPDATE 表名 SET 字段1=值1, 字段2=值2, WHERE CONDITION; 示例: UPDATE mysql.user SET password=password(‘123’) where user=’root’ and host=’localhost’;
語法: DELETE FROM 表名 WHERE CONITION; 示例: DELETE FROM mysql.user WHERE password=’’;
--單表查詢 -- select distanct 字段1,字段2,字段3 from 庫.表 where 條件 group by 分組條件 having 過濾 order by 排序字段 limit n; -- 優先級 where group distinct order by -- 建立表 create table emp( id int primary key auto_increment, name varchar(20) not null, sex enum('male','female') not null default 'male', age int not null default 21, hire_date date not null, post varchar(50), post_comment varchar(100), salary double(15,2), office int, depart_id int ); -- 插入記錄 -- 三個部門:教學,銷售,運營 insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values -- 如下是教學部 ('egon','male',18,'20170301','老男孩駐沙河辦事處外交大使',7300.33,401,1), ('alex','male',78,'20150302','teacher',1000000.31,401,1), ('wupeiqi','male',81,'20130305','teacher',8300,401,1), ('yuanhao','male',73,'20140701','teacher',3500,401,1), ('liwenzhou','male',28,'20121101','teacher',2100,401,1), ('jingliyang','female',18,'20110211','teacher',9000,401,1), ('jinxin','male',18,'19000301','teacher',30000,401,1), ('成龍','male',48,'20101111','teacher',10000,401,1), -- 如下是銷售部門 ('歪歪','female',48,'20150311','sale',3000.13,402,2), ('丫丫','female',38,'20101101','sale',2000.35,402,2), ('丁丁','female',18,'20110312','sale',1000.37,402,2), ('星星','female',18,'20160513','sale',3000.29,402,2), ('格格','female',28,'20170127','sale',4000.33,402,2), -- 如下是運營部門 ('張野','male',28,'20160311','operation',10000.13,403,3), ('程咬金','male',18,'19970312','operation',20000,403,3), ('程咬銀','female',18,'20130311','operation',19000,403,3), ('程咬銅','male',18,'20150411','operation',18000,403,3), ('程咬鐵','female',18,'20140512','operation',17000,403,3); -- 查詢 -- 字段查詢 select id,name from emp; -- 去重 select distinct post from emp; -- 別名 select name,salary*12 as 年薪 from emp; -- 字符串拼接 select concat('<姓名:',name ,'>',' <性別:',sex,'>') as info from emp; -- where條件查詢 select id,name,age from emp where id>7; select name from emp where post='teacher' and salary > 8000; select name,salary from emp where salary between 20000 and 30000; select name,salary from emp where salary in (20000,30000); select name,salary from emp where salary not in (20000,30000); -- 不能用等於 select name from emp where post_comment is NULL ; -- 模糊匹配 -- 任意字符 select name from emp where name like "jin%"; -- 一個字符 select name from emp where name like "jin___"; --group by 分組查詢 select sex from emp group by sex; -- 只能查分組的字段,以及聚合 select sex,count(sex) from emp group by sex; -- 統計男女性別數目 select post,count(post) from emp group by post;-- 每一個職位有多少員工 select post,avg(salary) from emp group by post; select post,group_concat(name) from emp group by post;-- 每一個職位下全部員工的姓名 --having 分組後過濾 可使用聚合函數過濾 --查詢各崗位包含的員工個數小於2的崗位名,崗位內包含的員工名字、個數 select post,group_concat(name),count(post) from emp group by post having count(id)<2; --查詢各崗位平均薪資大於1萬的崗位名、平均工資 select post,avg(salary) from emp group by post having avg(salary)>10000; --查詢各崗位平均薪資大於1萬且小於2萬的崗位名、平均工資 select post,avg(salary) from emp group by post having avg(salary) between 10000 and 20000; --order by排序 select id,age from emp order by age asc; --年齡從小到大升序 select id,age from emp order by age desc; --年齡從小到大降序 select id,age from emp order by age desc ,id asc; --年齡從小到大降序,id升序 -- limit n分頁 select * from emp limit 3; -- 查詢工資最高的那我的的信息 select * from emp order by salary desc limit 1;--第一條 select * from emp limit 0,5; --取五條數據 ,從1開始 -- 注意:並非那麼簡單,性能問題 --總結: -- 語法順序: -- 執行上順序: --from 表--where條件--group分組--hanving過濾--distinct--order by排序--limit 分頁-- -- 正則 select * from emp where name regexp '^jin.*g$'; select * from emp where name regexp '^jin.*(g|n)$';
-- 建表 create table dep( id int, name varchar(20) ); create table emp( id int primary key auto_increment, name varchar(20), sex enum('male','female') not null default 'male', age int, dep_id int ); -- 插入數據 insert into dep values (200,'技術'), (201,'人力資源'), (202,'銷售'), (203,'運營'); insert into emp(name,sex,age,dep_id) values ('egon','male',18,200), ('alex','female',48,201), ('wupeiqi','male',38,201), ('yuanhao','female',28,202), ('liwenzhou','male',18,200), ('jingliyang','female',18,204) ; --內鏈接:兩個表的共同部分 select * from dep d inner join emp e on e.dep_id=d.id; --左鏈接:保留左表,右表沒有的以null填充 select * from dep d left join emp e on e.dep_id=d.id; --右鏈接:保留右表,左表沒有的以null填充 select * from dep d right join emp e on e.dep_id=d.id; --全鏈接 select * from dep d left join emp e on e.dep_id=d.id union select * from dep d right join emp e on e.dep_id=d.id; --查詢平均年齡大於30歲的員工的部門名 select d.name,avg(age) from emp e inner join dep d on d.id=e.dep_id group by d.name having avg(age)>30; -- { -- "server":"0.0.0.0", -- "port_password":{ -- "8383":"wgx123456", -- "8384":"jw123456" -- }, -- "timeout":300, -- "method":"aes-256-cfb", -- "fast_open":false -- -- }
觸發器(trigger)是提供給程序員和數據分析員來保證數據完整性的一種方法,是一種特殊類型的存儲過程,它的執行不是由程序調用,也不是手工啓動,而是由事件來觸發。
事務用於將某些操做的多個SQL做爲原子性操做,一旦有某一個出現錯誤,便可回滾到原來的狀態,從而保證數據庫數據完整性。
存儲在服務器,一組tsql語句。經過調用它的名字能夠執行其內部的一堆sql
優勢
提升程序的通用性和可移植性
提升數據庫的運行速度
減輕網絡帶寬,減小網絡流量
安全性高,可設定只有某些用戶才具備對指定存儲過程的使用權
加速查詢速率
普通索引INDEX:加速查找