數據庫操做

一.知識點

△用數據庫的緣由python

1文件操做的複雜度
2同步
3併發處理
4安全

△數據庫管理系統-DBMmysql

# 網絡應用服務端
# 咱們要使用服務端的數據 - 須要有一個客戶端
    # 客戶端能夠本身寫   : 將來寫代碼的時候
    # 也能夠用別人寫好的 : 第三方的工具 數據庫管理軟件的公司出版的官方客戶端
# 數據庫管理系統本質上也是管理一堆文件
    # 只不過人家的管理方式比咱們更高效 更安全

△數據庫管理員-DBAredis

# 搭建數據庫服務環境
# 用戶的建立 權限的管理
# 性能\語句的優化
# 數據庫的二次開發 : 讓數據庫具備公司的特質

△軟件sql

# mysql : 小公司
# 甲骨文 oracle  : 事業單位 金融企業
# 微軟 sql server
# sqllite

數據庫的分類mongodb

# 關係型數據庫 mysql oracle sqlserver sqllite
# 非關係型數據庫 redis mongodb memcache hbase

關係型數據庫數據庫

優勢:安全

一、易於維護:都是使用表結構,格式一致
二、使用方便:SQL語言通用,可用於複雜查詢
三、複雜操做:支持SQL,可用於一個表以及多個表之間很是複雜的查詢
缺點:網絡

一、讀寫性能比較差,尤爲是海量數據的高效率讀寫
二、固定的表結構,靈活度稍欠
三、高併發讀寫需求,傳統關係型數據庫來講,硬盤I/O是一個很大的瓶頸數據結構

非關係型數據庫併發

優勢:
一、格式靈活:存儲數據的格式能夠是key,value形式、文檔形式、圖片形式等等
二、速度快,成本低:nosql數據庫部署簡單,基本都是開源軟件

缺點:
一、不提供sql支持,學習和使用成本較高
二、無事務處理
三、數據結構相對複雜,複雜查詢方面稍欠

> Markdown 是一種輕量級標記語言,它容許人們使用易讀易寫的純文本格式編寫文檔,而後轉換成格式豐富的HTML頁面。 —— 維基百科 正如您在閱讀的這份文檔,它使用簡單的符號標識不一樣的標題,將某些文字標記爲***粗體****或者斜體*,建立一個連接或一個腳註[^demo]。下面列舉了幾個高級功能,更多語法請按查看幫助。

△名詞

# DB    數據庫 - 文件夾
# table 表 - 文件
# data  一條數據-每一行數據

△服務端-安裝啓動關閉

# mysqld install   安裝
# net start mysql   啓動  以管理員身份在cmd中輸入
# net stop mysql    關閉
creat user 'alex'@'%'identified by'123';
#建立用戶alex 在全部網段容許 設置密碼爲123

△三種方法操做數據庫

終端,python,第三方工具SQlyog

△二.mysql編碼問題

編碼問題
1.臨時解決問題在客戶端執行set XXXX = utf8;
2.永久解決問題fimy. ini添加set xXxx = utf8;
3.實時解決問題create table表名() charset=utf8;

△SQL語言的5個部分(重要性從高到低):
數據查詢語言(DQL:Data Query Language):select
其語句,也稱爲「數據檢索語句」,用以從表中得到數據,肯定數據怎樣在應用程序給出
數據操做語言(DML:Data Manipulation Language):inster,updata,delete
其語句包括動詞INSERT,UPDATE和DELETE。它們分別用於添加,修改和刪除表中的行。也稱爲動做查詢語言
數據定義語言(DDL):create,alter,drop
在數據庫中建立新表或刪除表;爲表加入索引等
數據控制語言(DCL):grant,revoke
它的語句肯定單個用戶和用戶組對數據庫對象的訪問
事務處理語言(TPL):
它的語句能確保被DML語句影響的表的全部行及時得以更新

前三個部分必須掌握,後兩個部分能夠現用現查
同時注意:SQL 對大小寫不敏感

1,先跟數據庫進行鏈接(用帳號和密碼,默認3306端口)

2,建立數據庫:

​ create database 數據庫名:
​ 刪除數據庫(慎用!):
​ DROP DATABASE 數據庫名稱;
​ 顯示全部數據庫:
​ SHOW DATABASES;
​ 切換數據庫:
​ USE 數據庫名稱 ;

3.建立表:

4.查看錶結構

二.管理員帳戶設置密碼?√

# 默認用戶登錄以後並無實際操做的權限
# 須要使用管理員root用戶登錄

# mysql -uroot -p -h                mysql5.6默認是沒有密碼的  遇到password直接按回車鍵
# mysql> set password = password('root');   給當前數據庫設置密碼
# mysql> select user();  #查看當前用戶
# 輸入「ipconfig」便可查看到本機的ip信息。
# ;表示sql語句的結束
# \c放棄當前要執行的sql語句
# mysql> exit     # 也能夠用\q quit退出

1.建立用戶帳號並受權

mysql> grant all on *.* to 'eva'@'%' identified by '123'

5.6及如下版本
mysql> grant all on *.* to 'eva'@'localhost' identified by '123'

①細節

建立用戶

mysql> create user 'eva'@'192.168.10.%'   IDENTIFIED BY '123';# 指示網段
mysql> create user 'eva'@'192.168.10.5'   # 指示某機器能夠鏈接
mysql> create user 'eva'@'%'                    #指示全部機器均可以鏈接  
mysql> show grants for 'eva'@'192.168.10.5';查看某個用戶的權限

給帳號受權

mysql> grant all on *.* to 'eva'@'%';
#grant 權限類型 on 數據庫名稱 . *  (或表名)  to 'shang'@'%';

mysql> flush privileges;    # 刷新使受權當即生效

三.用戶端-操做

1. 操做文件夾(庫)
   數據備份: mysqldump –uroot –p test101 > C :\t1.sql   (若是有警告能夠忽略)
   數據恢復: mysql –uroot –p 數據庫名 < d:\t1.sql
   增:create database db1 charset utf8;  charset utf8可省略,建立數據庫
   查:show databases;  顯示全部數據庫
   改:alter database db1 charset latin1;(改爲歐洲的)
   刪除: drop database db1;  刪除數據庫(慎用!)
   切換::use db1; 切換數據庫
2. 操做文件(表)
   先切換到文件夾下:use db1 
   增:create table t1(id int,name char);
      #ALTER TABLE t_person ADD age INT; 增長列名 類型
   查: select database();            查看當前所在庫
       show tables;                  查看全部的表
       desc 表;                       查看錶結構 
       show creat table 表名;  查看建表語句和搜索引擎,顯示的信息更全面
       show engines;           查看MySQL重要引擎
   改: #RENAME TABLE t_person TO t_user;    更改表名稱
       #alter table t1 modify name char(3);  修改列的數據類型
       #alter table t1 change name name1 char(2);  修改列名和數據類型
       #ALTER TABLE t_person DROP ageNum;   刪除列

   刪:drop table t1
3. 操做文件中的內容(記錄)
   增:insert into t1 values(1,'egon1'),(2,'egon2'),(3,'egon3');
    # insert into t1(id,name) values (5,'wusir'), (6,'wusir');
    # insert into t2 select * from t1; 
      先執行執行select,把查到的內容導入到t2
    # insert into t1(id,name) select id,name from t1;
   
   查:# select * from 表;     查詢表的信息
      # select emp_name,salary from employee;  指定列查詢
      # select emp_name,salary*12 from employee;   在列中使用四則運算
      # select emp_name,salary*12 as annul_salary from employee; 重命名
      # select emp_name,salary*12 annul_salary from employee; 重命名
      # select distinct post from employee;  去重
      # select distinct sex,post from employee;  雙向去重

   改:# update 表 set 字段1=值1,字段2=值2 where 條件;
   刪:delete from t1 where id=1;

1.函數 concat() 拼接

# select concat('姓名 :',emp_name),concat('年薪:',salary*12) from employee;
# select concat_ws('|','a','b','c')

2. case when語句 == if條件判斷句

3SELECT
       (
           CASE
           WHEN emp_name = 'jingliyang' THEN
               emp_name
           WHEN emp_name = 'alex' THEN
               CONCAT(emp_name,'_BIGSB')
           ELSE
               concat(emp_name, 'SB')
           END
       ) as new_name
   FROM
       employee;

silf語句

四.基礎數據類型

image-20191126095043379

數字類型

整數 :

tinyint(m) 1個字節 -128~127

smalint(m) 1個字節 -32768~32767

==mediumint== 3個字節 -8388608~8388608

==int(m)== 4個字節 -2147483648~2147483647

bigint(m) 8個字節 -9223372036854775808~9223372036854775807

m: 顯示寬度,和數據類型的取值範圍是無關的

(int unsigned) : unsigned 標上表示無符號

小數 :

MySQL中使用浮點數和定點數來表示小數。它們均可以用(m,n)來表示,其中m稱爲精度,表示總共的位數;n稱爲標度,是表示小數的位數(會四捨五入)

==float==

==double==

時間類型

year 年 酒的產期

time 時:分:秒 計時軟件

date 年-月-日 入職日期 出帳日期 還款日期

datetime 年-月-日 時:分:秒 1000-01-01 00:00:00~9999-12-31 23:59:59 日誌,消費記錄,上下班打卡

timestamp 年-月-日 時:分:秒 不能爲空,自動寫當前時間,級聯更新,範圍小

now() 函數表示當前時間

讓datetime 自動寫當前時間,級聯更新
create table 表(
列 datetime NOT NULL         #非空
DEFAULT CURRENT_TIMESTAMP    #自動寫當前時間
ON UPDATE CURRENT_TIMESTAMP  #級聯更新當前時間
)

字符串類型

char(255) :定長的 節省時間 浪費空間 手機號碼、身份證號

varchar(65535) : 變長的 節省空間 浪費時間 評論

枚舉和集合

enum 單選

set 多選,自動去重
例如建表時定義字段
愛好 set(「游泳」,「籃球」,「下棋」,「音樂」,「旅遊」)
insert into t_1 values("游泳,籃球,音樂")
添加時會自動去重和去掉不存在的

1.舉例-數字 字符串

# create table t1(i1 tinyint,i2 int); 默認建立的數據類型都是有符號的  i1-表頭
# create table t2(i1 tinyint unsigned,i2 int unsigned); 給字段添加一個unsigned表示無符號
# create table t3(f1 float,f2 double);
# mysql> create table t1(id int,name varchar(20),sex enum('man','wuman'),age int,hire_date date,post varchar(20),post_comment varchar(20),salary double(7,2),office int,depart_id int);  通常在用char varchar時要限制字符

2.舉例-小數

# create table t3(f1 float,f2 double);
# create table t4(f1 float(7,2));  小數點後2位,小數點前5位

3.舉例-時間

# create table t7(dt datetime NOT NULL DEFAULT CURRENT_ TIMESTAMP ON UPDATE CURRENT_ TIMESTAMP,y year);  
  NOT NULL DEFAULT CURRENT_ TIMESTAMP ON UPDATE CURRENT_ TIMESTAMP 讓datetime的時間在無數據填充的狀況下會自動更新到這次修該的時間

4.舉例-枚舉和集合 enum和set

# create table t8(username cha(12),gender enum('male','female'));
# create table t8(username cha(12),hobby set('喝酒','抽菸','燙頭','洗腳')); 填充的時候也必須時字符串格式

五.查

使用算數表達式查詢某幾列:年齡增長50

SELECT uname,country,age+50 FROM t1;

as

SELECT age+50 AS '年齡' FROM t_user;   #修改列名的顯示(起別名)注意不要用                                       關鍵字,as能夠省略

distinct 查詢時去重

SELECT DISTINCT country FROM t_user;
SELECT DISTINCT country,uname FROM t_user;  #聯合去重
查詢每一個國家都有誰,注意:distinct後面的字段用逗號分隔,逗號兩邊不能有空格
"""

asad sa
"""

比較運算

= > < >= <= != / <>

# select * from employee where age>18;
# select * from employee where salary<10000;
# select * from employee where salary=20000;

between

a and b [a,b]

# select * from employee where salary between 10000 and 20000;

in

# select * from employee where salary in (17000,19000);

like 模糊查詢

_ 通配符 表示一個字符長度的任意內容

select * from employee where emp_name like 'jin___'

% 通配符 表示任意字符長度的任意內容

select * from employee where emp_name like 'jin%'
 select * from employee where emp_name like '%g'
 select * from employee where emp_name like '%n%'

regexp 正則匹配

# select * from employee where emp_name regexp '^jin'

查看全部員工中名字是jin開頭,n或者g結果的員工信息
select * from employee where emp_name regexp '^jin.*[gn]$';

關鍵字IS NULL

(判斷某個字段是否爲NULL不能用等號,須要用IS)

# SELECT emp_name,post_comment FROM employee WHERE post_comment IS NULL;
    # SELECT emp_name,post_comment FROM employee WHERE post_comment IS NOT NULL;

    # SELECT emp_name,post_comment FROM employee WHERE post_comment=''; 注意''是空字符串,不是null
    ps:
        執行
        update employee set post_comment='' where id=2;
        再用上條查看,就會有結果了

邏輯運算

and
# select * from employee where age>18 and post='teacher';

or
# select * from employee where salary<10000 or salary>30000;

not
# select * from employee where salary not in (10000,17000,18000);

分頁

在查詢時能夠只檢索前幾條或者中間某幾行數據(數據量很大時,幾百萬條)
SELECT * FROM t_user LIMIT 0,3;
limit 後面的第一個數字設置從哪裏開始檢索(偏移量,從0開始)
limit 後面的第二個數字是設置顯示多少條

5個聚合函數

經常使用函數

count 統計值

select concat ('<名字:',name, '>'  ,   '<薪資:',salary,'>') from 表;

max 最大值
min 最小值
avg 平均值
sum 最大值

# 分組聚合 group by
    # 查詢崗位名以及崗位包含的全部員工名字
    # select post,group_concat(emp_name) from employee group by post;

    # 查詢各部門年齡在20歲以上的人的平均薪資
    # select post,avg(salary) from employee where age>20 group by post;

    # select * from 表 where 條件 group by 分組

image-20191126153632425

ascii(str)

查看字符的ASCII碼值,str是空時返回0

SELECT ASCII('a')

char(數字)

查看ASCII碼值對應的字符
SELECT CHAR(97)

concat(str1,str2,...)拼接字符串
SELECT CONCAT(12,34,'ab')
SELECT uname,CONCAT(age,'歲') FROM t_user;

過濾 having (group by + 聚合函數)

# 查詢平均薪資大於1w的部門
    # select avg(salary) from employee group by post having avg(salary) > 10000

    # 1. 查詢各崗位內包含的員工個數小於2的崗位名、崗位內包含員工名字、個數
    # select post,emp_name,count(id) from employee group by post having count(id)<2

    # 2. 查詢各崗位平均薪資大於10000的崗位名、平均工資
    # select post,avg(salary) from employee group by post having avg(salary) > 10000

    # 3. 查詢各崗位平均薪資大於10000且小於20000的崗位名、平均工資
    # select post,avg(salary) from employee group by post having avg(salary) between 10000 and 20000;

order by 排序

#  asc 升序
    #  select * from employee order by salary;
    #  select * from employee order by salary asc;
    #  desc 降序
    #  select * from employee order by salary desc;

    # select * from employee order by age,salary;
    # select * from employee order by age,salary desc;
    # select * from employee order by age desc,salary;

排列順序從高到低 DESC

limit

# select * from 表 order by 列 limit n; 取前n條
# select * from 表 order by 列 limit m,n; 從m+1開始,取n條
# select * from 表 order by 列 limit n offset m; 從m+1開始,取n條

公式

select * from 表 where 條件 group by 分組 having 過濾 order by 排序 limit n;

1569386659178

一.引擎
# show create table books; 查看錶引擎

# show engines;查看MySQL重要引擎

# 什麼是存儲方式、存儲機制(存儲引擎)
    # 表結構 存在一個文件中  : 硬盤上
    # 表數據 存在另外一個文件中、內存中
    # 索引(目錄) 爲了方便查找設計的一個機制 :

# 存儲引擎的種類
    # innodb : 索引+數據 表結構  數據的持久化存儲
        # 事務 :一致性 n條語句的執行狀態是一致的
            # begin;   # 開啓事務
            # select id from innot where id =1 for update;
            # update innot set id = 2 where id = 1;
            # commit;  # 提交事務 解鎖被鎖住的數據,讓他們可以被修改
        # 行級鎖 :只對涉及到修改的行加鎖,利於併發的修改,可是對於一次性大量修改效率低下
        # 表級鎖 :一次性加一把鎖就鎖住了整張表,不利於併發的修改,可是加鎖速度比行鎖的效率要高
        # 外鍵約束 :被約束表中的數據不能隨意的修改/刪除 約束字段據要根據被約束表來使用數據
    # myisam : 索引 數據 表結構  數據的持久化存儲
        # 表級鎖
    # memory : 表結構
        # 數據斷電消失

# create table innot(id int) engine = innodb;
# create table myist(id int) engine = myisam;
# create table memot(id int) engine = memory;
二.約束
not null 非空
# create table t1(id int not null,name char(12));
    # 默認插入0
# create table t2(id int,name char(12)  not null);
    # 默認插入空字符串




​```
設置嚴格模式:
    不支持對not null字段插入null值
    不支持對自增加字段插入" 」值-空字符串
    不支持text字段有默認值

直接在mysql中生效(重啓失效):
mysql>set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

配置文件添加(永久失效):
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
​```
unique惟一 (不能重複)
# create table t4(id int unique,name char(12));

# 聯合惟一約束
# create table t5(family char(12),name char(12),unique(family,name));

# 約束各自不能爲空 且聯合惟一
# create table t5(family char(12) not null,name char(12) not null,unique(family,name)); 


# 惟一+非空 id name
# create table t6(id int not null unique, name char(12) not null unique);
# pri 是怎麼產生的? 第一個被設置了非空+惟一約束會被定義成主鍵 primary key
# 主鍵在整張表中只能有一個
主鍵 =非空+惟一
# create table t6(id int primary key, name char(12) not null unique);
# create table t5(family char(12) ,name char(12),primary key(family,name));  # 約束各自不能爲空 且聯合惟一 還佔用了整張表的主鍵
自增

自增的必須是主鍵

# create table t6(id int auto_increment, name char(12));   # 報錯
# create table t8(id int primary key auto_increment, name char(12)) ;
# create table t9(id int unique auto_increment, name char(12)) auto_increment=100000; 自增=>非空  非空+惟一約束會被定義成主鍵 

# delete from t7; 清空表數據但不能重置auto_increment
# truncate table t7;  # 清空表而且重置auto_increment

# 全部的操做都沒法改變auto_increment的自動計數。可是咱們也沒有必要去改變它。
    # 1.至少要看到自增的效果
    # 2.至少寫3條數據 4,5,6
    # 3.刪掉第5條,再看結果
    # 4.再insert一條數據
    # 5.刪掉第5條,再看結果
    # 6.再insert一條數據
    # 7.清空整張表
    # 8.再insert一條數據,再看結果
    
# 修改auto_increment
# alter table 表名 auto_increment = n; 修改表的auto_increment
# alter table t7 auto_increment = 1000; 修改表的auto_increment
default 默認值
# create table t3(id int,name char(12),sex enum('male','female') default 'male');

# 非空約束 和 默認值
# create table t3(id int not null,name char(12) not null,sex enum('male','female') not null default 'male');
6.外鍵

foreign key(class_id) references class3(cid) on update cascade

# 沒有創建外鍵:
    # create table stu(id int,name char(12),class_id int);
    # create table class(cid int,cname char(12));
    # insert into stu values (1,'日魔',1),(2,'炮手',1)
    # insert into class values(1,'py27');
    # insert into class values(2,'py28');
    # select * from stu,class where class_id = cid;
    # delete from stu where id = 1;
    # delete from class where cid = 1;

    # stu2 class2
    # create table class2(cid int unique,cname char(12));
    # create table stu2(id int,name char(12),class_id int,foreign key(class_id) references class2(cid));
    # insert into class2 values(1,'py27');
    # insert into stu2 values (1,'日魔',1),(2,'炮手',1)
    # delete from class2 where cid = 1;
    # insert into class2 values(2,'py28');
    # update class2 set cid = 1 where cid = 2;  不能修改

    # stu3 class3 級聯更新
    # create table class3(cid int primary key,cname char(12));
    # create table stu3(id int,name char(12),class_id int,foreign key(class_id) references class3(cid) on update cascade);
    # insert into class3 values(1,'py27');
    # insert into stu3 values (1,'日魔',1),(2,'炮手',1)
    # update class3 set cid = 2; 修改了class3中的cid,stu3中相關的數據也會跟着變化,是on update cascade設置致使的
相關文章
相關標籤/搜索