天天看點

php從零開始——學習筆記(四)mysql快速入門在PHP中使用mysql與mysqli互動知識補充

本文目錄

  • mysql快速入門
    • 資料庫基本概念
    • MySQL支援的資料類型
    • MySQL使用入門
      • SQL分類
        • DDL語句
        • DML語句
    • MySQL中的常用函數
    • 知識補充:資料庫字元編碼
      • 一、MySQL支援的字元集
      • 二、MySQL内部的字元集和校對規則設定
  • 在PHP中使用mysql與mysqli互動
    • 一、使用mysqli
    • 二、執行SQL語句
  • 知識補充

mysql快速入門

資料庫基本概念

之前了解過一點點資料庫的概念,是以到這裡學習這一小節會比較輕松。

一、資料庫的基本概念

​ 資料庫:資訊存儲的倉庫,包括一系列的關系措施

​ 表:一個資料庫中可以有若幹張表(形勢上你可以看出我們日常生活中建立的表)

​ 字段:表裡面的資訊會分成若幹個欄目來存,這些欄目在資料庫技術中的名稱叫做“字段”,欄目裡面存的具體資訊叫字段值

​ 記錄:一條資訊叫做一條記錄

一個資料庫管理系統中可以建立若幹個資料庫,每個資料庫中又可以建立若幹張表,每張表中可以有若幹條記錄。

MySQL支援的資料類型

為了對不同性質的資料進行區分,以提高資料查詢和操作的效率,資料庫系統将可以存入的資料分為多種類型。MySQL資料庫中的資料類型分為三大類:數值類型、日期類型、字元串類型。

1.數值類型

在整數類型中,按照取值範圍和存儲方式不同,分為tinyint、smallint、mediumint、int和bigint這5個類型。

2.日期類型

日期和時間類型

date、datetime、timestamp、time、year。

datetime是常用的日期類型。如:

create table j4y(dt datetime);
insert into j4y values(now());
           

3.字元串類型

字元串類型 描述

CHAR(M) M為0~255之間的整數,表示可以存M個字元

VARCHAR(M) M為0~65535之間的整數,表示可以存M個字元

TINYTEXT 允許長度0~255字元

TEXT 允許長度0~65535字元

MEDIUMTEXT 允許長度0~167772150字元

LONGTEXT 允許長度0~42949667295字元

BINARY(M) 允許長度0~M個位元組的定長位元組字元串(類似于CHAR類型,但儲存二進制位元組字元串而不是非二進制字元串)

VARBINARY(M) 允許長度0~M個位元組的變長位元組字元串類型類似于VARCHAR類型,但儲存二進制位元組字 符串而不是非二進制字元串。

TINYBLOB 允許長度0~255位元組的BLOB列(儲存二進制位元組字元串)

BLOB 允許長度0~65535位元組的BLOB列(儲存二進制位元組字元串)

MEDIUMBLOB 允許長度0~167772150位元組的BLOB列(儲存二進制位元組字元串)

LONGBLOB允許長度0~4294967295位元組的BLOB列(儲存二進制位元組字元串)

ENUM 枚舉類型

SET SET類型

字元串類型詳細說明:

1)char和varchar類型

​ char與varchar很類似,都用來儲存MySQL中較短字元串。

​ 差別:char列的長度固定位建立表時聲明的長度,長度可以為0~255的任何值;

​ varchar列中的值為可變長字元串,長度可以指定為065535(MySQL5.0.3版本以前為0255)之間的值。

​ 在檢索時,char列删除尾部的空格,而varchar則保留這些空格。

​ create table j4y(v varchar(4),c char(4));

​ insert into j4y values('ab ','ab ');

​ select length(v),length© from t1;

​ select concat(v,’+’),concat(c,’+’) from vc;

​ 選擇:由于char是固定長度,是以它的處理速度比varchar快,但是缺點是浪費存儲空間。是以對于那些長度變化不大的資料可以選擇此列

2)text類型

​ 儲存少量字元串的時候,我們會選擇char或者varchar,儲存大文本的時候通常會選擇使用text。

3)blob類型

​ blob類型也是用來儲存比較大量的字元串的名單是blob類型是用來儲存二進制資料的比如照片。

2)ENUM類型

​ 枚舉類型,它的值範圍需要在建立表時通過枚舉方式顯式指定,對1255個成員的枚舉需要1個位元組存儲;對于25565535個成員,需要2個

​ 位元組存儲。最多有65535個成員。

​ create table j4y(flag enum(‘a’,‘b’,‘c’,‘d’));

​ insert into j4y values(‘a’),(‘a’),(‘f’);

​ 往enum類型裡存儲資料是忽略大小寫的,對于插入不在enum指定範圍内的值時,并沒有傳回警告,而是插入了enum的第一個值。

​ 另外enum類型隻允許從值集合中選取單個值,而不能一次取多個值

3)SET類型

​ set和enum類型非常類似,也是一個字元串對象,裡面可以包含0~64個成員。根據成員的不同,存儲上也有所不同。

​ 1~8成員的集合,占1個位元組

​ 9~16成員的集合,占2個位元組

​ 17~24成員的集合,占3個位元組

​ 25~32成員的集合,占4個位元組

​ 33~64成員的集合,占8個位元組

​ create table t1(flag set(‘a’,‘b’,‘c’,‘d’));

​ insert into t1 values(‘a,b’),(‘a,d,a’);

​ SET類型可以從允許值集合中選擇任意1個或多元素進行組合,是以對于輸出的值隻要在允許的組合範圍内,都可以正确地注入到set類型的

​ 列中。

​ 對于超出允許值範圍的值,将不允許注入,對于包含重複的成員的集合将隻取一次進行注入。

​ 使用FIND_IN_SET函數對set類型的資料進行查詢是比較好的選擇!

MySQL使用入門

SQL分類

DDL語句

操作之前首先登入mysql。

mysql -u 使用者名 -p

回車然後輸入密碼登入。(有密碼輸密碼,無密碼直接回車)

1)DDL(Data Definition Languages)語句

​ 資料定義語句,通過這類語言可以對資料庫進行建立删除更改。

登入mysql,對資料庫進行操作。

1>

show databases;

檢視所有資料庫

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| challenges         |
| dvwa               |
| mysql              |
| performance_schema |
| security           |
| test               |
+--------------------+
           

2>

create database 資料庫名;

建立一個資料庫(資料庫名自定義)

mysql> create database lxj;
Query OK, 1 row affected (0.00 sec)
           

3>

drop database 資料庫名;

删除資料庫

4>建立表、字段。删除表、字段。等等這些基本操作就不在叙述,之前總結過了。隻添加一些補充内容。

5>檢視表:

desc 表名

mysql> desc j4y;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id1   | int(11) | YES  |     | NULL    |       |
| id2   | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
           

第二種方式:

show create table 表名 \G

最後無分号。

mysql> show create table j4y \G
*************************** 1. row ***************************
       Table: j4y
Create Table: CREATE TABLE `j4y` (
  `id1` int(11) DEFAULT NULL,
  `id2` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
           

說明:

\G

選項使得記錄能夠按照字段豎向排列,以便更好地顯示内容較長的記錄。

6> 修改表

1)修改表的字段類型

alter table 表名 modify [column] 字段定義 [first|after 字段名];
           

舉個栗子

2)增加表字段

alter table 表名 add [column] 字段定義 [first|after 字段名];
           

3)删除表字段

alter table 表名 drop [column] 字段名;
           

4)字段改名

alter table 表名 change [column] 舊的字段名 新字段定義 [first|after 字段名];
           

舉個例子:

mysql> alter table j4y add column id3 int;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table j4y change column id2 Augenstern int;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc j4y;
+------------+------------+------+-----+---------+-------+
| Field      | Type       | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| id1        | tinyint(4) | YES  |     | NULL    |       |
| Augenstern | int(11)    | YES  |     | NULL    |       |
| id3        | int(11)    | YES  |     | NULL    |       |
+------------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
           
  1. 修改字段排列順序
alter table j4y modify id1 tinyint first;//移動到第一位
alter table j4y modify id3 int after id1;//移動到指定位置後面
           

6)更改表名

alter table 表名 rename [to] 新的表名;
           

DML語句

DML操作是指對資料庫中表記錄的操作,主要包括表記錄的插入、更新、删除、和查詢。

  1. 插入記錄
insert into 表名(字段1,字段2,字段3,....,字段n) values(相對應的内容)
           

栗子:

mysql> insert into admin(id,lxj,j4y) values(01,456,789);
Query OK, 1 row affected (0.00 sec)

mysql> select * from admin;
+------+------+------+
| id   | lxj  | j4y  |
+------+------+------+
|    1 |  456 |  789 |
+------+------+------+
1 row in set (0.00 sec)
           

字段名可不寫。

一次性插入多條記錄,:

mysql> insert into admin(id,lxj,j4y) values
    -> (2,564,446),
    -> (3,580,541),
    -> (4,965,315);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from admin;
+------+------+------+
| id   | lxj  | j4y  |
+------+------+------+
|    1 |  456 |  789 |
|    2 |  564 |  446 |
|    3 |  580 |  541 |
|    4 |  965 |  315 |
+------+------+------+
4 rows in set (0.00 sec)
           
  1. 更新記錄

更新一個表

update 表名 set 字段1=值1,字段2=值2,....,字段n=值n where [限制條件];
           

更新多個表

update 表1,表2,...表n set 表1.字段1=表達式1,表n.字段n=表達式n [where 條件];
           
  1. 删除記錄

删除一個表中的資料

delete from 表名 [where 條件];
           

輸出多個表中的資料

delete 表1,表2,...表n from 表1,表2,...表n [where 條件];
           
  1. 查詢記錄

一、查詢不重複的記錄

SELECT distinct field1,field2 FROM 表名;

隻要field1,field2任何一個字段有不同就會被選擇!

一般使用distinct,隻篩選一個字段!

二、

=,<,>,>=,<=,!=等比較運算符
多個條件之間可以使用or and等
where 後面接條件
select * from 表名 where 條件
           

三、排序

asc:由低到高,也是預設值

select * from 表名 order by 字段名 asc;
           

如:

mysql> select * from admin order by id asc;
+------+------+------+
| id   | lxj  | j4y  |
+------+------+------+
|    1 |  456 |  789 |
|    2 |  564 |  446 |
|    3 |  580 |  541 |
|    4 |  965 |  315 |
+------+------+------+
4 rows in set (0.00 sec)
           

desc:由高到底

select * from 表名 order by 字段名 desc;
           

多個字段排序

select * from 表名 order by 字段名1 desc,字段名2 desc;
           

四、聚合

①sum求和

select sum(字段名) from 表名;

②count記錄總數

select count(*|字段名) from 表名;

③max最大值

select max(字段名) from 表名;

④min最小值

select min(字段名) from 表名;

⑤GROUP BY分類聚合

select department,sum(salary) from employee group by department;

⑥WITH ROLLUP分類聚合後的結果進行再彙總

select sum(salary) from employee group by department with rollup;

⑦HAVING

注意:having和where的差別在于,having是對聚合後的結果進行條件過濾,而where是在聚合前就對記錄進行過濾 ,應該盡可能的對記錄進行先過濾!

select sum(salary) from employee group by department having sum(salary)>1000;

在一起使用:

select sum(id),max(id),min(id),count(*) from a1;

五、表連接配接

需求:顯示多個表中的字段的時候即可使用表連接配接

連接配接分類

内連接配接:選取兩張表中互相比對的記錄

select 表.字段,.... from 表1名,表2名,... where [比對的條件比如 表1.字段=表2.字段];

外連接配接:不僅僅選取兩張互相比對的記錄,并且會選出其他不比對的記錄

  • 左連接配接

概念:包含左邊表中的所有記錄(包括右表中沒有和它比對的記錄)

  • 右連接配接

概念:包含右邊表中的所有記錄(包括左表中沒有和它比對的記錄)

左連接配接和右連接配接是可以互相轉換的!

六、子查詢

需求:一個查詢需要另外一個查詢的結果參與的時候

用于子查詢的關鍵字:

①:in

使用文法:

select * from 表名1 where id in(select 字段名 from 表名2);
           

in 在…裡面

注意點 in後面的子語句必須隻傳回一個字段

若查詢結果唯一(隻有一條)可以使用=代替in

②:not in

與in相反

③:exists

使用文法:

select語句 where exists(select 語句);
           

exists:後面那個子語句有沒有查詢出記錄來,如果查詢出記錄來傳回true,否則就是false,并且查詢出來的記錄的具體的值是NULL也是沒有關系,也是傳回true.

④:not exists

與exists相反

select * from 表名1 where 表名2 in(select 表名2 from 字段名);
           

若查詢結果唯一可以使用=代替in

select * from 表明1 where 表名2=(select 表名2 from 字段名 limit 1);
           

七、記錄聯合

我們常常會碰到需要将兩個表或者多個表的資料按照一定的查詢條件查詢出來後,将結果合并到一起顯示這是就需要用到記錄聯合

多個select 語句用

UNION或者UNION ALL隔開即可實作

差別: 前者 會将多個查詢結果合并後并且進行去除重複後傳回

後者 則直接合并并不去除重複

聯合的條件:查詢的列個數要相等

MySQL中的常用函數

  1. 字元串函數
CONCAT(S1,S2,...Sn)	連接配接S1,S2,...Sn為一個字元串
	  INSERT(str,x,y,instr)	将字元串str從第x位置開始,y個字元長的字元串換位字元串instr
	  LOWER(str)			将字元串str中所有字元變為小寫
	  UPPER(str)			将字元串str中所有字元變為大寫
	  LEFT(str,x)			傳回字元串str最右邊的x個字元
	  RIGHT(str,x)			傳回字元串str最右邊的x個字元
	  LPAD(str,n,pad)		用字元串pad對str最左邊進行填充,直到長度為n個字元長度
	  RPAD(str,n,pad)		用字元串pad對str最右邊進行填充,直到長度為n個字元長度
	  LTRIM(str)			去掉字元串str左側的空格
	  RTRIM(str)			去掉字元串str行尾的空格
	  REPEAT(str,x)			傳回str重複x次的結果
	  REPLACE(str,a,b)		用字元串b替換字元串str中所有出現的字元串a
	  STRCMP(s1,s2)			比較字元串s1和s2
	  TRIM(str)				去掉字元串行尾和行頭的空格
	  SUBSTRING(str,x,y)	傳回從字元串str x位置起y個字元長度的字元串
	  LENGTH(str)			傳回字元串長度
           
  1. 數值函數
ABS(x)				傳回x的絕對值
	  CEIL(x)				傳回大于x的最小整數值
	  FLOOR(x)				傳回小于x的最大整數值
	  MOD(x,y)				傳回x/y的模
	  RAND()				傳回0-1内的随機值
	  ROUND(x,y)			傳回參數x的四舍五入的有y位小數的值
	  TRUNCATE(x,y)			傳回數字x截斷為y位小數的結果
           
  1. 日期和時間函數
CURDATE()		傳回目前日期
	  CURTIME()		傳回目前時間
	  NOW()			傳回目前的日期和時間
	  UNIX_TIMESTAMP(date)	傳回日期date的UNIX時間戳
	  FROM_UNIXTIME()		傳回UNIX時間戳的日期值
	  WEEK(date)		傳回日期date為一年中的第幾周
	  YEAR(date)		傳回日期date的年份
	  HOUR(time)		傳回time的小時值
	  MINUTE(time)		傳回time的分鐘值
	  MONTHNAME(date)		傳回date的月份名
	  DATE_FORMAT(date,fmt)	傳回按字元串fmt格式化日期date值
	  DATE_ADD(add,INTERVAL expr type) 傳回一個日期或時間值加上一個時間間隔的時間值
	  DATEDIFF(expr,expr2)	傳回起始時間expr和結束時間expr2之間的天數
           
  1. 流程函數
1)IF(value,t,f)		如果value是真,傳回t,否則傳回f
			select if(field1>1000,'滿分','零蛋');
		2)IFNULL(value1,value2)	如果value1不為null,傳回value1,否則value1該是什麼還是什麼
			select ifnull(name,'假名');
		3)CASE WHEN [value1] THEN [result1]...ELSE[default]END	如果value1是真,傳回result1,否則傳回default
			select case when 100>10 then '真' else '假' end;
			和if語句比較像
		4)CASE [expr] WHEN [value1] THEN[result1]...ELSE[default]END  如果expr等于value1,傳回result1,否則傳回default
			select case 1 when 1 then '一' when 2 then '二' when 3 then '三' else '未知數字'end;
			和switch語句比較像
           
  1. 其他常用函數
DATABASE()		傳回目前資料庫名
		VERSION()		傳回目前資料庫版本
		USER()			傳回目前登入使用者名
		INET_ATON(IP)	傳回IP位址的數字表示
		INET_NTOA(num)	傳回數字代表的IP位址
		PASSWORD(str)	傳回字元串str的加密版本
		MD5()			傳回字元串str的MD5值
           

知識補充:資料庫字元編碼

一、MySQL支援的字元集

1.檢視所有可用的字元集

show character set;
		或者檢視information_schema.character_sets,也可以顯示所有的字元集和該字元集預設的校隊規則
           

2.MySQL的字元集包括字元集(character)和校對規則(collation)兩個概念。

1)字元集用來定義MySQL存儲字元串的方式
		2)校對規則用來定義 字元串比較的方式
		3)字元集和校對規則是一對多的關系,一個字元集有多個校對規則供你選擇!
		  校對規則命名約定:它們以相關的字元集名開始,通常包括一個語言名,并且以
		  _ci(忽略大小寫)、
		  _cs(大小寫敏感)或者
		  _bin(二進制,即比較是基于字元編碼的值而與language無關)結束。
		檢視字元集的校對規則:
			show  collation like '字元集字首%';
           

二、MySQL内部的字元集和校對規則設定

  1. 資料庫字元集和校對規則設定
CREATE DATABASE db_name
		[[DEFAULT] CHARACTER SET charset_name]
		[[DEFAULT] COLLATE collation_name]
		檢視目前資料庫的字元集和校對規則:
			show variables like 'character_set_database';
			show variables like 'collation_database';
		ALTER DATABASE db_name
		[[DEFAULT] CHARACTER SET charset_name]
		[[DEFAULT] COLLATE collation_name]
           
  1. 表字元集和校對規則設定
CREATE TABLE tbl_name (column_list)
		[DEFAULT CHARACTER SET charset_name [COLLATE collation_name]]
 
		ALTER TABLE tbl_name
		[DEFAULT CHARACTER SET charset_name] [COLLATE collation_name]
           

連接配接字元集設定:用戶端和伺服器之間互動的字元集

在PHP中使用mysql與mysqli互動

一、使用mysqli

在PHP中可以使用mysqli擴充與mysql資料庫進行資訊交流,i表示改進,增強,它執行速度更快,是一種面向對象的技術。

  1. 建立、關閉與MySQL伺服器的連接配接

    ①:連接配接指定的MySQL伺服器

$mysql_[email protected]_connect($host,$user,$password,$database,$port);
           

預設端口3306,可不填。

②:連接配接錯誤時提示

③:設定預設字元編碼

④:選擇特定的資料庫

⑤:關閉與mysql伺服器的連接配接

下面一個栗子:

<?php
header('Content-type:text/html;charset=utf-8');
$link=@mysqli_connect('localhost','root','root','','3306');
if (mysqli_connect_errno()){
    exit(mysqli_connect_errno());
}
mysqli_set_charset($link,'utf-8');//設定預設字元編碼
mysqli_select_db($link,'test');//選擇特定的資料庫
mysqli_close($link);//關閉與mysql伺服器的連接配接
?>
           

跑一下,如果沒有報錯,就是連接配接成功了。

二、執行SQL語句

  1. 對資料庫執行一條SQL語句

①對于insert,update,delete等不會傳回資料的SQL語句,在執行沒有錯誤時将傳回true。

②對于傳回資料的SQL語句執行成功的時候會傳回結果集對象可以使用操作結果集對象的函數來從中擷取資料

  1. 操作結果集對象的函數

    從結果集對象中解析資料的常見函數

    ①以索引數組的方式擷取一條記錄的資料

    mixed mysqli_fetch_row ( mysqli_result $result );

    重複使用以擷取下一條記錄的資料

    ②以關聯數組的方式擷取一條記錄的資料

    array mysqli_fetch_assoc ( mysqli_result $result );

    重複使用以擷取下一條記錄的資料

    ③以索引數組或關聯數組的方式擷取一條記錄的資料

    mixed mysqli_fetch_array ( mysqli_result $result [, int $resulttype = MYSQLI_BOTH ] );

    重複使用以擷取下一條記錄的資料

    ④以索引數組或關聯數組的方式擷取全部記錄的資料

    mixed mysqli_fetch_all ( mysqli_result $result [, int $resulttype = MYSQLI_NUM ] );

    ⑤傳回結果集中的下一個字段資訊

    object mysqli_fetch_field ( mysqli_result $result );

    ⑥傳回一個代表結果集字段的對象數組

    array mysqli_fetch_fields ( mysqli_result $result );

    ⑦擷取結果中行的數量

    int mysqli_num_rows ( mysqli_result $result );

    注意:如果使用MYSQLI_USE_RESULT模式則必須在擷取完結果集才可使用該函數。
  2. 釋放與一個結果集相關的記憶體

    傳回的結果集在資料量很大的時候需要很多的記憶體支援,是以在操作完結果集的時候有必要立刻釋放與一個結果集相關的内

    存, 釋放之後,結果集就不可用了

    void mysqli_free_result ( mysqli_result $result );

知識補充

  1. include語句
<?php
header('Content-type:text/html;charset=utf-8');
echo dirname(__FILE__).'/login.php';
include 'login.php';//include後面接上一個空格然後接上一個字元串,字元串裡面是要包含進來并執行的一個php檔案的路徑
?>
           

這個就好像是C++中分開寫代碼那樣(跟繼承差不多),可以用

#include "xxxx.h"

來使用這個類。相當于原本一個代碼将它拆分成兩個,邏輯更加清晰。(實際上還是一個代碼。)

  1. include_once語句

    如果檔案被包含,則不會再次包含,可以用在腳本執行期間同一個檔案有可能被包含超過一次的情況下,想確定檔案隻被包含一次以避免函數重定義,變量指派等問題。

  2. require語句

    和include語句差不多,處理失敗的方式不同,include是出錯了還會接着執行,但是require語句是出錯了就會停止執行。

  3. require_once語句

    與require語句基本相同,唯一差別就是php會檢查這個檔案是否已經被包含過了,如果包含過,那麼就不會再次包含。

終于到此結束,但是感覺這是邊學邊忘,這樣肯定不行,接下來找時間學習開發小論壇,最起碼不能學了跟沒有學一樣吧,如果這樣就是在浪費時間。

文末寄語:

一個遠行的人要尋找什麼呢?可能他自己也不知道,他隻是尋找,張望,直到最後,尋找成了他的命運。就像我在你身上,尋找我的命運,那不能把握沒法參透的一部分,就是我們的真愛。 —— 田藝苗《旅人》