數據庫連接
mysql -u['username'] -p['password']
數據庫退出
exit
數據庫操作
創建:create database test(數據庫名) DEFAULT CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;
修改:alter database test
deafault character set gb2312 (修改默認字符集爲gb2312)
deafalut collate gb2312_chinese_ci; (修改默認校對規則爲gb2312_chinese_ci)
刪除:drop database test;
查看:show databases [like 'test'];
select database();查看當前使用的數據庫
使用數據庫:use test (不用分號)
表操作
創建:create table students
(id char(10) not null primary key,
name char(6) not null ,
sex char(2) not null default 0,
major char(20 not null));---列名 數據類型 約束
更新:alter table test.student
add column city char(20) default null (添加列)
change column city home char(20) not null (可同時修改表中指定列的名稱和數據類型)
modify column id int first/after (修改指定列的數據類型,first/after修改指定列在表中的位置)
alter column city set default '廣州'; (可修改或刪除表中指定列的默認值)
drop column city; (刪除列)
rename to test.university_student; (爲表student重命名爲university_student)
重命名:rename table test.university_student to student;
複製:create table test.student_copy like test.student; (複製表結構)
create table test.student_copy as test.student; (複製表結構和內容,但是索引和完整性約束不會被複制)
刪除:drop table test.student;
查看:show tables; (查看當前數據庫的所有表名稱)
show columns from student; | desc 表名; (查看錶結構)
插入數據:insert into test.student values('001','lwk','0','計算科學');
刪除數據:delete from test.student where id='001'; (不指定where將刪除所有數據)
修改數據:updata test.student set id='002' where name='lwk';
數據庫的查詢
查詢表達式結果:select 2+3; (可得到2+3的計算結果5 注:select 'c'+'d';輸出0)
查詢表數據:select id,name from student;
替換查詢結果數據: select sex,
case
when sex='0'then '男'
else '女'
end [as '性別'] (as '性別'是給列sex取列別名)
from test.student; (注意這裏還是一個select…from…子句)
高級查詢和sqlserver一樣(嵌套查詢和join連接)
嵌套查詢:select 城市 from lwk.倉庫 where 倉庫號 in (select 倉庫號 from lwk.職工 where 工資>5000)
join連接:select 供應商名 from lwk.供應商 join lwk.訂購單 on 供應商.供應商號=訂購單.供應商號 join lwk.職工 on 職工.職工號=訂購單.職工號 join lwk.倉庫 on 倉庫.倉庫號=職工.倉庫號 where 地址='韶關' and 城市='廣州'
字符串、文本匹配
通配符匹配:select name from student where major like('計%') (%代表多個字符 _代表一個字符)
正則表達式匹配:select name from student where major [not] regexp|rlike '計'; (基本字符匹配,與百分號通配符效果類似)
select name from student where id [not] regexp|rlike '計算科學|信息計算'; (選擇匹配)
select name from student where major [not] regexp|rlike '[1-9]'; (範圍匹配)
group by …having…子句
select major ,cout(*) 總人數 from student group by student.major having cout(*)>2;
order by 子句 (asc升序|desc降序)
asc和desc不能影響到逗號外的列,默認是asc
select * from app_public_feedback order by created_on desc limit 0,10;
limit 子句
select id,name from student limit 2,4; (從第3行開始取4行數據)
select id,name from student limit 4 offset 2; (從第3行開始取4行數據)
視圖
創建:create view test.id_view as select id from student where sex='0';
修改:alter view test.name_view as select name from student where sex='0';
查看:show create view name_view;
更新:update/delete/insert(和表的使用方法類似,把表名改成視圖名就好)
如果視圖包含 聚合函數 distinct關鍵字 group by子句 having子句 union運算符 位於選擇列表中的子查詢 from子句中的不可更新視圖或包含多個表 where子句中的子查詢,引用from子句中的表 時視圖不可更新
刪除:drop view name_view;
觸發器
創建:create trigger test.student_trigger <before|after> <insert| updata| delete> on test.student for each row <主體> (主體如果要執行多個語句,要使用begin…end複合結構)
例如:create trigger test.student_insert after insert on test.student for each row set @str='add a new student';
刪除:drop trigger [if exists] test.student_insert;
當觸發器涉及對錶自身的更新操作時,只能使用before觸發器。
old表中的值全部是隻讀的。(new操作後的表,old操作前的表)
load data語句能激活before insert觸發器。
每個表最多有六個觸發器,每種各一個。每個表每個事件每次只允許一個觸發器。
觸發器不能建立在視圖上。
事件
InnoDB : 事物型數據庫首選引擎
需要確保MySQL中的event_scheduler已開啓
(查看當前事件調度器是否開啓 show variables like 'event_scheduler';|select @@event_scheduler;
開啓|關閉事件調度器 set global event_scheduler=true|false;)
創建:create event event_name
on scheduler every 1 month|year|quarter|day|hour|minute|……
do
insert into student values('002','路人甲',default,'君子修養');
修改:allter event event_name [rename to event_newname][do <事件主體> ][disable|enable(關閉|開啓事件)];
刪除:drop event event_name;
事件是基於特定時間週期來觸發的
如果不顯式地指明,事件在創建後處於關閉狀態
存儲過程
創建:create procedure name ([過程參數])<過程體>
過程體一般寫在begin……end之間
過程參數格式: [in|out|inout] <全局參數名><類型>
IN 輸入參數:表示該參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,爲默認值
OUT 輸出參數:該值可在存儲過程內部被改變,並可返回
INOUT 輸入輸出參數:調用時指定,並且可被改變和返回
需要具有create routine權限。
過程體:delimiter $$ (修改命令結束符爲$$)
declare <變量名> <類型> [default <默認值>] (聲明局部變量,局部變量只能在存儲過程體begin…end語句中聲明並作用)
局部變量與用戶變量的區別:局部變量的聲明時沒有使用@符號,並且只能在begin…end範圍內使用;用戶變量在聲明時需要使用@符,已經聲明的變量存在與整個會話中。用戶變量使用SET語句定義,局部變量使用DECLARE語句定義。
變量聲明後可使用set語句爲局部變量賦值 (set xname='小馬')
調用:call <存儲過程名>[<參數>]
修改:alter procedure <過程名> [<特徵>]
刪除:drop procedure <過程名>
查看:show create procedure <存儲過程>
show procedure status(查看數據庫中存在哪些存儲過程)
遊標
聲明:declare <遊標名> cursor for <select語句>
打開:open <遊標名>
讀取數據:fetch <遊標名> into <變量1>[,變量2,…]
關閉:close <遊標名>
注意:!遊標只能用於存儲過程和存儲函數
!遊標不是一條select語句,是被select語句檢索出來的結果集
存儲函數
創建:create function <函數名>[參數1 類型1]
returns <類型>
<函數主體>
調用:select <存儲函數名>[參數1]
刪除:drop function<存儲函數名>
查看:show create function <函數名>
show function status(查看數據庫中存在哪些存儲過程)
用戶賬號管理
創建:create user 'luo' [@'localhost'] identified by 'mima';(默認主機名是@'%')
刪除:delete from user where User='myuser' and Host='localhost';
修改用戶賬號:rename 'luo'[@'localhost'] to 'he' [@'localhost'];(語句前he賬戶不存在)
修改用戶口令:select password('mima'); (單向加密函數)
set password for 'he'[@'localhost']=' *98703F7A543944FD3818077669F74D60616DB2C8';
查看所有賬戶:select user from mysql.user;
用戶權限管理
授與:grant all/updata…權限類型 on test.*/test.表名 (*.*代表所有數據庫的所有表) to 'he'[@'localhost'];
末尾加上 with grant option--該賬戶可將自身權限授予其他賬戶
末尾加上 with max_updates_per_hour number等格式 --限制update次數爲number
撤銷:revoke updata…權限類型 on test.* from 'he'[@'localhost'];
revoke all privileges,grant option from user 'he';
查看用戶擁有的權限:show grants for 'he'[@'localhost'];
注意:授權包括:創建表、索引、列、視圖、存儲過程、函數等權限,最小的是列。
DELETE 不能授予到操作權限。
備份與恢復
SQL語句備份:select *from test.表名 into outfile 'E:\data.txt'
fields (fields子句有下面三個亞子句)
terminated by ',' (指定字段間逗號分隔)
optionally enclosed by '"' (指定字符用雙引號標註)
lines terminated by '?'; (指定行末用問號結束)
SQL語句恢復:load data infile 'E:\data.txt' into test.表名
fields
terminated by ','
optionally enclosed by '"'
lines terminated by '?'; (表結構要相同,恢復的只是數據,結果如果破壞要重新構建結構)
mysqldump程序備份:
導出:
mysqldump -uroot -ppassword db_name > /root/backup/db_name.sql
導入:
mysql -uroot -ppassword db_name < /root/backup/db_name.sql
參考:https://www.cmsky.com/mysqldump/
複製到本地:scp /root/backup/db_name.sql [email protected]:/home/ion/
刪除已複製得數據庫文件:rm -rf /root/backup/db_name.sql
重啓數據庫:
service mysqld restart
service mysql restart (5.5.7版本命令)
下面的是恢復備份是全庫備份,使用情況較少。
mysqldump -h (主機名) -u(賬戶名) -p(密碼) 數據庫名.表名/--database 數據庫名/--all-databases >目錄位置(保存文件後綴爲sql)
例子:mysqldump -uroot -p123456 --all-databases>E:\360Downloads;
mysqldump程序恢復:
mysqldump -h (主機名) -u(賬戶名) -p(密碼) --replace 數據庫名 目錄位置
PHP數據庫操作
建立連接 : mysql_connect("服務器名","用戶名","密碼")
mysql_pconnect("服務器名","用戶名","密碼")
選擇數據庫:mysql_select_db("database_name"[,connection])
執行數據庫操作: mysql_query(query,[connection]) query可爲字符串或者字符串變量
數據的查詢:mysql_fetch_array(data[,datatype])
mysql_fetch_row(data)
mysql_fetch_assoc(data)
mysql_fetch_seek(data)
關閉連接:mysql_close()
@$_POST["b"]==添加、修改 or other
PHP 5 及以上版本建議使用mysqli代替mysql來進行數據庫操作。 :如 mysql_fetch_row(data)改爲mysqli_fetch_row(data)
配置允許其他電腦連接數據庫:
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
註釋掉 bind-address = 127.0.0.1
登錄數據庫
mysql -u['username'] -p['password']
使用命令:
grant all on *.* to ['username'] @'['host'] ' identified by ['password'];
例子:grant all on *.* to root @172.20.0.150 ' identified by '123456';
主機:172.20.0.150 賬戶:root 密碼:123456
刷新權限並重啓mysql:
flush privileges;
/etc/init.d/mysql restart