1.mysql登陸 完整登陸命令: mysql -u root -p xxxxx -h 127.0.0.1 -P 23306 語法:mysql -u 用戶名 -p 密碼 -h mysql伺服器的IP地址 -P 使用的埠號 非完整登陸命令: mysql -u root -p 回車(回車後再輸入密碼) ...
1.mysql登陸
完整登陸命令:
mysql -u root -p xxxxx -h 127.0.0.1 -P 23306
語法:mysql -u 用戶名 -p 密碼 -h mysql伺服器的IP地址 -P 使用的埠號
非完整登陸命令:
mysql -u root -p 回車(回車後再輸入密碼)
mysql -u root -p xxxxx -h 127.0.0.1 回車(回車後再輸入密碼)
2.SQL語句:
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:授權。
2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一點。
回滾---ROLLBACK
回滾命令使資料庫狀態回到上次最後提交的狀態。其格式為:
SQL>ROLLBACK;
3) COMMIT [WORK]:提交。
在資料庫的插入、刪除和修改操作時,只有當事務在提交到數據
庫時才算完成。在事務提交前,只有操作資料庫的這個人才能有權看
到所做的事情,別人只有在最後提交完成後才可以看到。
提交數據有三種類型:顯式提交、隱式提交及自動提交。下麵分
別說明這三種類型。
(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就行瞭如下圖
3.查看本資料庫版本與編碼集
進入資料庫後輸入\s
4.資料庫的增刪改查
資料庫的增刪改查說白了其實就是文件夾的增刪改查
增
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)
5.資料庫中表的增刪改查
表的增刪改查可以看做是對文件的增刪改查
增加表時你需要先進入一個資料庫(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
6.行記錄(表中內容)的增刪改查
增
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的記錄)
7.存儲引擎
存儲引擎就是表的類型
查看支持的所有存儲引擎
show engines;
或show engines\G 查的比較詳細(有\G時不加分號結尾)
創建表時指定存儲引擎:
create table t1(id int)engine=innodb;不指定預設就是innodb
8.單表查詢:
單表查詢條件順序:
select distinct 欄位1,欄位2,欄位3 from 庫.表
①where 條件
②group by 分組條件
③having 過濾
④order by 排序欄位
⑤limit n;
distinct是去重
9.簡單查詢:
select name,salary*12 from employee; 在查詢時可以進行運算,一個月工資,乘12就變成了年薪
select name,salary*12 as nianxin from employee; 在顯示時就會將salary的欄位名改為nianxin
where:會把整個表格全部查一遍
這兩句是一個意思:(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退出再進
註意:
①分組之後,只能取分組的欄位,以及每個組聚合結果,就是設置之前你分組時候可以用*獲取內容,設置後,只能取你分組的欄位或者聚合的欄位,別的欄位拿不到,寫了就報錯.
②不要用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;