MYSQL30個知識點-粗略筆記

<?php

//mysql服務器主機地址
$dbhost ='localhost';

//mysql用戶名
$dbuser ='root';

//mysql用戶密碼
$dbpass='123456';

$conn =mysqli_connect($dbhost,$dbpass,$dbuser);
if(! $conn){
	die('連接失敗:'.mysql_error());
}
echo '數據庫連接成功'; 
//設置編碼,防止中文亂碼
mysql_query($conn,"set names utf8");
mysql_close($conn);
?>

<--------------------------------------------------->
<?php
<!-- 1.下列是從命令連接mysql服務器的簡單實例 -->
mysql -u root -p 

exit//退出

<!-- 2.創建數據庫 -->
create database 數據庫名;

<<!DOCTYPE html>
<html lang="zh">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title></title>
</head>
<body>
	
</body>
</html>-- 3.刪除數據庫 -->
drop database 數據庫;
<--------------------------------------------------->
<!-- 4.創建數據庫表 -->
create table table_name(colum_name colum_type);

create table if not exisis 'runoob_tb1' (
	'runoob_id' int unsigned auto_increment,
	'runoob_title' varchar(100) not null,
	'rootoob_auther' varchar (40) not null,
	'submission_date' date,
	primary key ('runoob_id')
)engine=InnoDB DEFAULT CHAREST=utf8;
AUTO_INCREMENT定義列爲自增的屬性,一般用於主鍵,數值會自動加1。
PRIMARY KEY關鍵字用於定義列爲主鍵。 您可以使用多列來定義主鍵,列間以逗號分隔。
ENGINE 設置存儲引擎,CHARSET 設置編碼。



 PHP 的 mysqli_query() 函數來創建已存在數據庫的數據表
 mysqli_query(connection,query,resultmode);
connection	必需。規定要使用的 MySQL 連接。
query		必需,規定查詢字符串。
resultmode	
			可選。一個常量。可以是下列值中的任意一個:
			MYSQLI_USE_RESULT(如果需要檢索大量數據,請使用這個)
			MYSQLI_STORE_RESULT(默認)
			
			
<!-- 5.刪除數據表-->
drop table table_name;
PHP使用 mysqli_query 函數來刪除 MySQL 數據表。
mysqli_query(connection,query,resultmode);


<!--6.插入數據  -->
insert into table_name(field1,field2,.....fieldn)
						values
						(value1,value2.....valuen)

使用PHP 的 mysqli_query() 函數來執行 SQL INSERT INTO命令來插入數據。
mysqli_query(connection,query,resultmode);
						
						
<!-- 7.查詢數據 -->
select column_name,column_name
from table_name
[where clause]
[limit n][offset m]

使用 PHP 函數的 mysqli_query() 及 SQL SELECT 命令來獲取數據。
然後通過 PHP 函數 mysqli_fetch_array() 來使用或輸出所有查詢的數據。
mysqli_fetch_array() 函數從結果集中取得一行作爲關聯數組,或數字數組,或二者兼有 返回根據從結果集取得的行生成的數組,如果沒有更多行則返回 false。
使用 mysqli_fetch_array MYSQLI_ASSOC顯示數據表 runoob_tbl 的所有記錄
使用 mysqli_fetch_assoc 輸出數據表 runoob_tbl 的所有記錄:
使用 mysqli_fetch_array MYSQLI_NUM 顯示數據表 runoob_tbl 的所有記錄:
使用 mysqli_free_result 釋放內存:

<!-- 8.where子句 -->
select filed1.filed2,......filedn from table_name1,table_name2....
[where condition1[add[or]] condition2.......]
MySQL 的 WHERE 子句的字符串比較是不區分大小寫的。 你可以使用 BINARY (binary)關鍵字來設定 WHERE 子句的字符串比較是區分大小寫的


where:數據庫中常用的是where關鍵字,用於在初始表中篩選查詢。它是一個約束聲明,用於約束數據,在返回結果集之前起作用。

group by:對select查詢出來的結果集按照某個字段或者表達式進行分組,獲得一組組的集合,然後從每組中取出一個指定字段或者表達式的值。

having:用於對where和group by查詢出來的分組經行過濾,查出滿足條件的分組結果。它是一個過濾聲明,是在查詢返回結果集以後對查詢結果進行的過濾操作。

執行順序
select –>where –> group by–> having–>order by


<!-- 9.update更新 -->
update table_name set filed1=new-value1, field2=new-value2
[where clause]
PHP 中使用函數 mysqli_query() 來執行 SQL 語句,你可以在 SQL UPDATE 語句中使用或者不使用 WHERE 子句。

<!-- 10. delete語句 -->
delete from table_name [where class_uses]
PHP使用 mysqli_query() 函數來執行SQL語句, 你可以在 SQL DELETE 命令中使用或不使用 WHERE 子句。

<!-- 11. like語句 -->
MySQL可以通過 LIKE ...% 來進行模糊匹配
select filed1,filed2,....filedn
from table_name
where file1 like condition [and [or]] filed2 = 'somevalue'

<!-- 12. union語句 -->
select expression1,expression2,.....expression_n
from tables
[where conditions]
union [all | distinct]
select expression1,expression2,.....expression_n
from tables
[where conditions];
UNION 語句:用於將不同表中相同列中查詢的數據展示出來;(不包括重複數據)
UNION ALL 語句:用於將不同表中相同列中查詢的數據展示出來;(包括重複數據)

<!-- 13. 排序 -->
如果我們需要對讀取的數據進行排序,我們就可以使用 MySQL 的 ORDER BY (order by)子句來設定你想按哪個字段哪種方式來進行排序,再返回搜索結果。

select file1,file2,....filen from table_name1,table_name2...
order by file1[asc [desc][默認asc]],[field2] [asc [desc][默認asc]]
使用 ASC 或 DESC 關鍵字來設置查詢結果是按升序或降序排列


<!-- 14.分組  -->
GROUP BY (group by)語句根據一個或多個列對結果集進行分組。
在分組的列上我們可以使用 COUNT, SUM, AVG,等函數。(count sum avg)

select column_name,function(column_name)
from table_name
where column_name operator value1
group by column_name;

with rollup 可以實現在分組統計數據基礎上再進行相同的統計(sum,avg,count…)

使用 coalesce 來設置一個可以取代 NUll 的名稱,coalesce 語法:
select coalesce(a,b,c);
參數說明:如果a==null,則選擇b;如果b==null,則選擇c;如果a!=null,則選擇a;如果a b c 都爲null ,則返回爲null(沒意義)。


<!-- 15.連接的使用  -->
inner join(內連接,或者等值連接):獲取兩個表中字段匹配關係的記錄
		可簡寫爲join(on)
left join(左連接):獲取左表所有記錄,即使右表沒有對應匹配的記錄
right join(右連接):獲取右表所有記錄,即使左表沒有對應匹配的記錄

PHP 中使用 mysqli_query() 函數來執行 SQL 語句,你可以使用以上的相同的 SQL 語句作爲 mysqli_query() 函數的參數


<!-- 16.null值處理  -->
is null:當前的值是null,此運算符返回true
is not null:當前的值不爲null,此運算符返回true
<=>:比較操作符(不同於=運算符)當比較的兩個值相等或者都爲null時返回true 

PHP 腳本中你可以在 if...else 語句來處理變量是否爲空,並生成相應的條件語句


<!-- 17.正則表達式  -->
 MySQL中使用 REGEXP(regexp)操作符來進行正則表達式匹配。
 
^		    匹配輸入字符串的開始位置。如果設置了 RegExp 對象的 Multiline 屬性,^也匹配 '\n' 
            或 '\r' 之後的位置。

$		    匹配輸入字符串的結束位置。如果設置了RegExp 對象的 Multiline 屬性,$ 也匹配 '\n' 
            或 '\r' 之前的位置。

.		   匹配除 "\n" 之外的任何單個字符。要匹配包括 '\n' 在內的任何字符,請使用象 '[	 
           .\n]' 的模式。

[...]	   字符集合。匹配所包含的任意一個字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。

[^...]	   負值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain"中的'p'。

p1|p2|p3   匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)o				            
           od' 則匹配 "zood" 或 "food"。

*		   匹配前面的子表達式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 				等 
           價於{0,}。

+			匹配前面的子表達式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo"	,但不能匹配 
            "z"。+ 等價於 {1,}。

{n}			n 是一個非負整數。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中				 
            的 'o',但是能匹配 "food" 中的兩個 o。

{n,m}		m 和 n 均爲非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。



<!-- 18.事務  -->
在 MySQL 命令行的默認設置下,事務都是自動提交的,即執行 SQL 語句後就會馬上執行 COMMIT (commit)操作。因此要顯式地開啓一個事務,務須使用命令 BEGIN(begin) 或 START TRANSACTION(start transaction),或者執行命令 SET AUTOCOMMIT=0,(set autocommit)用來禁止使用當前會話的自動提交。

begin或start transaction顯示地開啓以惡事務

COMMIT(commit) 也可以使用 COMMIT WORK(commit work),不過二者是等價的。COMMIT 會提交事務,並使已對數據庫進行的所有修改成爲永久性的;

ROLLBACK (rollback)也可以使用 ROLLBACK WORK(rollback work ),不過二者是等價的。回滾會結束用戶的事務,並撤銷正在進行的所有未提交的修改;

SAVEPOINT identifier(savepoint identifier),SAVEPOINT 允許在事務中創建一個保存點,一個事務中可以有多個 SAVEPOINT;

RELEASE SAVEPOINT identifier(release savepoint identifier) 刪除一個事務的保存點,當沒有指定的保存點時,執行該語句會拋出一個異常;

ROLLBACK TO identifier (rollback to identifier)把事務回滾到標記點;

SET TRANSACTION (set transaction)用來設置事務的隔離級別。

InnoDB(innodb) 存儲引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。
(read uncommitted,read committed,repeatale read和 serializable )



MYSQL 事務處理主要有兩種方法:(刪除人員信息)
1、用 BEGIN, ROLLBACK, COMMIT來實現(begin,rollback,commit )

BEGIN 開始一個事務(begin )
ROLLBACK 事務回滾(rollback )
COMMIT 事務確認(commit )
2、直接用 SET 來改變 MySQL 的自動提交模式:

SET AUTOCOMMIT=0 禁止自動提交(set autoccmmit)
SET AUTOCOMMIT=1 開啓自動提交(set autocommit )



<!-- 19. alter命令  -->
如果你需要指定新增字段的位置,可以使用MySQL提供的關鍵字 FIRST (first 設定位第一列), AFTER 字段名(after 設定位於某個字段之後)。

如果需要修改字段類型及名稱, 你可以在ALTER命令中使用 MODIFY(modify 修改) 或 CHANGE (change )子句 。

如果需要修改數據表的名稱,可以在 ALTER TABLE (alter table)語句中使用 RENAME (rename to)子句來實現。



<!-- 20. 索引  -->(字典)
如果是CHAR,VARCHAR類型,length可以小於字段實際長度;如果是BLOB和TEXT類型,必須指定 length。
CREATE INDEX indexName ON mytable(username(length)); 

ALTER table tableName ADD INDEX indexName(columnName)

DROP INDEX [indexName] ON mytable; 

唯一索引
CREATE UNIQUE INDEX indexName ON mytable(username(length)) 
ALTER table mytable ADD UNIQUE [indexName] (username(length))
UNIQUE [indexName] (username(length))  


有四種方式來添加數據表的索引:
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 該語句添加一個主鍵,這意味着索引值必須是唯一的,且不能爲NULL。
alter table tb1_name add primary  key (column_list)

ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條語句創建索引的值必須是唯一的(除了NULL外,NULL可能會出現多次)。
alter table tb1_name add unique index_name (column_list)

ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出現多次。
alter table tb1_name add index index_name (column_list)

ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):該語句指定了索引爲 FULLTEXT ,用於全文索引。
alter table tb1_name add fulltext index_name (column_list)

可以使用 SHOW INDEX 命令來列出表中的相關的索引信息。可以通過添加 \G 來格式化輸出信息。


<!-- 21. 臨時表  -->
MySQL臨時表只在當前連接可見,如果你使用PHP腳本來創建MySQL臨時表,那每當PHP腳本執行完成後,該臨時表也會自動銷燬。
TEMPORARY(tmporary )

用查詢直接創建臨時表的方式:
CREATE TEMPORARY TABLE 臨時表名 AS
(
    SELECT *  FROM 舊的表名
    LIMIT 0,10000
);



<!-- 22. 複製表 -->
獲取數據表的完整結構。
修改SQL語句的數據表名,並執行SQL語句。
執行完第二步驟後,你將在數據庫中創建新的克隆表 clone_tbl。 如果你想拷貝數據表的數據你可以使用 INSERT INTO... SELECT 語句來實現。

來給大家區分下mysql複製表的兩種方式。

第一、只複製表結構到新表

create table 新表 select * from 舊錶 where 1=2

或者

create table 新表 like 舊錶 

第二、複製表結構及數據到新表

create table新表 select * from 舊錶 



<!-- 23. 元數據 -->
查詢結果信息: SELECT, UPDATE 或 DELETE語句影響的記錄數。
數據庫和數據表的信息: 包含了數據庫及數據表的結構信息。
MySQL服務器信息: 包含了數據庫服務器的當前狀態,版本號等。

在 DBI 腳本中, 語句影響的記錄數通過函數 do( ) 或 execute( )返回:

在PHP中,你可以使用 mysqli_affected_rows( ) 函數來獲取查詢語句影響的記錄數。

可以使用 SHOW TABLES(show tables ) 或 SHOW DATABASES(show database) 語句來獲取數據庫和數據表列表。

獲取服務器元數據
SELECT VERSION( )	服務器版本信息
SELECT DATABASE( )	當前數據庫名 (或者返回空)
SELECT USER( )		當前用戶名
SHOW STATUS			服務器狀態
SHOW VARIABLES		服務器配置變量

<!-- 24. 序列使用 -->
MySQL 中最簡單使用序列的方法就是使用 MySQL AUTO_INCREMENT (aoto_increment)來定義列。

在MySQL的客戶端中你可以使用 SQL中的LAST_INSERT_ID( ) (last_insert_id)函數來獲取最後的插入表中的自增列的值。



<!-- 25. 處理重複數據 -->
防止表中出現重複數據
你可以在 MySQL 數據表中設置指定的字段爲 PRIMARY KEY(主鍵) 或者 UNIQUE(唯一) 索引來保證數據的唯一性。
如果你想設置表中字段 first_name,last_name 數據不能重複,你可以設置雙主鍵模式來設置數據的唯一性
INSERT IGNORE INTO(insert ignore into) 與 INSERT INTO(insert into)的區別就是 INSERT IGNORE 會忽略數據庫中已經存在的數據,如果數據庫沒有數據,就插入新的數據,如果有數據的話就跳過這條數據。這樣就可以保留數據庫中已經存在數據,達到在間隙中插入數據的目的。而 REPLACE INTO 如果存在 primary 或 unique 相同的記錄,則先刪除掉。再插入新記錄。
另一種設置數據的唯一性方法是添加一個 UNIQUE 索引

統計重複數據
確定哪一列包含的值可能會重複。
在列選擇列表使用COUNT(*)列出的那些列。(count)
在GROUP BY子句中列出的列。(group by)
HAVING子句設置重複數大於1。(having 通常與GROUP BY語句聯合使用,來過濾由GROUP BY語句返回的記錄集)

過濾重複數據
如果你需要讀取不重複的數據可以在 SELECT 語句中使用 DISTINCT 關鍵字來過濾重複數據。(distinct 獨特的有區別的)
你也可以使用 GROUP BY 來讀取數據表中不重複的數據:(group by)

刪除重複數據
mysql> CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl  GROUP BY (last_name, first_name, sex);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;
當然你也可以在數據表中添加 INDEX(索引) 和 PRIMAY KEY(主鍵)這種簡單的方法來刪除表中的重複記錄。

select 列名1,count(1) as count 
from 表名
group by  列名1
having count>1  and 其他條件

select 列名1,列名2,count(1) as count 
from 表名
group by  列名1,列名2 
having count>1  and 其他條件


<!-- 26. mysql及sql注入 -->
防止SQL注入,我們需要注意以下幾個要點:
1.永遠不要信任用戶的輸入。對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和 雙"-"進行轉換等。
2.永遠不要使用動態拼裝sql,可以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。
3.永遠不要使用管理員權限的數據庫連接,爲每個應用使用單獨的權限有限的數據庫連接。
4.不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。
5.應用的異常信息應該給出儘可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝
6.sql注入的檢測方法一般採取輔助軟件或網站平臺來檢測,軟件一般採用sql注入檢測工具jsky,網站平臺就有億思網站安全平臺檢測工具。MDCSOFT SCAN等。採用MDCSOFT-IPS可以有效的防禦SQL注入,XSS攻擊等。

PHP的MySQL擴展提供了mysqli_real_escape_string()函數來轉義特殊的輸入字符。


like查詢時,如果用戶輸入的值有"_"和"%",則會出現這種情況:用戶本來只是想查詢"abcd_",查詢結果中卻有"abcd_"、"abcde"、"abcdf"等等;用戶要查詢"30%"(注:百分之三十)時也會出現問題。
在PHP腳本中我們可以使用addcslashes()函數來處理以上情況


addcslashes() 函數在指定的字符前添加反斜槓。
addcslashes(string,characters)
string	必需。規定要檢查的字符串。
characters	可選。規定受 addcslashes() 影響的字符或字符範圍。



<!-- 27. 導出數據 -->
MySQL中你可以使用SELECT...INTO OUTFILE語句來簡單的導出數據到文本文件上。(select......into outfile)

SELECT ... INTO OUTFILE 語句有以下屬性:
LOAD DATA INFILE是SELECT ... INTO OUTFILE(load data infile是select.....into outfile)的逆操作,SELECT句法。
爲了將一個數據庫的數據寫入一個文件,使用SELECT ... INTO OUTFILE,爲了將文件讀回數據庫,使用LOAD DATA INFILE。
SELECT...INTO OUTFILE 'file_name'形式的SELECT可以把被選擇的行寫入一個文件中。該文件被創建到服務器主機上,因此您必須擁有FILE權限,才能使用此語法。
輸出不能是一個已存在的文件。防止文件數據被篡改。
你需要有一個登陸服務器的賬號來檢索文件。否則 SELECT ... INTO OUTFILE 不會起任何作用。
在UNIX中,該文件被創建後是可讀的,權限由MySQL服務器所擁有。這意味着,雖然你就可以讀取該文件,但可能無法將其刪除

導出表作爲原始數據
mysqldump 是 mysql 用於轉存儲數據庫的實用程序。它主要產生一個 SQL 腳本,其中包含從頭重新創建數據庫所必需的命令 CREATE TABLE INSERT 等。
使用 mysqldump 導出數據需要使用 --tab 選項來指定導出文件指定的目錄,該目標必須是可寫的。

導出 SQL 格式的數據
導出 SQL 格式的數據到指定文件,如下所示:
$ mysqldump -u root -p RUNOOB runoob_tbl > dump.txt
password ******


<!-- 28. 導入數據 -->
1、mysql 命令導入
mysql -u用戶名    -p密碼    <  要導入的數據庫數據(runoob.sql)

2、source 命令導入
 source /home/abc/abc.sql  # 導入備份數據庫
 
3、使用 LOAD DATA 導入數據(load data)
mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;

4、使用 mysqlimport 導入數據
mysqlimport 客戶端提供了 LOAD DATA INFILEQL 語句的一個命令行接口(load data infileql )
$ mysqlimport -u root -p --local mytbl dump.txt
password *****

<!-- 29. 函數 -->


<!-- 30. 運輸符 -->
算術運算符
比較運算符
邏輯運算符
位運算符


?>








 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章