Python-數據庫 基本SQL語句

1. 數據庫是什麼
2. MySQL安裝
3. 用戶受權
4.
數據庫操做
-
數據表
- 數據類型
- 是否能夠爲空
- 自增
- 主鍵
- 外鍵
- 惟一索引

數據行




排序: order by desc/asc
分組:group by
條件:where
連表:
left join
right join
inner join
臨時表:
通配符
分頁:limit
組合:
union
視圖(虛擬)
觸發器
函數 select xx(f)
存儲過程
- 遊標
- 事務
- 結果集+ 「返回值」
pymysql
- 鏈接 connect(...)
- 操做(遊標)
- 增刪改 -> commit
- 查 -> fetchone,fetchall
- SQL注入
- 調用存儲過程:
callproc('p1',參數)
select @_存儲過程名稱_0
- 關閉遊標
- 關閉鏈接



===============================
#咱們在編寫任何程序以前,都須要事先寫好基於網絡操做一臺主機上文件的程序(socket服務端與客戶端程序),
因而有人將此類程序寫成一個專門的處理軟件,這就是mysql等數據庫管理軟件的由來,
但mysql解決的不只僅是數據共享的問題,還有查詢效率,安全性等一系列問題,
總之,把程序員從數據管理中解脫出來,專一於本身的程序邏輯的編寫。

1.什麼是數據庫 *****
存放數據的倉庫

數據庫中包含全部內容:
字段(列) 一行中的某個數據
記錄 一行數據
表 文件
庫 文件夾
DBMS 數據庫管理系統 socket軟件
數據庫服務器 計算機
一個庫能夠包含多個表 一個表能夠包含多條記錄 一條記錄中有多個字段

數據庫是什麼,本質上就是一套C/S架構得socket軟件

已學習的文件操做的缺陷
1.IO操做 效率問題
2.多用戶競爭數據
3.網絡訪問
4.用戶的驗證
2.常見的數據庫
關係型 數據之間存在某種關聯關係
主要存儲在硬盤中 容量大 速度慢
oracle
目前最好關係型數據庫,體如今用戶管理,分佈式
商業用途收費
mysql
免費開源,功能支持沒有oracle強 可是足以知足中小企業使用
前後被sun 和 oracle 收購
mysql創始人wedenius擔憂 mysql會閉源 因而另起竈爐 搞了marriaDB
mariaDB和mysql 使用方法如出一轍
sqlServer
屬於微軟生態鏈,須要和windows配合使用
DB2
IBM開發的大型關係型數據庫 ,收費的,一般與硬件捆綁銷售
maria

非關係型 數據之間不存在關聯關係
容量小 速度快 以key value形式存儲
mongoDB
redis
memcache

2.數據庫的相關概念 ******
age = 18
一個變量 沒法描述清楚數據
1.稱之爲一個字段

age = 18,name = Jack,genger = man
一堆變量在一塊兒,能夠描述清楚數據
2.稱之爲一條記錄 對應着文件中的一行

文件須要分門別類 每一個文件存儲不一樣的數
3.一個文件稱之爲表

文件愈來愈多 得分文件夾
4.一個文件稱之爲庫

數據庫中包含全部內容:
字段(列) 一行中的某個數據
記錄 一行數據
表 文件
庫 文件夾
DBMS 數據庫管理系統 socket軟件
數據庫服務器 計算機
一個庫能夠包含多個表 一個表能夠包含多條記錄 一條記錄中有多個字段

數據庫是什麼,本質上就是一套C/S架構得socket軟件



3.安裝數據庫與配置使用環境 ***
1.代碼界面 傻瓜式安裝 記住密碼
2.綠色解壓版
1. 5.7之後的版本須要先初始化 mysqld --initialize-insecure
2.啓動須要先進入安裝目錄 比較麻煩 須要添加到環境變量
打開環境變量 將mysql安裝目錄下的bin加入path變量
3.將mysqld 加入到windows的系統服務啓動 services.mcs

4.綠色版修改默認密碼
修改默認密碼須要先登陸成功
執行update語句直接修改 user表中的密碼
?查詢系統用戶的基礎信息desc mysql.user;
5.7
update mysql.user set authentication_string = password("admin") where user = "root";
5.6
update mysql.user set password = password("admin") where user = "root";


修改密碼方式2 不須要登陸 須要知道舊密碼
mysqladmin -uroot -p舊密碼 password "123"

破解密碼,當忘記密碼時 沒法登陸 也就不能值執行update語句
思路:
1.啓動服務器時 控制它不要加載受權表
2.無密碼登陸服務器
3.執行update mysql.user set authentication_string = password("root") where user = "root"
4.重啓服務器後更改密碼纔會生效

用到的系統指令:
mysqld 直接運行服務器程序
net start mysql 啓動mysql服務器
net stop mysql
mysqld --skip-grant-tables 跳過受權表 用於重設密碼
tasklist | findstr mysqld taskkill /f /pid 結束服務器程序
mysql 運行客戶端程序 -u用戶名 -p密碼 -h主機地址 -P端口號
mysqld --install 將mysqld註冊當windows服務中 在服務中叫MySQL
windows就是綁定了一個exe程序
sc delete mysql 刪除windows服務
exit 退出客戶端



5.簡單的sql語句 *****
針對庫的相關操做

create database 庫名稱

drop database 庫名稱

alter database 庫名稱 要改的屬性名稱
alter database db1 DEFAULT CHARACTER SET utf8;
/alter database db1 CHARSET utf8;
注意 在mysql中 utf-8 不能帶- 寫成utf8

show databases查看全部數據庫
show create databases 庫名稱 查看建庫的語句
命名規範:
1.不能使用純數字
2.能夠是數字 字母 下滑線的組合
3.能夠下滑線開頭
4.不能是關鍵字 如create
大體和python相同 ,不區分 大小寫

表相關的操做

建表時要明確數據庫
use db1;
create table 表名稱(字段名 類型(長度),....)
create table dog(nikename char(10),gender char(1),age int)
#建立時同時指定數據庫
create table 庫名稱.表名稱(字段名 類型(長度),....)

drop table 表名;

alter table 表名稱 (DCMA)drop|change|modify|add
alter table drop 字段名稱
alter table dog drop color;
alter table change 舊字段名 新字段名 新類型
alter table dog change gender sex char(2);
alter table modify 字段名 新類型
alter table dog modify color char(5);
alter table add 新字段名稱 新類型
alter table dog add color char(10);
重命名錶
rename table 舊錶名稱 to 新表名稱
rename table dog to dogtable;
修改表的屬性
alter table 表名 屬性名 值;
alter table dogtable DEFAULT CHARSET gbk;

show tables;查看全部表
show create table 表名;查建表語句
desc 表名稱; 查看錶結構


記錄相關操做

insert into 表名 values(值1,值2.....)

delete from 表名 where 字段名稱 = 值
沒有條件的話刪除所有數據

update 表名 set 字段名 = 新的值 where 字段名 = 值
沒有條件的話修改所有

select *from 表名; *表示通配符 查看全部字段
select 字段名稱1,字段名2.. from 表名;


複製表
複製表結構+記錄 (key不會複製: 主鍵、外鍵和索引)
mysql> create table new_service select * from service;

只複製表結構
mysql> select * from service where 1=2; //條件爲假,查不到任何記錄
Empty set (0.00 sec)
mysql> create table new1_service select * from service where 1=2;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> create table t4 like employees;


6.修改默認編碼
配置文件放在安裝路徑根目錄中 就是和bin同級 名稱必須叫my.ini
#客戶端的配置
[client]
#mysql這個客戶端的配置
[mysql]
user = root
password = root
default-character-set = utf8
#服務器端的配置
[mysqld]
character-set-server = utf8

7.數據庫的引擎 ***

8. 5.6 與5.7的區別
1. 5.7須要初始化
2. 5.6遊客模式 沒有密碼能夠登陸 可是沒法操做數據
只能看到 information_schema mysql
3. 5.7中 data數據存放目錄 是由初始化時決定
帶界面的 在C:\ProgramData中
不帶界面的就在安裝目錄中
5.6就在安裝目錄中
4.密碼存儲字段名 在5.6中時password 5.7中叫authentication_string

SQL語言主要用於存取數據、查詢數據、更新數據和管理關係數據庫系統,SQL語言由IBM開發。
SQL語言分爲3種類型:
#一、DDL語句 數據庫定義語言: 數據庫、表、視圖、索引、存儲過程,例如CREATE DROP ALTER
#二、DML語句 數據庫操縱語言: 插入數據INSERT、刪除數據DELETE、更新數據UPDATE、查詢數據SELECT
#三、DCL語句 數據庫控制語言: 例如控制用戶的訪問權限GRANT、REVOKE

小結
1.數據庫是什麼?
mysql 一種DBMS
是一個CS的socket軟件

數據庫服務器
DBMS
文件夾 庫
文件 表
一個完整數據 記錄
單個數據 字段

數據庫的分類
關係型 數據之間存在某種關聯 存在硬盤上
非關係型 數據之間存在某種關聯 以key value形式存儲 存在內存中

爲何用mysql
免費開源 可以支持中小企業使用

安裝兩種方式
1.界面
2.解壓安裝

環境變量
系統服務
修改默認祕密
破解密碼
修改編碼(配置文件)
簡單Crete Read Update Delete


語法

SQL語句數據行操做補充
			create table tb12(
				id int auto_increment primary key,
				name varchar(32),
				age int
			)engine=innodb default charset=utf8;
	
		增
			insert into tb11(name,age) values('alex',12);
			
			insert into tb11(name,age) values('alex',12),('root',18);
			
			insert into tb12(name,age) select name,age from tb11;
		刪
			delete from tb12;
			delete from tb12 where id !=2 
			delete from tb12 where id =2 
			delete from tb12 where id > 2 
			delete from tb12 where id >=2 
			delete from tb12 where id >=2 or name='alex'
		
		改
			update tb12 set name='alex' where id>12 and name='xx'
			update tb12 set name='alex',age=19 where id>12 and name='xx'
		查
			
			select * from tb12;
			
			select id,name from tb12;
			
			select id,name from tb12 where id > 10 or name ='xxx';
			
			select id,name as cname from tb12 where id > 10 or name ='xxx';
			
			select name,age,11 from tb12;
			
			其餘:
				select * from tb12 where id != 1
				select * from tb12 where id in (1,5,12);
				select * from tb12 where id not in (1,5,12);
				select * from tb12 where id in (select id from tb11)
				select * from tb12 where id between 5 and 12;
	
			
				通配符:
				
				select * from tb12 where name like "a%"
				select * from tb12 where name like "a_"
	
			
				分頁:
				
					select * from tb12 limit 10;
					
					select * from tb12 limit 0,10;
					select * from tb12 limit 10,10;
					select * from tb12 limit 20,10;
					
					select * from tb12 limit 10 offset 20;
					從第20行開始讀取,讀取10行;
		
					結合Python分頁:
					# page = input('請輸入要查看的頁碼')
					# page = int(page)
					# (page-1) * 10
					# select * from tb12 limit 0,10; 1 
					# select * from tb12 limit 10,10;2
				
				
				排序:
					select * from tb12 order by id desc; 大到小
					select * from tb12 order by id asc;  小到大
					 select * from tb12 order by age desc,id desc;
					 
					取後10條數據
					select * from tb12 order by id desc limit 10;
			
				分組:
				
					select count(id),max(id),part_id from userinfo5 group by part_id;
					
					count
					max
					min
					sum
					avg
					
					**** 若是對於聚合函數結果進行二次篩選時?必須使用having ****
					select count(id),part_id from userinfo5 group by part_id having count(id) > 1;
					
					select count(id),part_id from userinfo5 where id > 0 group by part_id having count(id) > 1;
			
					
				連表操做:
				
					select * from userinfo5,department5
					
					select * from userinfo5,department5 where userinfo5.part_id = department5.id
					

					select * from userinfo5 left join department5 on userinfo5.part_id = department5.id
					select * from department5 left join userinfo5 on userinfo5.part_id = department5.id
					# userinfo5左邊所有顯示
					
					
					# select * from userinfo5 right join department5 on userinfo5.part_id = department5.id
					# department5右邊所有顯示
				
				
				
					select * from userinfo5 innder join department5 on userinfo5.part_id = department5.id
					將出現null時一行隱藏
					
					
				
				
				
				
					select * from 
						department5 
					left join userinfo5 on userinfo5.part_id = department5.id
					left join userinfo6 on userinfo5.part_id = department5.id
				
				
					select 
						score.sid,
						student.sid 
						from 
					score

						left join student on score.student_id = student.sid

						left join course on score.course_id = course.cid

						left join class on student.class_id = class.cid

						left join teacher on course.teacher_id=teacher.tid
					
			
			
			
			select count(id) from userinfo5;
相關文章
相關標籤/搜索