數據庫php
數據庫軟件java
數據倉庫python
sudo /etc/init.d/mysql start|stop|restart|status sudo service mysql start|stop|restart|status
mysql -hIP地址 -u用戶名 -p密碼 本地鏈接可省略 -h 選項
庫管理mysql
一、查看已有庫; show databases; 二、建立庫並指定字符集; create database 庫名 charset utf-8; create database 庫名 character set utf-8; 三、查看當前所在庫; select database(); 四、切換庫; use 庫名; 五、查看庫中已有表; show tables; 六、刪除庫; drop database 庫名;
表管理面試
一、建立表並指定字符集; create table 表名(字段名,字段類型,其餘) charset = utf-8; 二、查看建立表的語句 (字符集、存儲引擎); show create table 表名; 三、查看錶結構; desc 表名; 四、刪除表; drop table 表名,表名2;
表記錄管理sql
一、增 : insert into 表名(字段名) value(),(); 二、刪 : delete from 表名 where 條件; 三、改 : update 表名 set 字段名=值 where 條件; 四、查 : select 字段名 from 表名 where 條件;
表字段管理(alter table 表名)數據庫
一、增 : alter table 表名 add 字段類型 first|after 字段名; 二、刪 : alter table 表名 drop 字段名; 三、改 : alter table 表名 modify 字段名 字段類型; 四、表重命名: alter table 表名 rename 新表名;
四大數據類型編程
int [4字節] smallint[2字節] bigint[8個字節] tinyint[1個字節]
char() 定長: char(4) 存3個字符 abc; 'abc '【長度不足,填充空格】 注意:select 取值時mysql將空格去掉! 'ddd '---預期顯示'ddd ',實際顯示---'ddd' varchar(4) 多出一個字節,專門存儲當前這個字段實際存儲長度
enum set
date datetime timestamp time year
日期時間函數iphone
NOW()當前時間 CURDATE() YEAR(字段名) DATE(字段名) TIME(字段名)
日期時間運算編程語言
select * from 表名 where 字段名 運算符(NOW()-interval 間隔); 間隔單位: 1 day | 3 month | 2 year eg1:查詢1年之前的用戶充值信息 select * from user where time < (NOW()-interval 1 year);
> >= < <= = != students表名 score 字段名 eg1 : 查詢成績不及格的學生 select * from students where score < 60; eg2 : 刪除成績不及格的學生 delete from students where score < 60; eg3 : 把id爲3的學生的姓名改成 周芷若 update students set name = '周芷諾' where id = 3;
and or eg1 : 查詢成績不及格的男生 select * from students where score < 60 and gender = 'male'; eg2 : 查詢成績在60-70之間的學生 select * from students where score >= 60 and score <= 70;
between 值1 and 值2 、in() 、not in() eg1 : 查詢不及格的學生姓名及成績 select * name,score from students where score between 0 and 59; eg2 : 查詢AID19和AID18班的學生姓名及成績 select name,score from students where class in ('AID19','AID18');
where 字段名 like 表達式(%_) eg1 : 查詢北京的姓趙的學生信息 select * from students where name like '趙%';
is NULL 、is not NULL eg1 : 查詢姓名字段值爲NULL的學生信息 select * from students where name is NULL;
給查詢的結果進行排序(永遠放在SQL命令的倒數第二的位置寫)
order by 字段名 ASC/DESC eg1 : 查詢成績從高到低排列 select * from students order by score DESC;
限制顯示查詢記錄的條數(永遠放在SQL命令的最後寫)
limit n :顯示前n條 limit m,n :從第(m+1)條記錄開始,顯示n條 分頁:每頁顯示10條,顯示第6頁的內容 limit (6-1)*10,10; 每頁顯示a條,顯示第b頁的內容 limit (b-1)*a,a;
建立庫 :country(指定字符編碼爲utf8)
建立表 :sanguo 字段:id 、name、attack、defense、gender、country
要求 :id設置爲主鍵,並設置自增加屬性
id int primary key auto_increment,
插入5條表記錄(id 1-5,name-諸葛亮、司馬懿、貂蟬、張飛、趙雲),攻擊>100,防護<100)
查找全部蜀國人的信息
select * from sanguo where country='蜀國';
將趙雲的攻擊力設置爲360,防護力設置爲68
update sanguo set attack = 360,defense=68 where name='趙雲';
將吳國英雄中攻擊值爲110的英雄的攻擊值改成100,防護力改成60
update sanguo set attack =100,defense=60 where attack=110 and country='吳國';
找出攻擊值高於200的蜀國英雄的名字、攻擊力
select name,attack from sanguo where attack>200 and country='蜀國';
將蜀國英雄按攻擊值從高到低排序
select * from sanguo where country='蜀國' order by attack DESC;
魏蜀兩國英雄中名字爲三個字的按防護值升序排列
select * from sanguo where country in('蜀國','魏國') and name like '___' order by defense ASC;
在蜀國英雄中,查找攻擊值前3名且名字不爲 NULL 的英雄的姓名、攻擊值和國家
select name,attack,country from sanguo where country='蜀國' and name is not NULL or order by attack DESC limit 3;
三、select ...聚合函數 from 表名 一、where ... 二、group by ... 四、having ... 五、order by ... 六、limit ...; 左邊是執行順序,右邊是寫的順序
方法 | 功能 |
---|---|
avg(字段名) | 該字段的平均值 |
max(字段名) | 該字段的最大值 |
min(字段名) | 該字段的最小值 |
sum(字段名) | 該字段全部記錄的和 |
count(字段名) | 統計該字段記錄的個數 |
eg1 : 找出表中的最大攻擊力的值?
select max(attack) from sanguo;
eg2 : 表中共有多少個英雄?
select count(name) from sanguo;
eg3 : 蜀國英雄中攻擊值大於200的英雄的數量
select count(id) from sanguo where country='蜀國' and attack >200;
給查詢的結果進行分組
eg1 : 計算每一個國家的平均攻擊力
select country,avg(attack) from sanguo group by country;
eg2 : 全部國家的男英雄中 英雄數量最多的前2名的 國家名稱及英雄數量
select country,count(id) as number from sanguo where gender='m' group by country order by number DESC limit 2;
注意:
group by後字段名必需要爲select後的字段一致
查詢字段和group by後字段不一致,則必須對該字段進行聚合處理(聚合函數)
對分組聚合後的結果進行進一步篩選
eg1 : 找出平均攻擊力大於105"having avg (attack) >105"的國家的前2名,顯示國家名稱和平均攻擊力 select country,avg(attack) from sanguo group by country having avg(attack)>105 order by avg(attack) DESC limit 2;
注意
having語句一般與group by聯合使用 having語句存在彌補了where關鍵字不能與聚合函數聯合使用的不足,where只能操做表中實際存在的字段,having操做的是聚合函數生成的顯示列
不顯示字段重複值
eg1 : 表中都有哪些國家 select distinct country from sanguo; eg2 : 計算一共有多少個國家 select count(distinct country) from sanguo;
注意
distinct和from之間全部字段都相同纔會去重 distinct不能對任何字段作聚合處理
運算符 : + - * / % **
eg1: 查詢時顯示攻擊力翻倍 select name,attack*2 from sanguo; eg2: 更新蜀國全部英雄攻擊力 * 2 update sanguo set attack=attack*2 where country='蜀國';
對數據庫表的一列或多列的值進行排序的一種結構B+樹(Btree方式)
傳統B樹的特色:
1,每一個節點能存儲多個索引且包含數據,因爲該特性,促使樹的高度比二叉樹矮,從而下降了磁盤的IO查找。
2,可是因爲每一個節點存儲了數據。。。
B+樹
1,節點內只存儲索引,不存儲數據,從而單個節點能存儲的索引數量遠遠大於B樹
2,數據均存儲在葉子節點中,而且有序的相連【範圍查詢效果棒!】
加快數據檢索速度
佔用物理存儲空間(/var/lib/mysql) 當對錶中數據更新時,索引須要動態維護,下降數據維護速度
# cursor.executemany(SQL,[data1,data2,data3]) # 以此IO執行多條表記錄操做,效率高,節省資源 一、開啓運行時間檢測 mysql>show variables like '%pro%'; mysql>set profiling=1; 二、執行查詢語句(無索引) select name from students where name='Tom99999'; 三、查看執行時間 show profiles; 四、在name字段建立索引 create index name on students(name); 五、再執行查詢語句 select name from students where name='Tom88888'; 六、查看執行時間 show profiles;
一、可設置多個字段 二、普通索引 :字段值無約束,KEY標誌爲 MUL 三、惟一索引(unique) :字段值不容許重複,但可爲 NULL KEY標誌爲 UNI 四、哪些字段建立索引:常常用來查詢的字段、where條件判斷字段、order by排序字段
建立表時
create table 表名( 字段名 數據類型, 字段名 數據類型, index(字段名), index(字段名), unique(字段名) );
已有表中建立
create [unique] index 索引名 on 表名(字段名);
一、desc 表名; --> KEY標誌爲:MUL 、UNI 二、show index from 表名\G;
drop index 索引名 on 表名;
一、只能有一個主鍵字段 二、所帶約束 :不容許重複,且不能爲NULL 三、KEY標誌(primary) :PRI 四、一般設置記錄編號字段id,能惟一鎖定一條記錄
建立表添加主鍵
create table student( id int auto_increment, name varchar(20), primary key(id) )charset=utf8,auto_increment=10000;##設置自增加起始值
已有表添加主鍵
alter table 表名 add primary key(id);
已有表操做自增加屬性
一、已有表添加自增加屬性 alter table 表名 modify id int auto_increment; 二、已有表從新指定起始值: alter table 表名 auto_increment=20000;
一、刪除自增加屬性(modify) alter table 表名 modify id int; 二、刪除主鍵索引 alter table 表名 drop primary key;
有一張文章評論表comment以下
comment_id | article_id | user_id | date |
---|---|---|---|
1 | 10000 | 10000 | 2018-01-30 09:00:00 |
2 | 10001 | 10001 | ... ... |
3 | 10002 | 10000 | ... ... |
4 | 10003 | 10015 | ... ... |
5 | 10004 | 10006 | ... ... |
6 | 10025 | 10006 | ... ... |
7 | 10009 | 10000 | ... ... |
以上是一個應用的comment表格的一部分,請使用SQL語句找出在本站發表的全部評論數量最多的10位用戶及評論數,並按評論數從高到低排序
備註:comment_id爲評論id
article_id爲被評論文章的id
user_id 指用戶id
綜述:兩張表,一張顧客信息表customers,一張訂單表orders
表1:顧客信息表,完成後插入3條表記錄
c_id 類型爲整型,設置爲主鍵,並設置爲自增加屬性 c_name 字符類型,變長,寬度爲20 c_age 微小整型,取值範圍爲0~255(無符號) c_sex 枚舉類型,要求只能在('M','F')中選擇一個值 c_city 字符類型,變長,寬度爲20 c_salary 浮點類型,要求整數部分最大爲10位,小數部分爲2位
表2:顧客訂單表(在表中插入5條記錄)
o_id 整型 o_name 字符類型,變長,寬度爲30 o_price 浮點類型,整數最大爲10位,小數部分爲2位 設置此表中的o_id字段爲customers表中c_id字段的外鍵,更新刪除同步 insert into orders values(1,"iphone",5288),(1,"ipad",3299),(3,"mate9",3688),(2,"iwatch",2222),(2,"r11",4400);
增刪改查題
一、返回customers表中,工資大於4000元,或者年齡小於29歲,知足這樣條件的前2條記錄 二、把customers表中,年齡大於等於25歲,而且地址是北京或者上海,這樣的人的工資上調15% 三、把customers表中,城市爲北京的顧客,按照工資降序排列,而且只返回結果中的第一條記錄 四、選擇工資c_salary最少的顧客的信息 五、找到工資大於5000的顧客都買過哪些產品的記錄明細 六、刪除外鍵限制 七、刪除customers主鍵限制 八、增長customers主鍵限制c_id