目錄python
用戶認證mysql
只是經過文件操做,改變數據是很是繁瑣的linux
解決對於多臺機器或多個進程操做同一份數據咱們須要本身解決併發和安全問題比較麻煩ios
本身處理數據備份,容錯措施正則表達式
c/s架構的操做數據文件的一個管理軟件redis
數據操做算法
專有名詞sql
常見的數據庫mongodb
關係型數據庫數據庫
非關係型數據庫(key:value結構)eg:快遞單號(redis、mongodb、memcache)
在 WEB 應用方面,MySQL是最好的 RDBMS(關係數據庫管理系統) 應用軟件。
# 客戶端 [mysql] # 設置mysql客戶端默認字符集 default-character-set=utf8 # server端 [mysqld] #設置3306端口 port = 3306 # 設置mysql的安裝目錄 basedir=C:\Program Files\mysql-5.6.39-winx64 # 設置mysql數據庫的數據的存放目錄 datadir=C:\Program Files\mysql-5.6.39-winx64\data # 容許最大鏈接數 max_connections=200 # 服務端使用的字符集默認爲8比特編碼的latin1字符集 character-set-server=utf8mb4 # 建立新表時將使用的默認存儲引擎 default-storage-engine=INNODB
# windows mysqld install net start mysql # server net stop mysql mysql -u'用戶名' -p'密碼' # 客戶端,能夠是python代碼也能夠是一個程序 # mysql.exe是一個客戶端
# mac sudo mysql.server status sudo mysql.server start/stop/restart
sql語句(structure query language)
# 查看當前用戶 select user(); # 設置密碼,password 表示密文存儲 set password for root@localhost = password('123'); # 建立用戶 create user '用戶名'@'網段.%' identified by '密碼'; # 查看用戶狀態,用戶信息都存儲在mysql中的user表中 select host,user from mysql.user; # 查看當前庫 show databases; # 建立文件夾henry create database henry; # 查看指定用戶權限 show grants for '用戶名'(@'網段.%'); # 受權 * 表示全部 grant all(select/insert) on henry.* to '用戶名'@'ip網段.%'; # 設置當即生效 flush privileges # 建立帳號並受權,必須有密碼 grant all on herny.* to 'henry'@'%' identified by '123'; #select, insert, update, delete, create, drop, index, alter, grant, references, reload, shutdown, process, file等14個權限 # 取消用戶權限 revoke all on test.* from 'henry'@'%'; # 刪除用戶 delete from mysql.user where host='192.168.12.%' and user='test'; drop user 'test'@'192.168.12 # 修改指定用戶密碼 update mysql.user set password=password('新密碼') where User='test' and Host='%';
# 建立庫 create database demo; # 查看庫 show databases; # 刪除庫,demo drop database demo # 查看當前使用的庫 select database(); # 切換庫,到demo庫下 use demo;
# 建立表,char()默認一個字符 create table student(id int, name char(10)); # 查看當前文件夾中的表 show tables; # 刪除表 drop table student; # 查看錶結構 desc student; # 刪除多個表 drop tables s2,s3,s4;
# 數據插入 insert into student values(1, 'henry'); # 數據查看 select * from student; # 修改數據,必須設置條件,肯定爲一條數據data update 表 set 字段名=值 where id=2; # 刪除數據 delete from 表 where id=1;
其餘存儲引擎
# 查看與存儲引擎相關配置 show variables like '%engine%'; show variables like "default_storage_engine"; # 查看當前數據庫支持的存儲引擎 show engines \g show engines; # 修改已經存在表的存儲引擎 alter table 表名 engine = innodb; # 查看與編碼相關的配置 show variables like '%chara%'; # 查看 show variables like '%關鍵字%';
# 建立表 create table t1(id int, name char(10)) engine=innodb; # 查看錶的結構,包括存儲引擎和編碼 \G 格式化輸出,帶 \G 不能使用分號 show create table t1 \G # 只查看錶字段基礎信息 describle t1; t1.frm frame 表結構 t1.ibd innoDB 存儲引擎
# 指定engine爲myisam create table t2(id int, name char(10)) engine=MyISAM; t2.frm 表結構 t2.MYD 數據 t2.MYI 索引
# 指定engine爲memory create table t2(id int, name char(10)) engine=memory; t2. 數據
# 語法: create table 表名( 字段名1 類型[(寬度) 約束條件], 字段名2 類型[(寬度) 約束條件], 字段名3 類型[(寬度) 約束條件]); # 注意: 1. 在同一張表中,字段名是不能相同 2. 寬度和約束條件可選 3. 字段名和類型是必須的
# 建立無符號int型表 create table t3(id1 int, id2 int unsigned);
# 一共有5位,小數2位 float(5, 2)/ double(5, 2) # 建立表 create tables t4(f1 float(5,2), double(5,2)); # 不指定長度,單精度和雙精度 create tables t4(f1 float, double); # decimal精度,默認存儲(10,0)整數 create table t5(d1 decimal, d2 decimal(25, 20)); # decimal內部存儲是按照字符串存的
# 建立表 create table t6(d1 date, y year, ts timestamp); insert into t6(now(), now(), now()); # 指定傳y,datetime默認爲更新時間 insert into t6(y) values(2019); # 指定datetime更新方式 create table t6(d1 date, y year, dt datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); # 可使用字符串,純數字 # 5.7版本,插入參數不全,會報錯,5.6版不會
create table t7(name1 char(5), name2 varchar(5)); # 分別存儲 'echo ' 和 'echo4' insert into t7 values('echo', 'echo') select concat(name1, '---') from t7; select concat(name2, '---') from t7;
create table t8(name char(12), gender ENUM('male', 'female'), hobby set('play', 'drink', 'eat'));
create table t1(id int not null, name char(12) not null, age int); insert into t1(id, name) values(1, 'henry');
create table t2(id int not null, name char(12) not null, gender enum('male', 'female') not null default 'male' ); insert into t2(id, name) values(1, 'henry');
create table t3(id int unique, username char(12) not null unique, pwd char(18) );
create table t4(id int not null unique, ip char(15), server char(10), port int, unique(ip, port)) # 聯合惟一,不能同時重複
create table t5(id int unique auto_increment, username char(10), pwd char(18)); insert into t5(username, pwd) values('henry', '123'); # 自增大小隻增不減 # 對於自增的字段,在用delete刪除後,再插入值,該字段仍按照刪除前的位置繼續增加
# 也能夠建立表時指定auto_increment的初始值,注意初始值的設置爲表選項,應該放到括號外 create table student(id int primary key auto_increment, name varchar(20), gender enum('male','female') default 'male' )auto_increment=3;
#設置步長 # sqlserver:自增步長 # 基於表級別,指定步爲2,從0開始計數 create table t1(id int unique auto_increment, age int )engine=innodb,auto_increment=2 default charset=utf8; # mysql自增的步長: show session variables like 'auto_inc%'; # 基於會話級別 set session auto_increment_increment=2;# 修改會話級別的步長 # 基於全局級別的 set global auto_increment_increment=2; # 修改全局級別的步長(全部會話都生效) # 查看設置,從新登錄5.7版本直接失效 show variables like 'auto_incre%';
create table t6(id int not null unique, name char(10) not null unique); # 第一個指定爲not null nuique 字段被定義爲主鍵
create table t7(id int primary key, name char(10) not null unique);
create table t8(id int, ip char(15), server char(10), port int, primary(ip, port)) # 聯合主鍵
create table staff(id int primary key auto_increment, age int, gender enum('male', 'female'), salary float(10,2), hire_date date, post_id int, foreign key(post_id) references dept(pid); create table dept(pid int primary key, name char(10) not null nuique);
create table staff(id int primary key auto_increment, age int, gender enum('male', 'female'), salary float(10,2), hire_date date, post_id int, foreign key(post_id) references dept(pid) on update cascade on delete set null); create table dept(pid int primary key, name char(10) not null nuique);
# 修改表名 alter table 表名 rename 新表名;
# 添加字段 alter table 表名 add 添加字段名 數據類型(寬度) 約束 # 刪除字段 alter table 表名 drop 刪除字段名;
# 修改已經存在字段的類型、寬度 約束,不能修改字段名字 alter table 表名 modify 字段名 類型() 約束 # 修改已經存在字段的類型、寬度 約束、字段名字 alter table 表名 change 字段名 新字段名 類型() 約束
# 把字段放在第一列 alter table 表名 modify age 類型+約束 first; # 把字段放在id以後 alter table 表名 modify age int not null after id; # 也能夠與 add、change 連用
#去掉null約束 alter table t modify name char(10) null; # 添加null約束 alter table t modify name char(10) not null;
# 去掉unique約束,特殊 alter table 表名 drop index 字段名; # 添加unique約束 alter table 表名 modify 字段名 int unique;
alter database 庫名 CHARACTER SET utf8;
# 先刪除主鍵,刪除一個自增主鍵會報錯 # 須要先去掉主鍵的自增約束,而後再刪除主鍵約束 alter table 表名 drop primary key; # 增長主鍵 alter table 表名 add primary key(id);
# 添加外鍵 alter table 表名 add constraint 外鍵名 foreign key(字段) references press(字段); # 刪除外鍵 alter table 表名 drop foreign key 外鍵名;
drop table 表名;
兩張表的數據關係:多對一、一對一、多對多(書、做者)
create table press(id int primary key auto_increment, name varchar(20)); create table book(id int primary key auto_increment, name varchar(20), press_id int not null, foreign key(press_id) references press(id) on delete cascade on update cascade); insert into press(name) values('henry publisher'), ('echo publisher'),('dean publisher'); insert into book(name,press_id) values('henry',1),('echo',2), ('dean',2),('brad',3),('dianel',2),('oleg',3);
# 兩張表:學生表和客戶表 create table customer(id int primary key auto_increment, name varchar(20) not null, qq varchar(10) not null, phone char(16) not null); create table student(id int primary key auto_increment, class_name varchar(20) not null, customer_id int unique, #該字段必定要是惟一的 foreign key(customer_id) references customer(id) on delete cascade on update cascade); # 增長客戶 insert into customer(name,qq,phone) values('henry', '12345', 12312312311), ('echo','123123123',12312312311),('dean', '283818181', 12312312311), ('brad','283818181',12312312311), ('oleg', '888818181', 12312312311), ('dianel','112312312',12312312311); # 增長學生 insert into student(class_name,customer_id) values('1班',3),('2班',4),('3班',5);
create table author(id int primary key auto_increment, name varchar(20)); create table book(id int primary key auto_increment, name varchar(20)); # 這張表就存放做者表與書表的關係,即查詢兩者的關係查這表就能夠了 create table author_book(id int not null unique auto_increment, author_id int not null, book_id int not null, constraint fk_author foreign key(author_id) references author(id) on delete cascade on update cascade, constraint fk_book foreign key(book_id) references book(id) on delete cascade on update cascade, primary key(author_id,book_id)); # 插入做者和書籍信息 insert into author(name) values('henry'),('echo'),('dean'),('diane'); insert into book(name) values('1'),('2'),('3'),('4'),('5'),('6') insert into author_book(author_id,book_id) values(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(2,1),(2,6),(3,4),(3,5),(3,6),(4,1);
# 在父表上update/delete記錄時,同步update/delete掉子表的匹配記錄 cascade方式 # 在父表上update/delete記錄時,將子表上匹配記錄的列設爲null要注意子表的外鍵列不能爲not null set null方式 # 若是子表中有匹配的記錄,則不容許對父表對應候選鍵進行update/delete操做 No action方式 # 同no action, 都是當即檢查外鍵約束 Restrict方式 # 父表有變動時,子表將外鍵列設置成一個默認的值 但Innodb不能識別 Set default方式
# 寫入一行數據 insert into t1 values(1, 'henry', 19); insert into t1 value(1, 'henry', 19); # 寫入多行數據 insert into t1 values(1, 'henry', 19), (2, 'echo', 18); # 指定字段寫入 insert into t1(name, age) value('henry', 19);
# 刪除條件匹配到的數據 delete form 表 where 條件;
# 修改表中數據, set 後的字段能夠爲一個或多個 update 表 set 字段=值 where 條件; # 注意null只能使用 is 匹配 where name is null;
SELECT DISTINCT 字段1,字段2... FROM 表名 WHERE 條件 GROUP BY field HAVING 篩選 ORDER BY field LIMIT 限制條數
# 查看錶中全部數據 select * from 表 # 查看指定字段 select 字段1,字段2... from 表 # 查看指定字段,自動去重 select distinct 字段1,字段2... from 表 # 數值型四則運算,併名別名顯示 select name,salary*12 (as) annual_salary form 表 # 數值型四則運算,併名別名, 拼接顯示 select concat ('姓名:',name,'薪資:',salary*12) (as) annual_salary form 表 # 使用':'進行拼接 select concat_ws (':', name,salary*12 (as) annual_salary) form 表
# 結合CASE語句: SELECT(CASE WHEN emp_name = 'henry' THEN emp_name WHEN emp_name = 'echo' THEN CONCAT(emp_name,'_prefect') ELSE concat(emp_name, '_nice') END ) as new_name FROM employee;
select * from t1 where salary>1000; # 和數值類型無關 select * from t1 where salary=20000 or slary=30000; # 邏輯運算 select * from t1 where gender='male' and age=18; # 多選一,可使用 in select 字段名,... from t1 where salary in (20000, 30000, 19000); # not in select 字段名,... from t1 where salary not in (20000, 30000, 19000); # is /is not select 字段名 from t1 where 字段 is null;
# between ... and ... select name,salary from t1 where salary between 10000 and 20000
# like , % 通配符,匹配任意長度,任意內容 select * from t1 where name like '程%'; # like , _ 通配符,匹配一個任意字符 select * from t1 where name like '程_'; # like , 以 n 結尾 select * from t1 where name like '%n';
select * from t1 where name regexp 正則表達式; SELECT * FROM employee WHERE emp_name REGEXP 'on$';
# 顯示一個組的第一個,必須有group的字段 select post from employee group by post; # distinct 基於group by完成
select count(*/ 主鍵) from employee; # 只算id不爲空的字段個數 select count(id) from employee;
select avg(salary) from employee; select sum(salary) from employee;
# 分別對各個組,統計人數 select post,count(*) from employee group by post; # 對某一組進行統計人數 select post,count(*) from employee where post='teacher'; # 各部門的平均薪資 select post,avg(salary) from employee group by post;
# 最晚入職 select max(hire_date) from employee group by post; # 最先入職 select min(hire_date) from employee group by post;
# 查詢崗位名以及崗位包含的全部員工名字 select post, group_concat(emp_name) from employee group by post; # 查詢崗位名以及各崗位內包含的員工個數 select post, count(id) from employee group by post; # 查詢公司內男員工和女員工的個數 select gender, count(id) from employee group by gender;
# 部門人數大於3 select post from employee group by post having count(*) > 3; # 平均薪資大於10000 select post from employee group by post having avg(salary) > 10000; # 過濾整張表,必須有 age 字段,不然報錯 select emp_name, age from employee having avg(age)>18;
# 查詢各崗位內包含的員工個數小於2的崗位名、崗位內包含員工名字、個數 select post, group_concat(emp_name), count(*) from employee group by post having count(id) < 2; # 查詢各崗位平均薪資大於10000的崗位名、平均工資 select post,avg(salary) from employee group by post having avg(salary) > 10000; # 查詢各崗位平均薪資大於10000且小於20000的崗位名、平均工資 select post,avg(salary) from employee group by post having avg(salary) > 10000 and avg(salary) < 20000; # 使用 between ... and... select post,avg(salary) from employee group by post having avg(salary) between 10000 and 20000;
# desc 表示降序排 # asc 表示生序排列,默認值 select * from employee order by salary desc; # 多個個字段排序,先根據第一個字段排列後,再根據第二個字段排列 select * from employee order by age asc, salary desc;
# 查詢各崗位平均薪資大於10000的崗位名、平均工資,結果按平均薪資升序排列 select post, avg(salary) from employee group by post having avg(salary) > 10000 order by avg(salary) asc; # 查詢各崗位平均薪資大於10000的崗位名、平均工資,結果按平均薪資降序排列 select post, avg(salary) from employee group by post having avg(salary) > 10000 order by avg(salary) desc;
# 分頁顯示 # 默認從0開始,顯示前5個 select * from employee limit 5; # 顯示下5個, 5+1 位置開始取 # limit m,n 表示從m+1開始取到5個 limit n offset m等價於limit m,n select * from employee limit 5,5; # 顯示下5個 select * from employee limit 10,5;
#建表 create table department(id int, name varchar(20) ); create table staff(id int primary key auto_increment, name varchar(20), gender enum('male','female') not null default 'male', age int, dep_id int); #插入數據 insert into department values(200,'技術'),(201,'人力資源'),(202,'銷售'),(203,'運營'); insert into staff(name,gender,age,dep_id) values ('henry','male',18,200), ('echo','female',48,201), ('dean','male',38,201), ('diane','female',28,202), ('oleg','male',18,200), ('iris','female',18,204); #查看錶結構和數據 mysql> desc department; mysql> desc employee; mysql> select * from department; mysql> select * from employee;
select 字段列表 FROM 表1 INNER|LEFT|RIGHT JOIN 表2 ON 表1.字段 = 表2.字段;
# 笛卡爾積 select 字段 from t1,t2 where 字段1=字段2; # 連表查詢,staff,department 兩個表,和 inner join 效果一致 select * from staff, department as dept where dep_id=dept.id;
select 字段 from t1 inner join t2 on t1(字段1) = t2(字段2);
# t1鏈接t2,顯示全量的左表,只顯示匹配到的t2 select 字段 from t1 left join t2 on t1(字段1) = t2(字段2); select 字段 from t1 right join t2 on t1(字段1) = t2(字段2); # 全鏈接 select 字段 from t1 left join t2 on t1(字段1) = t2(字段2) union select 字段 from t1 right join t2 on t1(字段1) = t2(字段2);
# 經過左外、和右外鏈接實現全外鏈接示例 select * from staff left join department as dept on dep_id = dept.id union select * from staff right join department as dept on dep_id = dept.id;
# 之內鏈接的方式查詢staff和department表,而且staff表中的age字段值必須大於25,即找出年齡大於25歲的員工以及員工所在的部門 # 此時括號能夠省略 select staff.name, dept.name from staff left join department as dept on dep_id = dept.id where age > 25; # 之內鏈接的方式查詢staff和department表,而且以age字段的升序方式顯示 select * from staff inner join department as dept on dep_id = dept.id order by age;
1:子查詢是將一個查詢語句嵌套在另外一個查詢語句中。 2:內層查詢語句的查詢結果,能夠爲外層查詢語句提供查詢條件。 3:子查詢中能夠包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等關鍵字 4:還能夠包含比較運算符:= 、 !=、> 、<等
# 子表中匹配到惟一值 select name from emp where dep_id = (select id from department where name='技術'); # 子表中匹配到多個值 select name from emp where dep_id in (select id from department where name in ('技術', '銷售'));
# 查詢平均年齡在25歲以上的部門名 select name from department where id in (select dep_id from staff group by dep_id having avg(age) > 25); # 查看技術部員工姓名 select name from staff where dep_id in (select id from department where name = '技術' ) # 查看不足1人的部門名(子查詢獲得的是有人的部門id) select name from department where id not in (select dep_id from staff group by dep_id);
# 查詢大於全部人平均年齡的員工名、年齡 select name, age from staff where age > (select avg(age) from staff); # 查詢大於部門內平均年齡的員工名、年齡 select name, age from staff t1 inner join (select dep_id, avg(age) avg_age from staff group by dep_id) t2 on t1.dep_id = t2.dep_id where t1.age > t2.avg_age;
# exists後爲真 select * from staff where exists (select id from department where id=200); # 輸出staff中全部數據 # exists後爲假 select * from staff where exists (select id from department where id=200); # 輸出爲空
# 連表查詢 select t1.emp_name, t1.hire_date, t1.post from employee as t1 inner join (select depart_id, max(hire_date) as max_date from employee group by depart_id) as t2 on t1.depart_id = t2.depart_id where t1.hire_date = t2.max_date;
# 子查詢 select t3.emp_name,t3.post,t3.hire_date from employee as t3 where id in (select (select id from employee as t2 where t2.depart_id=t1.depart_id order by hire_date desc limit 1) from employee as t1 group by depart_id);
# 1.準備表 create table s_test(id int, name varchar(20), gender char(6), email varchar(50)); # 2.建立存儲過程,實現批量插入記錄 delimiter $$ #聲明存儲過程的結束符號爲$$ create procedure auto_insert() BEGIN declare i int default 1; while(i<3000000)do insert into s_test values(i,'henry','male',concat('henry',i,'@qq.com')); set i=i+1; end while; END$$ #$$結束 delimiter ; #從新聲明分號爲結束符號 # 3.查看存儲過程 show create procedure auto_insert\G # 4.調用存儲過程 call auto_insert(); # 在寫入的時候不更新索引表,只針對myisam生效 ALTER TABLE table_name DELAY_KEY_WRITE= 1;
平衡樹 balance tree b樹
寫入數據:速度較慢,須要整理數據
b樹在範圍查詢b樹不佔優點(root、leaf、branch)演變成雙向鏈式結構
在b樹基礎上的改良:b+樹(innodb 默認結構)(2)
索引字段要儘可能的小:經過上面的分析,咱們知道IO次數取決於b+數的高度h,假設當前數據表的數據爲N,每一個磁盤塊的數據項的數量是m,則有h=㏒(m+1)N,當數據量N必定的狀況下,m越大,h越小;而m = 磁盤塊的大小 / 數據項的大小,磁盤塊的大小也就是一個數據頁的大小,是固定的,若是數據項佔的空間越小,數據項的數量越多,樹的高度越低。這就是爲何每一個數據項,即索引字段要儘可能的小,好比int佔4字節,要比bigint8字節少一半。這也是爲何b+樹要求把真實的數據放到葉子節點而不是內層節點,一旦放到內層節點,磁盤塊的數據項會大幅度降低,致使樹增高。當數據項等於1時將會退化成線性表。
樹的高度會影響索引的效率
索引特色(2)
mysql中全部的b+樹索引的高度都基本上控制在3層
數據庫中的B+樹索引能夠分爲彙集索引(clustered index)和輔助索引(secondary index)
彙集索引:數據直接存儲在樹結構的葉子節點
# InnoDB存儲引擎表是索引組織表,即表中數據按照主鍵順序存放。 1. 而彙集索引(clustered index)就是按照每張表的主鍵構造一棵B+樹,同時葉子結點存放的即爲整張表的行記錄數據,也將彙集索引的葉子結點稱爲數據頁。 2. 彙集索引的這個特性決定了索引組織表中數據也是索引的一部分。同B+樹數據結構同樣,每一個數據頁都經過一個雙向鏈表來進行連接。 # 若是未定義主鍵,MySQL取第一個惟一索引(unique)並且只含非空列(NOT NULL)做爲主鍵,InnoDB使用它做爲聚簇索引。 1. 若是沒有這樣的列,InnoDB就本身產生一個這樣的ID值,它有六個字節,並且是隱藏的,使其做爲彙集索引。 # 因爲實際的數據頁只能按照一棵B+樹進行排序,所以每張表只能擁有一個彙集索引。 1. 在多數狀況下,查詢優化器傾向於採用彙集索引。由於彙集索引可以在B+樹索引的葉子節點上直接找到數據。 2. 此外因爲定義了數據的邏輯順序,彙集索引可以特別快地訪問針對範圍值得查詢。
alter table t1 add primary key(id); alter table t1 modify id not null unique;
輔助索引:數據不直接存儲在樹中
彙集和輔助索引對比
innodb中彙集索引和輔助索引並存(都是b+樹)
myisam中只有輔助索引
須要注意的是:innodb表的索引會存放於s1.ibd文件中,而myisam表的索引則會有單獨的索引文件table1.MYI
MySAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址。而在innodb中,表數據文件自己就是按照B+Tree(BTree即Balance Tree)組織的一個索引結構,這棵樹的葉節點data域保存了完整的數據記錄。這個索引的key是數據表的主鍵,所以innodb表數據文件自己就是主索引。由於inndob的數據文件要按照主鍵彙集,因此innodb要求表必需要有主鍵(Myisam能夠沒有),若是沒有顯式定義,則mysql系統會自動選擇一個能夠惟一標識數據記錄的列做爲主鍵,若是不存在這種列,則mysql會自動爲innodb表生成一個隱含字段做爲主鍵,這字段的長度爲6個字節,類型爲長整型.
# 方法一:建立表時 create table 表(字段..., index|unique|fulltext|spatial|key 索引名稱 on 表(字段1,字段2...)); # 方法二:CREATE在已存在的表上建立索引,經常使用方法 create index(索引類型,一般使用index) 索引名稱 on 表(字段1,字段2...); # 方法三:ALTER TABLE在已存在的表上建立索引 alter table 表名 add index 索引名稱 on 表(字段1,字段2...); # 刪除索引 drop index 索引名 on 表名字; # 查看錶s1的索引 show index from s1;
select * from 表 where id between 1000000 and 1000005; # 使用like select * from 表 where emial like '%abc';
# 而對於區分度低的字段,沒法找到大小關係,由於值都是相等的,毫無疑問,還想要用b+樹存放這些等值的數據,只能增長樹的高度,字段的區分度越低,則樹的高度越高。
select * from s1 where id*10 = 1000000;
小結:索引不生效狀況
create index ind_mix on s1(id, email); # 對於聯合索引(a,b),下述語句能夠直接使用該索引,無需二次排序 select ... from table where a=xxx order by b; # 而後對於聯合索引(a,b,c)來首,下列語句一樣能夠直接經過索引獲得結果 select ... from table where a=xxx order by b; select ... from table where a=xxx and b=xxx order by c; # 可是對於聯合索引(a,b,c),下列語句不能經過索引直接獲得結果,還須要本身執行一次filesort操做,由於索引(a,c)並未排序 select ... from table where a=xxx order by c;
# 執行計劃,並不會真正執行sql語句,給出一個執行計劃 explain select id from s1 where id = 1000000;
# 語法: mysqldump -h服務器 -u用戶名 -p密碼 數據庫名 > 備份文件.sql # 示例: # 單庫備份 mysqldump -uroot -p123 庫名 > 備份文件名(路徑) mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql # 多庫備份,導入時不須要指定庫名,會覆蓋庫名相同的庫 mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql # 備份全部庫 mysqldump -uroot -p123 --all-databases > all.sql
# 方法一:不使用 --databases 參數 mysql -u用戶名 -p密碼 庫名 < 備份文件名 # 方法二: mysql> use db1; # 關閉二進制日誌,只對當前session生效 mysql> SET SQL_LOG_BIN=0; mysql> source /root/db1.sql
mysql -uroot -p mysql.exe # mysql的一個客戶端
import pymysql con = pymysql.connect(host='127.0.0.1', user='root', password='123', database='test') # 數據庫操做符,遊標,dict取值,默認元組 cur = con.cursor(pymysql.cursors.DictCursor) # 操做 cur.execute('sql語句') # 獲取返回值,cur相似操做文件的遊標指針 ret = cur.fetchone()/ fetchmany(n)/ fetchall() con.commit() con.close()
# 開啓事務 begin; 或者 start transction; # 查詢id值,for update添加行鎖; select * from emp where id = 1 for update; # 完成更新 update emp set salary=10000 where id = 1; # 提交事務 commit;
-- 表示註釋掉以後的sql語句 select * from userinfo where name = 'alex' ;-- and password = '792164987034'; select * from userinfo where name = 219879 or 1=1 ;-- and password = 792164987034; select * from userinfo where name = '219879' or 1=1 ;-- and password = '792164987034';
sql = 'select * from 表' # 參數爲可迭代對象,使用execut拼接 cur.execute(sql, (username, password)) cur.close() con.close()
import pymysql # 打開數據庫鏈接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法獲取操做遊標 cursor = db.cursor() # SQL 插入語句 sql = """INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES ('Mac', 'Mohan', 20, 'M', 2000)""" try: cursor.execute(sql) # 執行sql語句 db.commit() # 提交到數據庫執行 except: db.rollback() # 若是發生錯誤則回滾 # 關閉數據庫鏈接 db.close()
import pymysql # 打開數據庫鏈接 db = pymysql.connect("localhost", "root", "root", "day40") # 使用cursor()方法獲取操做遊標 cur = db.cursor() # SQL 查詢語句 sql = "SELECT * FROM employee \ WHERE salary > %s" % (1000) try: ret = cur.execute(sql) # 執行SQL語句 print(ret) # ret爲數據行數 results = cur.fetchall() # 獲取全部記錄列表 for row in results: id = row[0] name = row[1] gender = row[2] age = row[3] hire_date = row[4] print("id=%s,name=%s,gender=%s,age=%s,hire_date=%s"%(id, name, gender, age, hire_date)) except: print("Error: unable to fetch data") # 關閉數據庫鏈接 db.close()