python多執行緒——如何停止一個死迴圈的執行緒
阿新 • • 發佈:2020-11-24
資料庫基本操作
連線伺服器
-
瀏覽器鍵入
http://localhost/phpmyadmin/index.php
-
客戶端
MySQL Workbench
-
命令列接入
- XAMPP中
Shell面板
- 命令列名詞
host
-h 主機port
-p 埠號user
-u 使用者名稱password
-p 密碼
- 連線資料庫
mysql -h127.0.0.1 -P3306 -uroot -proot
明文mysql -uroot -proot
明文 (本地資料庫 埠號3306)mysql -uroot -p
密文
- 退出登入
exit
quit
\q
- XAMPP中
資料庫基本概念
資料庫 表相關
-
資料庫:資料庫中存放的是表,一個數據庫中可以存放多個表
-
表:表是用來存放資料的
-
關係:兩個表的公共欄位
-
行:也稱記錄,也稱實體
-
列:也稱欄位,也稱屬性
-
理解
- 就表結構而言,表分為行和列
- 就表資料而言,表分為記錄和欄位
- 就面向物件而言,一個記錄就是一個實體,一個欄位就是一個屬性
資料相關
-
資料冗餘:相同的資料儲存在不同的地方
- 冗餘只能減少,不能杜絕
- 減少冗餘的方法是分表
-
資料完整性:正確性+準確性=資料完整性
- 正確性:資料型別正確
- 準確性:資料範圍要準確
資料庫執行過程
- 客戶端
- 連線資料庫
- 傳送SQL指令
- 返回結果
- 傳送SQL指令
- 返回結果
- 關閉連線
- MySQL
MySQL資料庫的目錄
-
資料庫儲存的路徑在安裝MySQL的時候就配置好
-
在my.ini配置檔案中更改資料庫的儲存地址
datadir="F:/wamp/PHPTutorial/MySQL/data/"
-
一個數據庫就對應一個資料夾,在資料夾中有一個db.opt檔案
- 在此檔案中設定資料庫的字符集和校對集
MySQL資料庫報錯
-
如果建立的資料庫已存在,會報錯
- 建立資料庫的時候判斷一下資料庫是否存在,如果不存在再建立
-
如果資料庫名是關鍵字和特殊字元,要報錯
- 在特殊字元、關鍵字行加上反引號
-
建立資料庫的時候可以指定字元編碼
- 建立資料庫如果不指定字元編碼,預設和MySQL伺服器的字元編碼是一致的
資料庫的操作
建立資料庫
- 語法
create database [if not exists] 資料名 [選項];
-- 建立資料庫時指定儲存的字元編碼
-- 如果不指定編碼,資料庫預設使用安裝資料庫時指定的編碼
mysql> create database emp charset=gbk;
# `Query OK, 1 row affected (0.00 sec)`
-- 建立資料庫
mysql> create database stu;
# `Query OK, 1 row affected (0.06 sec)`
-- 建立資料庫時,如果資料庫已經存在就要報錯
mysql> create database stu;
# `ERROR 1007 (HY000): Can't create database 'stu'; database exists`
-- 在建立資料庫時候,判斷資料庫是否存在,不存在就建立
mysql> create database if not exists stu;
# `Query OK, 1 row affected, 1 warning (0.00 sec)`
-- 特殊字元、關鍵字做資料庫名,使用反引號將資料庫名括起來
mysql> create database `create`;
# `Query OK, 1 row affected (0.04 sec)`
mysql> create database `%$`;
# `Query OK, 1 row affected (0.05 sec)`
顯示所有資料庫
- 語法
show databases;
刪除資料庫
- 語法
drop database [if exists] 資料庫名;
顯示建立資料庫的語句
- 語法
show create database 資料庫名;
修改資料庫
-
語法
alter database 資料庫名 charset=字元編碼;
-
說明
- 修改資料庫只能修改資料庫的字元編碼
- 在MySQL中utf字元編碼之間沒有橫杆
utf8
選擇資料庫
- 語法
use 資料庫名
表的操作
資料表的檔案
-
拓撲結構
- 一個數據庫對應一個資料夾
- 一個表對應一個或多個檔案
-
引擎
myisam
一個表對應三個檔案.frm
儲存的是表結構.myd
儲存的是表資料.myi
儲存的表資料的索引
innodb
一個表對應一個表結構檔案- innodb的都有表的資料都儲存在ibdata1檔案中
- 如果資料量很大,會自動的建立ibdata2,ibdata3...
- 如果不指定引擎,預設是innodb
innodb
和myisam
的區別myisam
- 查詢速度快
- 容易產生碎片
- 不能約束資料
innodb
- 以前沒有myisam查詢速度快,現在已經提速了
- 不產生碎片
- 可以約束資料
表前環境建立
-- 建立資料庫
mysql> create database data;
# `Query OK, 1 row affected (0.00 sec)`
-- 使用資料庫
mysql> use data;
# `Database changed`
-- 設定客戶端和伺服器通訊的編碼
mysql> set names gbk;
# `Query OK, 0 rows affected (0.00 sec)`
建立表
- 語法
create table [if not exists] `表名`(
`欄位名` 資料型別 [null|not null] [default] [auto_increment] [primary key] [comment],
`欄位名` 資料型別 [null|not null] [default] [auto_increment] [primary key] [comment]
)[engine=儲存引擎] [charset=字元編碼]
- 語法說明
null|not null
是否為空default
預設值auto_increment
自動增長,預設從1開始,每次遞增1primary key
主鍵,主鍵的值不能重複,不能為空,每個表必須只能有一個主鍵comment
備註engine
引擎決定了資料的儲存和查詢myisam、innodb
- 表名和欄位名如果用了關鍵字,要用反引號引起來
- 如果不指定引擎,預設是innodb
- 如果不指定字元編碼,預設和資料庫編碼一致
varchar(20)
表示長度是20個字元
-- 建立簡單的表
mysql> create table stu1(
-> id int auto_increment primary key,
-> name varchar(20) not null
-> )engine=innodb charset=gbk;
# `Query OK, 0 rows affected (0.11 sec)`
-- 建立複雜的表
mysql> create table stu2(
-> id int auto_increment primary key comment '主鍵',
-> name varchar(20) not null comment '姓名',
-> `add` varchar(50) not null default '地址不詳' comment '地址',
-> score int comment '成績,可以為空'
-> )engine=myisam;
# `Query OK, 0 rows affected (0.06 sec)`
顯示所有表
- 語法
show tables;
顯示建立表的語句
- 語法
show create table 表名稱;
結果橫著排列show create table 表名稱\G;
結果豎著排列
查看錶結構
- 語法
desc[ribe] 表名;
複製表
- 語法
create table 新表 select 欄位 from 舊錶;
- 不能複製父表的鍵,能夠複製父表的資料
create table 新表 like 舊錶;
- 只能複製表結構,不能複製表資料
*
表示所有欄位
刪除表
- 語法
drop table [if exists] 表1,表2,… ;
修改表
- 語法
alter table 表名;
新增欄位
- 語法
alter table 表名 add [column] 欄位名 資料型別 [位置];
-- 預設新增欄位放在最後
mysql> alter table stu add `add` varchar(20);
# `Query OK, 0 rows affected (0.05 sec)`
-- 在name之後新增sex欄位
mysql> alter table stu add sex char(1) after name;
# `Query OK, 0 rows affected (0.00 sec)`
# `Records: 0 Duplicates: 0 Warnings: 0`
-- age放在最前面
mysql> alter table stu add age int first;
# `Query OK, 0 rows affected (0.00 sec)`
# `Records: 0 Duplicates: 0 Warnings: 0`
刪除欄位
- 語法
alter table 表 drop [column] 欄位名;
-- 刪除age欄位
mysql> alter table stu drop age;
# `Query OK, 0 rows affected (0.00 sec)`
# `Records: 0 Duplicates: 0 Warnings: 0`
修改欄位(改名)
- 語法
alter table 表 change [column] 原欄位名 新欄位名 資料型別;
-- 將name欄位更改為stuname varchar(10)
mysql> alter table stu change name stuname varchar(10);
# `Query OK, 0 rows affected (0.02 sec)`
# `Records: 0 Duplicates: 0 Warnings: 0`
修改欄位(不改名)
- 語法
alter table 表 modify 欄位名 欄位屬性 欄位屬性;
-- 將sex資料型別更改為varchar(20)
mysql> alter table stu modify sex varchar(20);
# `Query OK, 0 rows affected (0.00 sec)`
# `Records: 0 Duplicates: 0 Warnings: 0`
-- 將add欄位更改為varchar(20) 預設值是‘地址不詳’
mysql> alter table stu modify `add` varchar(20) default '地址不詳';
# Query OK, 0 rows affected (0.00 sec)
# Records: 0 Duplicates: 0 Warnings: 0
修改引擎
- 語法
alter table 表名 engine=引擎名;
mysql> alter table stu engine=myisam;
# `Query OK, 0 rows affected (0.01 sec)`
# `Records: 0 Duplicates: 0 Warnings: 0`
修改表名
- 語法
alter table 表名 rename to 新表名;
-- 將stu表名改成student
mysql> alter table stu rename to student;
# Query OK, 0 rows affected (0.00 sec)
將表移動到其他資料庫
- 語法
alter table 表名 rename to 其他資料庫.新表名;
-- 將當前資料庫中的student表移動到php74資料庫中改名為stu
mysql> alter table student rename to php74.stu;
# Query OK, 0 rows affected (0.00 sec)
資料操作
插入資料
插入所有欄位
-
語法
insert into 表名 (欄位名, 欄位名,…) values (值1, 值1,…);
-
說明
- 插入欄位名的順序和資料表中欄位名的順序可以不一致
- 插入值的個數、順序必須和插入欄位名的個數、順序要一致
- 如果插入的值的順序和個數與表字段的順序個數一致,插入欄位可以省略
-- 插入所有欄位
mysql> insert into stu (id,stuname,sex,`add`) values (1,'tom','男','北京');
# `Query OK, 1 row affected (0.00 sec)`
-- 插入部分欄位
mysql> insert into stu(id,stuname) values (2,'berry');
-- 插入的欄位和表的欄位可以順序不一致。但是插入欄位名和插入的值一定要一一對應
mysql> insert into stu(sex,`add`,id,stuname) values ('女','上海',3,'ketty');
# `Query OK, 1 row affected (0.00 sec)`
-- 插入欄位名可以省略
mysql> insert into stu values(4,'rose','女','重慶');
# `Query OK, 1 row affected (0.00 sec)`
插入預設值和空值
- 語法
insert into 表名 values (值1, 值2, null, default);
- default關鍵字用來插入預設值,null用來插入空值
mysql> insert into stu values (5,'jake',null,default);
# `Query OK, 1 row affected (0.05 sec)`
插入多條資料
mysql> insert into stu values (6,'李白','男','四川'),(7,'杜甫','男','湖北');
# `Query OK, 2 rows affected (0.00 sec)`
# `Records: 2 Duplicates: 0 Warnings: 0`
更新資料
- 語法
update 表名 set 欄位=值 [where 條件];
-- 將berry性別改為女
mysql> update stu set sex='女' where stuname='berry';
# `Query OK, 1 row affected (0.06 sec)`
-- 將編號是1號的學生性別改成女,地址改為上海。
mysql> update stu set sex='女',`add`='上海' where id=1;
# `Query OK, 1 row affected (0.00 sec)`
刪除資料
-
語法
delete from 表名 [where 條件];
-
delete from 表和truncate table 表的區別
delete from
遍歷表記錄,一條一條的刪除truncate table
將原表銷燬,再建立一個同結構的新表。就清空表而言,這種方法效率高
-- 刪除1號學生
mysql> delete from stu where id=1;
-- 刪除名字是berry的學生
mysql> delete from stu where stuname='berry';
# `Query OK, 1 row affected (0.00 sec)`
-- 刪除所有資料
mysql> delete from stu;
# `Query OK, 5 rows affected (0.00 sec)`
查詢資料
- 語法
select 列名 from 表名;
-- 查詢id欄位的值
mysql> select id from stu;
-- 查詢id,stuname欄位的值
mysql> select id,stuname from stu;、
-- 查詢所有欄位的值
mysql> select * from stu;
編碼設定
- 語法
set names gbk;
一次性設定客戶端和伺服器通訊的編碼set character_set_client=gbk;
更改接受客戶端指令的編碼- 設定什麼編碼取決於客戶端的編碼
校對集
- 語法
collate=utf8_general_ci;
不區分大小寫collate=utf8_bin;
按二進位制編碼比較,區別大小寫
mysql> create table stu1(
-> name char(1)
-> )charset=utf8 collate=utf8_general_ci;
# `Query OK, 0 rows affected (0.05 sec)`
mysql> create table stu2(
-> name char(1)
-> )charset=utf8 collate=utf8_bin;
# `Query OK, 0 rows affected (0.05 sec)`
mysql> insert into stu1 values ('a'),('B');
# `Query OK, 2 rows affected (0.00 sec)`
# `Records: 2 Duplicates: 0 Warnings: 0`
mysql> insert into stu2 values ('a'),('B');
# `Query OK, 2 rows affected (0.00 sec)`
# `Records: 2 Duplicates: 0 Warnings: 0`