完整登錄命令:mysql
mysql -u root -p xxxxx -h 127.0.0.1 -P 23306sql
語法:mysql -u 用戶名 -p 密碼 -h mysql服務器的IP地址 -P 使用的端口號數據庫
非完整登錄命令:服務器
mysql -u root -p 回車(回車後再輸入密碼)函數
mysql -u root -p xxxxx -h 127.0.0.1 回車(回車後再輸入密碼)post
SQL語言共分爲四大類:數據查詢語言DQL,數據操縱語言DML,數據定義語言DDL,數據控制語言DCL。
1. 數據查詢語言DQL
數據查詢語言DQL基本結構是由SELECT子句,FROM子句,WHERE
子句組成的查詢塊:
SELECT <字段名錶>
FROM <表或視圖名>
WHERE <查詢條件>
2 .數據操縱語言DML
數據操縱語言DML主要有三種形式:
1) 插入:INSERT
2) 更新:UPDATE
3) 刪除:DELETE
3. 數據定義語言DDL
數據定義語言DDL用來建立數據庫中的各類對象-----表、視圖、
索引、同義詞、聚簇等如:
CREATE TABLE/VIEW/INDEX/SYN/CLUSTER
| | | | |
表 視圖 索引 同義詞 簇編碼
DDL操做是隱性提交的!不能rollback
4. 數據控制語言DCL
數據控制語言DCL用來授予或回收訪問數據庫的某種特權,並控制
數據庫操縱事務發生的時間及效果,對數據庫實行監視等。如:
1) GRANT:受權。spa
2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一點。
回滾---ROLLBACK
回滾命令使數據庫狀態回到上次最後提交的狀態。其格式爲:
SQL>ROLLBACK;3d
3) COMMIT [WORK]:提交。code
在數據庫的插入、刪除和修改操做時,只有當事務在提交到數據
庫時纔算完成。在事務提交前,只有操做數據庫的這我的纔能有權看
到所作的事情,別人只有在最後提交完成後才能夠看到。
提交數據有三種類型:顯式提交、隱式提交及自動提交。下面分
別說明這三種類型。
(1) 顯式提交
用COMMIT命令直接完成的提交爲顯式提交。其格式爲:
SQL>COMMIT;
(2) 隱式提交
用SQL命令間接完成的提交爲隱式提交。這些命令是:
ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,
EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。
(3) 自動提交
若把AUTOCOMMIT設置爲ON,則在插入、修改、刪除語句執行後,
系統將自動進行提交,這就是自動提交。其格式爲:
SQL>SET AUTOCOMMIT ON;
注意:
①進入mysql後全部命令必須以分號(;)結尾
②若是你要查一些數據時顯示亂,屏幕寬度不夠展不開,你就在命令結尾加\G最後不要加分號,這樣顯示就會清晰了.
③若是輸錯命令想退出來不執行,就輸入\c回車便可,以下圖
④若是少寫一個引號,直接\c是退不出來的,須要先寫'再寫\c就好了以下圖
進入數據庫後輸入\s
數據庫的增刪改查說白了其實就是文件夾的增刪改查
增
create database db1 charset utf8;(這裏在建立庫時指定了編碼集)
create database db11; (不指定編碼集也可)
此時就在你安裝數據庫的文件夾下的data文件中新增了兩個文件夾(db1和db11)
查看全部數據庫時,有數據庫安裝時自帶的數據庫也一併顯示出來了
查
show create database db1;(查看剛建的數據庫的配置)
show databases;(查看全部數據庫--庫名)
查看當前所在的數據庫:select database();
因爲你my.ini文件中配置制定了編碼集,因此不指定編碼集的數據庫db11也是utf8.
改
alter database db1 charset gbk;(將數據庫db1的編碼集改成gbk了)
切換數據庫
use +數據庫名+;
刪
drop database db1;(刪除數據庫db1)
表的增刪改查能夠看作是對文件的增刪改查
增長表時你須要先進入一個數據庫(use +數據庫名+;),增長表時就在你進入的數據庫中新增表
增
create table t1(id int,name char); 新增表t1,表中有兩個字段id和name,id是整形,name是字符串
查
show create table t1;(查看該表具體信息)
若是沒進入數據庫你想直接查就在對應的表名前加數據庫名.
show create table db1.t1;
show tables;查看當前數據庫下全部表名
desc t1;查看某表中全部字段以及字段的屬性(desc是describe的縮寫)
select id from n; 查詢表n中id字段的全部內容
select * from n;查詢表n中全部內容
改
alter table t1 modify name char(6);(將name字段屬性改成字符串,寬度改成6,默認寬度是1)modify是固定寫法
alter table t1 change name NAME char(7);(修改字段名name改成NAME,而且寬度改成7)change是固定寫法新的名字NAME後面必須接新字段的屬性,不然報錯,你能夠是新的屬性也能夠是原來的屬性.
修改表名:
alter table ttt rename xxx;將ttt表名改成xxx
增長字段:
alter table xxx add n char(10) ; 在xxx表中增長一個n字段,數據類型爲char長度爲10
alter table xxx add n char(10) first; 將n字段添加到第一個字段位置
alter table xxx add n char(10) after id; 將n字段添加到id字段位置的後面
刪
drop table t1;刪除表t1
刪除字段:
alter table xxx drop n ;刪除xxx表中n字段
複製表格(能夠在同數據庫可是不要重名,也能夠在不一樣數據庫能夠重名,)
①既複製表結構,又要數據:
create table t1 select host,user from mysql.user; (就是把你查到的某個表的數據select...,直接在建立表格時直接寫在後面就好了,寫在了表名後面)
create table t1 select * from db1.ttt;
②只要表結構,不要數據:
法一:就是在後面加個不成立的條件,讓他查不到對應的數據就好了,查到的內容爲空就只剩表結構了
create table t1 select host,user from mysql.user where 1>2;
法二:like
create table t5 like t2;這樣就把t2的表結構複製過來建立了t5
增
insert into t1(id,name) values(1,'egon1'),(2,'egon2'),(3,'egon3');(新增了3條行記錄,id爲1,name爲egon1...)into能夠省略
insert into t1 values(1,'egon1'),(2,'egon2'),(3,'egon3');不寫字段,默認就按照全部字段來插入
查
select id,name from db1.ttt;(查看ti表中id和name兩個字段)這裏吧數據庫db1也加上了,其實你在db1數據庫下就不用了寫db1,直接寫表名字便可
select * from db1.ttt;查詢t1表下全部字段
查詢某個字段中數據的長度
select char_length(name) from t4; 查詢t4表中name字段的內容的長度.
改
update db1.t1 set name='wwe';將t1表中全部name字段所有寫成wwe
update db1.t1 set name='ALEX' where id=2;將id等於2的name字段改爲ALEX
刪
delete from t1;(將全部記錄所有刪,表變成空表)這個不會清空自增加的計數,delete通常都會與where連用,來固定刪除某行記錄.
truncate t1 ;會清空自增加的計數,再插入行記錄時id會從1開始
delete from t1 where id=2;(只刪除id=2的記錄)
存儲引擎就是表的類型
查看支持的全部存儲引擎
show engines;
或show engines\G 查的比較詳細(有\G時不加分號結尾)
建立表時指定存儲引擎:
create table t1(id int)engine=innodb;不指定默認就是innodb
單表查詢條件順序:
書寫順序以下:
select distinct 字段1,字段2,字段3 from 庫.表
①where 條件
②group by 分組條件
③having 過濾
④order by 排序字段
⑤limit n;
distinct是去重
運行順序:
①from 庫.表(找不到表的話就不運行了)
②where
③group by
④having
⑤distinct 字段1,字段2,字段3 (若是寫了distinct就先去重,再order by),這裏運行的是select後面的內容,就是你要顯示的字段內容
⑥order by
⑦limit in
執行順序寫成函數形式:
def from(db,table): f=open(r'%s\%s' %(db,table)) return f def where(condition,f): for line in f: if condition: yield line def group(lines): pass def having(group_res): pass def distinct(having_res): pass def order(distinct_res): pass def limit(order_res) pass #開始執行 def select(): f=from('db1','t1') lines=where('id>3',f) group_res=group(lines) having_res=having(group_res) distinct_res=distinct(having_res) order_res=order(distinct_res) res=limit(order_res) print(res) return res
注:where用不了聚合函數,由於他是在分組(group by)以前運行
這兩句是一個意思:(between,in)
①
select name,salary from employee where salary >= 20000 and salary <= 30000;
select name,salary from employee where salary between 20000 and 30000;
②
select name,salary from employee where salary < 20000 or salary > 30000;
select name,salary from employee where salary not between 20000 and 30000;
③
select * from employee where age = 73 or age = 81 or age = 28;
select * from employee where age in (73,81,28);
select * from employee where post_comment is Null; 某字段爲空,不能寫成=' '
select * from employee where post_comment is not Null; 某字段不爲空
like模糊匹配:
select * from employee where name like "jin%"; 以jin開頭的都算上
select * from employee where name like "jin___";一個下劃線表明一個字符,無論你寫的是啥,他只匹配字符數量夠了就行,例如:jinxxx能夠,可是jinqwer就不行,多了一個字符.
在group by以後均可用聚合函數
先設置:set global sql_mode="ONLY_FULL_GROUP_BY"; 設置嚴格模式,而後exit退出再進
注意:
①分組以後,只能取分組的字段,以及每一個組聚合結果,就是設置以前你分組時候能夠用*獲取內容,設置後,只能取你分組的字段或者聚合的字段,別的字段拿不到,寫了就報錯.
②分組以後,你能夠取其餘字段,可是這個字段必定是分組後該組最上面的一行數據,若是你要取,最好用聚合函數來取,max,min,avg等
③不要用unique的字段來分組,由於全是不同的,分不分沒區別
設置以前:
設置以後
聚合函數:
max 最大值
min 最小值
avg 求平均數
sum 求總和
count 求數量(多少行記錄)
select post,count(id) as emp_count from employee group by post;
select post,max(salary) as emp_count from employee group by post;
select post,min(salary) as emp_count from employee group by post;
select post,avg(salary) as emp_count from employee group by post;
select post,sum(age) as emp_count from employee group by post;
沒有group by則默認總體算做一組
select max(salary) from employee;
拼接group_concat:
#group_concat
select post,group_concat(name) from employee group by post;將name字段內容按照post字段進行分類,並寫在post分類以後
定義顯示格式:(拼接字符串)用concat
select concat ('姓名:' ,name, ' 性別:',sex) as info ,concat('年薪:',salary*12) as annual_salary from employee;
顯示以下:
另外一種:
select concat(name,':',sex,':'age) from employee;
換一種寫法:用concat_ws他會在兩個字段中間都加入相同的內容
select concat_ws(':',name,sex,age) from employee;
查詢各崗位包含員工個數小於2的崗位名、崗位內包含用功名字、個數
過濾後:
select post,group_concat(name),count(id) from employee group by post having count(id) < 2;
過濾前:
select post,group_concat(name),count(id) from employee group by post;
默認是升序(asc)
降序:desc
select * from employee order by age asc; #升序
select * from employee order by age desc; #降序
select * from employee order by age asc,id desc; #先按照age升序排,若是age相同則按照id降序排
⑤limit(限制顯示條數):
用法一(顯示條數):
select * from employee limit 3;只看前三條
select * from employee order by salary desc limit 1;我要看薪資最高的那我的,先倒序按照薪資排序,而後只取第一條
用法二(分頁,分段取):
可是實際工做不會僅僅用limit來作分頁,這樣取每次還都是從第一條開始數,只是取的時候按照對應的數字去取,很麻煩.
select * from employee limit 0,5;第一行開始取,一共取5行記錄,取得id是從1-5,你若是寫1,5,那取的id就是2-6
select * from employee limit 5,5;
select * from employee limit 10,5;
select * from employee limit 15,5;
注意:
limit後若是有兩個數字而且用逗號隔開,第一個數字表示從第幾行數據開始,可是不取這一行,從他下一行開始取,第二個數字表示向下取幾行.
select name,salary*12 from employee; 在查詢時能夠進行運算,一個月工資,乘12就變成了年薪
select name,salary*12 as nianxin from employee; 在顯示時就會將salary的字段名改成nianxin
select * from employee where name like 'jin%'; (like是模糊匹配)
select * from employee where name regexp '^jin'; (regexp啓用正則,^表示以xxx爲開頭的)
select * from employee where name regexp '^jin.*(g|n)$'; (以jin開頭,而且以g或者是n結尾的,中間字符不限制的)
from後直接寫倆表名用逗號隔開,會出現不少重複字段,笛卡爾積,第一張表全部行記錄都會跟第二張表每一條行記錄作對應關係
語法: select * from 表一 inner join 表二 on 表一.字段 = 表二.字段;
select * from employee inner join department on employee.dep_id = department.id ;
語法: select * from 表一 left join 表二 on 表一.字段 = 表二.字段;
select * from employee left join department on employee.dep_id = department.id ;
以左表爲主,若是右表中沒有與之對應的內容就寫NULL
語法: select * from 表一 right join 表二 on 表一.字段 = 表二.字段;
select * from employee right join department on employee.dep_id = department.id ;
以右表爲主,若是左表中沒有與之對應的內容就寫NULL
錯誤寫法:mysql中沒有full
select * from employee full join department on employee.dep_id = department.id ;
正確寫法:用union鏈接
select * from employee left join department on employee.dep_id = department.id
union
select * from employee right join department on employee.dep_id = department.id ;
查一下:
平均年齡大於30歲的部門名和平均年齡
select department.name as bumen ,avg(age) as pingjunnianling from employee inner join department on employee.dep_id = department.id
group by department.name
having avg(age)>30;
SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table> ON <join_condition> WHERE <where_condition> GROUP BY <group_by_list> HAVING <having_condition> ORDER BY <order_by_condition> LIMIT <limit_number>
(7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (4) WHERE <where_condition> (5) GROUP BY <group_by_list> (6) HAVING <having_condition> (9) ORDER BY <order_by_condition> (10) LIMIT <limit_number>
1:子查詢是將一個查詢語句嵌套在另外一個查詢語句中。 2:內層查詢語句的查詢結果,能夠爲外層查詢語句提供查詢條件。 3:子查詢中能夠包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等關鍵字 4:還能夠包含比較運算符:= 、 !=、> 、<等
①帶IN關鍵字的子查詢
#查詢平均年齡在25歲以上的部門名 select id,name from department where id in (select dep_id from employee group by dep_id having avg(age) > 25); #查看技術部員工姓名 select name from employee where dep_id in (select id from department where name='技術'); #查看不足1人的部門名(子查詢獲得的是有人的部門id) select name from department where id not in (select distinct dep_id from employee);
②帶比較運算符的子查詢
#比較運算符:=、!=、>、>=、<、<=、<> #查詢大於全部人平均年齡的員工名與年齡 mysql> select name,age from emp where age > (select avg(age) from emp); +---------+------+ | name | age | +---------+------+ | alex | 48 | | wupeiqi | 38 | +---------+------+ rows in set (0.00 sec) #查詢大於部門內平均年齡的員工名、年齡 select t1.name,t1.age from emp t1 inner join (select dep_id,avg(age) avg_age from emp group by dep_id) t2 on t1.dep_id = t2.dep_id where t1.age > t2.avg_age;
③帶EXISTS關鍵字的子查詢
EXISTS關字鍵字表示存在。在使用EXISTS關鍵字時,內層查詢語句不返回查詢的記錄。
而是返回一個真假值。True或False
當返回True時,外層查詢語句將進行查詢;當返回值爲False時,外層查詢語句不進行查詢
#department表中存在dept_id=203,Ture mysql> select * from employee -> where exists -> (select id from department where id=200); +----+------------+--------+------+--------+ | id | name | sex | age | dep_id | +----+------------+--------+------+--------+ | 1 | egon | male | 18 | 200 | | 2 | alex | female | 48 | 201 | | 3 | wupeiqi | male | 38 | 201 | | 4 | yuanhao | female | 28 | 202 | | 5 | liwenzhou | male | 18 | 200 | | 6 | jingliyang | female | 18 | 204 | +----+------------+--------+------+--------+ #department表中存在dept_id=205,False mysql> select * from employee -> where exists -> (select id from department where id=204); Empty set (0.00 sec)
特殊用法(as):
select * from
(select id,name from employee) as t1;
這裏是將查詢到的內容賦值給t1當作一個表格,再從這張表查詢相關內容
新建個遠程帳號,而且賦予權限: