1.數據庫介紹
數據庫是用來存放數據的,數據不是直接存放在數據庫中的,數據庫中存放的是表,表中存放的才是數據.
所以我們學習就是分為數據的操作,表的操作,數據庫的操作.
2.數據庫的發展史
2.1萌芽階段(文件)
所有的存儲數據的文件都屬于數據庫.安全性低.
2.2層次模型
1.優點:查詢分類的數據效率比較高
2.缺點:
導航結構,如果查找不同類型的數據,那么效率非常低
數據的不完整(如下圖)
注意:在數據庫中,數據本身是沒有對錯之分的,如果數據不正確的話我們稱之為'數據不完整'或'失去了數據的完整性'
2.3網狀模型
注意:網狀模型解決了數據的不完整性,但是沒有解決導航問題.
2.4關系模型
現在的主流數據庫都是關系型數據庫
特點:每個表都是獨立的,沒有導航結構,表與表之間通過公共的字段建立關系.
注意:公共字段的名字可以不一樣,但是數據類型必須一樣.數據類型一樣的但它不一定是公共字段.兩個字段必須數據類型必須一樣,字段的含義必須一樣
建表語句
謹記:關系模型在多表查詢的時候并且數據量很大的時候,它的執行效率很低.
在項目中,我們通過非關系型數據庫來解決此問題(NoSql),redis.MongoDB.
3.記錄.行.列.字段.屬性.字段的屬性.數據
1.一行我們通常稱為一條記錄
2.一列稱為一個字段,也叫一個屬性
就表結構層面而言:表分為行和列
就數據層面而言:表分為記錄和字段
3.數據冗余:相同的數據儲存在不同的地方
1.冗余只能減少,不能完全杜絕
2.冗余減少了,表的體積也就減小了,更新的速度加快了,保存了數據的完整性.
3.但是減少了冗余,那么肯定增加了表,多表查詢的效率又降低了,在項目中有的時候寧可讓數據冗余也要保證查詢的效率.(但效率和規范起沖突的,效率要大于規范,保證實用性)
4.數據的完整性
正確性+準確性 = 數據的完整性
分析:學生的年齡字段(age int),儲存到1000,問正確性如何?準確性又如何?
正確但是不準確
正確性:描述數據類型是否準確
準確性:描述數據的范圍是否合理(準確)
5.windows命令行運行客戶端
(1).啟動MySql
使用CMD
開啟客戶端
如果你使用的是原生
的mysql5.7,那么先要開啟 命令是:net start(stop) mysql57
如果你是用的是第三方服務性,那么你就按規則操作.
或者進入到mysql的bin目錄下,電機mysqld.exe進行開啟
(2).連接MySql服務器
mysql -hlocalhost -uroot -proot -P3306
localhost 代表本地的IP地址
host 主機 -h
username 用戶名 -u
password 密碼 -p
port 端口號 -P
(3).斷開連接
1.quit
2.exit
3.\q
(4)SQL語句
SQL即結構化查詢語言(Structured Query Language),是一種特殊目的的編程語言,是一種數據庫查詢和程序設計語言,用于存取數據以及查詢、更新和管理關系數據庫系統;同時也是數據庫腳本文件的擴展名。SQL語句無論是種類還是數量都是繁多的,很多語句也是經常要用到的,SQL查詢語句就是一個典型的例子,無論是高級查詢還是低級查詢,SQL查詢語句的需求是最頻繁的。
關系型數據庫 | 公司 | 擴展 |
---|---|---|
access | 微軟 | SQL |
SQL-Server | 微軟 | T-SQL |
Oracle | 甲骨文 | PL/SQL |
MySql | 甲骨文 | MySql |
思考:已知SQL是標準SQL,那么在oracle上編寫的PL/SQL能否在MySql上運行?
答案:不能,能相互運行的只是標準SQL.
(5)數據庫操作
a.創建數據庫
語法:create database [if not exists] `數據庫名` charset=字符的編碼(utf8);
b.創建已經存在的數據庫會報錯
c.指定數據庫的字符編碼
create database `數據庫名` charset=字符的編碼(utf8);
d.創建數據庫,數據庫名要加上反引號(``),你使用關鍵字作為數據庫名可以防止報錯,并創建成功.
e.顯示數據庫
語法:show databases;
f.顯示創建數據庫的語句
語法:show create database `數據庫名`;
(6)修改數據庫
只能修改數據庫的字符編碼
修改數據庫字符集
alter database `數據庫名` charset=字符集選項;
(7)刪除數據庫
drop database [if exists] `數據庫名`;
如果刪除一個不存在的數據庫會報:
1008 - Can't drop database '$%@'; database doesn't exist
加上[if exists]
drop database if exists `數據庫名`;
#可以避免報錯
#作用:判斷指定的數據庫存不存在,存在則刪除.
(8)選擇數據庫
use `數據庫名`;
6.表的操作
(1)創建表
create table [if not exists] `表名`(
-> id int not null auto_increment primary key comment'主鍵字段',
-> username char(64) comment'用戶名' default'root',
-> password varchar(64) comment'密碼'
-> )engine=myisam charset=utf8;
注意:最后一局不能加逗號,如果加了,那么表示沒寫完
1.null|not null 字符是否為空
2. default 默認值
3.auto_increment 自動增長
4.primary key 設為主鍵
5.engine 表的存儲引擎(innodb | myisam)
(2)常用的引擎
innodb
,myisam
不同的儲存引擎就是儲存數據的格式不一樣.
IO模型,是針對硬盤的 curd insert->create update read->select delete
I 寫 innodb 在寫的時候更加的有優勢 del update insert
o 讀 myisam 讀的時候更加的有優勢 select
(3)給指定的數據庫建表
create table 數據庫名.表名(
-> id int,
-> p char(32)
-> );
(4)中文亂碼
create table 數據庫名.表名(
-> id int,
-> name char(32) default'你好' #default 默認不能使用中文
-> );
#1067 - Invalid default value for 'name'
#windows默認的是GBK
set names gbk
7.數據庫文件
一個數據庫對應一個文件夾,一個表對應一個文件
(1)myisam引擎
MySQL\data\python->mysql的路徑
比如在python數據庫文件夾下有一個user表
myisam會默認創建三個文件
user.frm -> 表結構
user.MYD -> 儲存表數據
user.MYI -> 儲存表的索引
(2)innodb引擎
user_info 文件是innodb的
user_info.frm 表結構.索引都是在一起的
在MySQL\data
ibdata1 ->它是儲存innodb數據的,如果ibdata1滿了,他會自動創建ibdata2\ibdata3
總結:myisam引擎的表可以任意的移動,innodb不能任意移動.
默認的情況下,innodb的數據都存放在ibdata1文件中,可以在創建表的時候指定innodb和myisam一樣,表和數據不存放在一起(后面提到)
8.表的操作
(1)顯示表
show tables;
+------------------+
| Tables_in_python |
+------------------+
| user |
| user_info |
+------------------+
2 rows in set
(2)顯示建表結構
show create table user\G
*************************** 1. row ***************************
Table: user
Create Table: CREATE TABLE `user` (
`uid` int(11) NOT NULL AUTO_INCREMENT COMMENT '涓婚敭瀛楁'
`username` char(64) DEFAULT NULL COMMENT '鐢ㄦ埛鍚?,
`password` varchar(64) DEFAULT NULL COMMENT '瀵嗙爜',
PRIMARY KEY (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
(3)刪除表
語法:drop table [if exists] `表1`,`表2`;
mysql> drop table if exists `user`,`user_info`;
Query OK, 0 rows affected
mysql> show tables;
Empty set
(4)查看表結構
desc `表名`; | describe `user`;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| name | char(16) | NO | | tom | |
+-------+------------------+------+-----+---------+----------------+
2 rows in set
(5)更改表
a.修改表名
語法: alter table `old_name` rename `new_name`;
b.增加一個字段
alter table `表名` add `字段名` 數據類型;
alter table user2 add age int(3) first; #添加在表的第一個
alter table user2 add height int(3) after age; #添加字段在指定字段的后面
c.修改字段屬性
alter table `表名` modify `屬性名(字段名)` 數據類型;
d.修改字段名
alter table `表名` change `原字段名` `新的字段名` varchar(10) ;
e.修改字段的位置
alter table user2 change `字段名` `改為新的字段名` char(16) after '字段名';
f.修改表的引擎
alter table `表名` engine=innodb|myisam;
g.移動表到指定數據庫并改名為指定名稱
alter table `原表名` rename to java.user;
(6)復制表
create table `新表` select * from `原來的表`;
特點:
1.舊表的數據會一起復制過來到新表中
2.不能復制主鍵
create table `新表` like `原來的表`;
特點:
1.它可以復制主鍵
2.但是不會復制數據
(7)數據操作
a.插入數據
1.insert into user(`id`,`age`,`sex`) values('',18,'tom');
#值的個數要和字段數一致
2.insert into user(`age`,`sex`) values(20,'jack');
#id為自動增長字段,可以不寫
3.insert into user values(null,25,'lily');
#不寫字段l,40,'wj'),(null,50,'ybq');
#一次插入多條
5.insert into user set age=60,sex='hx';名,要一一對應字段個數
4.insert into user values(null,30,'lyb'),(nul
#一次只能插入一條數據 insert into 表名 set 字段='',字段='';
#面試題
如何優化insert插入語句(一次性插入1萬跳,一次性插入100萬條)
答:將insert語句進行字符串拼接,拼接vaules.
#why?
insert每寫一次都需要被機器做語法解析,語法設別,字段對應,它需要耗費時間.
查詢:select * from 表明;
md5()在mysql中可以直接加密,在python中hashlib.md5().
md5 是單向加密
md5在項目中怎么加密.
md5(123456) --->e10adc3949ba59abbe56e057f20f883e
md5(e10adc3949ba59abbe56e057f20f883e+base64(admin))
b.修改數據
update user set sex='pgone' where id=8;
#update 表名 set 字段名='值',字段名=123 where 字段(一般使用主鍵)=值;
update user set sex='賈乃亮',age=40 where id=5;
#修改多個字段
c.刪除數據
delete from user where id=8;
#delete from 表名 where 字段(一般為主鍵)=值
#一條一條的刪
delete from user where True;
#刪除全部
#它也是一條一條的刪
truncate user;
#記錄你原來建表語句,然后刪除整個表,在創建,數據全部被清空