MySql數據庫基礎使用

一、數據庫概念

數據庫php

  • 存儲數據的倉庫(邏輯概念,並未真實存在)

數據庫軟件java

  • 真實軟件,用來實現數據庫這個邏輯概念

數據倉庫python

  • 數據量更加龐大,更加側重數據分析和數據挖掘,供企業決策分析之用,主要是數據查詢,修改和刪除不多

二、MySQL的特色

  • 關係型數據庫
  • 跨平臺
  • 支持多種編程語言(python、java、php)
  • 基於磁盤存儲,數據是以文件形式存放在數據庫目錄/var/lib/mysql下

三、啓動鏈接

  • 服務端啓動
sudo /etc/init.d/mysql start|stop|restart|status
sudo service mysql start|stop|restart|status
  • 客戶端鏈接
mysql -hIP地址 -u用戶名 -p密碼
本地鏈接可省略 -h 選項

四、基本SQL命令

庫管理mysql

一、查看已有庫;
            show databases;
            
    二、建立庫並指定字符集;
            create database 庫名 charset utf-8;
            create database 庫名 character set utf-8;
            
    三、查看當前所在庫;
            select database();
            
    四、切換庫;
            use 庫名;
            
    五、查看庫中已有表;
            show tables;
            
    六、刪除庫;
            drop database 庫名;

表管理面試

一、建立表並指定字符集;
            create table 表名(字段名,字段類型,其餘) charset = utf-8;
            
    二、查看建立表的語句 (字符集、存儲引擎);
            show create table 表名;
            
    三、查看錶結構;
            desc 表名;
            
    四、刪除表;
            drop table 表名,表名2;

表記錄管理sql

一、增 : insert into 表名(字段名) value(),();
    
    二、刪 : delete from 表名 where 條件;
    
    三、改 : update 表名 set 字段名=值 where 條件;
    
    四、查 : select 字段名 from 表名 where 條件;

表字段管理(alter table 表名)數據庫

一、增 : alter table 表名 add 字段類型 first|after 字段名;
    
    二、刪 : alter table 表名 drop 字段名;
    
    三、改 : alter table 表名 modify 字段名 字段類型;
     
    四、表重命名: alter table 表名 rename 新表名;

五、數據類型

四大數據類型編程

  • 數值類型
int [4字節] 
smallint[2字節]  
bigint[8個字節]
tinyint[1個字節]
  • 字符類型
char()  
定長: char(4) 存3個字符 abc;
            'abc '【長度不足,填充空格】
            注意:select 取值時mysql將空格去掉!
            'ddd '---預期顯示'ddd ',實際顯示---'ddd'
            
            
varchar(4)
多出一個字節,專門存儲當前這個字段實際存儲長度
  • 枚舉類型
enum
set
  • 日期時間類型
date
datetime
timestamp
time
year

日期時間函數iphone

NOW()當前時間
CURDATE()
YEAR(字段名)
DATE(字段名)
TIME(字段名)

日期時間運算編程語言

select * from 表名 where 字段名 運算符(NOW()-interval 間隔);
間隔單位: 1 day | 3 month | 2 year
eg1:查詢1年之前的用戶充值信息
        select * from user where time < (NOW()-interval 1 year);

六、MySQL運算符

  • 數值比較
> >= < <= = !=
students表名
score 字段名
eg1 : 查詢成績不及格的學生
            select * from students where score < 60;
      
eg2 : 刪除成績不及格的學生
            delete from students where score < 60;
      
eg3 : 把id爲3的學生的姓名改成 周芷若
            update students set name = '周芷諾' where id = 3;
  • 邏輯比較
and  or
eg1 : 查詢成績不及格的男生
            select * from students where score < 60 and gender = 'male';
eg2 : 查詢成績在60-70之間的學生
            select * from students where score >= 60 and score <= 70;
  • 範圍內比較
between 值1 and 值2 、in() 、not in()
eg1 : 查詢不及格的學生姓名及成績
            select * name,score from students where  score between 0 and 59;
            
eg2 : 查詢AID19和AID18班的學生姓名及成績
            select name,score from students where class in ('AID19','AID18');
  • 模糊比較(like)
where 字段名 like 表達式(%_)
eg1 : 查詢北京的姓趙的學生信息
            select * from students where name like '趙%';
  • NULL判斷
is NULL 、is not NULL
eg1 : 查詢姓名字段值爲NULL的學生信息
            select * from students where name is NULL;

七、查詢

  • order by

給查詢的結果進行排序(永遠放在SQL命令的倒數第二的位置寫)

order by 字段名 ASC/DESC
eg1 : 查詢成績從高到低排列
            select * from students order by score DESC;
  • limit

限制顯示查詢記錄的條數(永遠放在SQL命令的最後寫)

limit n :顯示前n條
limit m,n :從第(m+1)條記錄開始,顯示n條
分頁:每頁顯示10條,顯示第6頁的內容
            limit (6-1)*10,10;
            
            每頁顯示a條,顯示第b頁的內容
            limit (b-1)*a,a;

MySQL高級-Day01

MySQL基礎鞏固

  • 建立庫 :country(指定字符編碼爲utf8)

  • 建立表 :sanguo 字段:id 、name、attack、defense、gender、country
    要求 :id設置爲主鍵,並設置自增加屬性

    id int primary key auto_increment,

  • 插入5條表記錄(id 1-5,name-諸葛亮、司馬懿、貂蟬、張飛、趙雲),攻擊>100,防護<100)

  • 查找全部蜀國人的信息

    select * from sanguo where country='蜀國';
  • 將趙雲的攻擊力設置爲360,防護力設置爲68

    update sanguo set attack = 360,defense=68 where name='趙雲';
  • 將吳國英雄中攻擊值爲110的英雄的攻擊值改成100,防護力改成60

    update sanguo set attack =100,defense=60 where attack=110 and country='吳國';
  • 找出攻擊值高於200的蜀國英雄的名字、攻擊力

    select name,attack from sanguo where attack>200 and country='蜀國';
  • 將蜀國英雄按攻擊值從高到低排序

    select * from sanguo where country='蜀國' order by attack DESC;
  • 魏蜀兩國英雄中名字爲三個字的按防護值升序排列

    select * from sanguo where country in('蜀國','魏國') and name like '___' order by defense ASC;
  • 在蜀國英雄中,查找攻擊值前3名且名字不爲 NULL 的英雄的姓名、攻擊值和國家

    select name,attack,country from sanguo 
    where country='蜀國' 
    and name is not NULL 
    or order by attack DESC 
    limit 3;

MySQL普通查詢

三、select ...聚合函數 from 表名
    一、where ...
    二、group by ...
    四、having ...
    五、order by ...
    六、limit ...;
    左邊是執行順序,右邊是寫的順序
  • 聚合函數
方法 功能
avg(字段名) 該字段的平均值
max(字段名) 該字段的最大值
min(字段名) 該字段的最小值
sum(字段名) 該字段全部記錄的和
count(字段名) 統計該字段記錄的個數

eg1 : 找出表中的最大攻擊力的值?

select max(attack) from sanguo;

eg2 : 表中共有多少個英雄?

select count(name) from sanguo;

eg3 : 蜀國英雄中攻擊值大於200的英雄的數量

select count(id) from sanguo where country='蜀國' and attack >200;
  • group by

給查詢的結果進行分組
eg1 : 計算每一個國家的平均攻擊力

select country,avg(attack) from sanguo group by country;

eg2 : 全部國家的男英雄中 英雄數量最多的前2名的 國家名稱及英雄數量

select country,count(id) as number
from sanguo 
where gender='m' group by country 
order by number DESC 
limit 2;

​ 注意:

​ group by後字段名必需要爲select後的字段一致
​ 查詢字段和group by後字段不一致,則必須對該字段進行聚合處理(聚合函數)

  • having語句

對分組聚合後的結果進行進一步篩選

eg1 : 找出平均攻擊力大於105"having avg (attack) >105"的國家的前2名,顯示國家名稱和平均攻擊力
            select country,avg(attack) from sanguo group by country having avg(attack)>105 order by avg(attack) DESC limit 2;

注意

having語句一般與group by聯合使用
having語句存在彌補了where關鍵字不能與聚合函數聯合使用的不足,where只能操做表中實際存在的字段,having操做的是聚合函數生成的顯示列
  • distinct語句

不顯示字段重複值

eg1 : 表中都有哪些國家
            select distinct country from sanguo;
            
eg2 : 計算一共有多少個國家
            select count(distinct country) from sanguo;

注意

distinct和from之間全部字段都相同纔會去重
distinct不能對任何字段作聚合處理
  • 查詢表記錄時作數學運算

運算符 : + - * / % **

eg1: 查詢時顯示攻擊力翻倍
            select name,attack*2 from sanguo;
  
eg2: 更新蜀國全部英雄攻擊力 * 2
            update sanguo set attack=attack*2 where country='蜀國';

索引概述

  • 定義

對數據庫表的一列或多列的值進行排序的一種結構B+樹(Btree方式)

傳統B樹的特色:

1,每一個節點能存儲多個索引且包含數據,因爲該特性,促使樹的高度比二叉樹矮,從而下降了磁盤的IO查找。

2,可是因爲每一個節點存儲了數據。。。

B+樹

1,節點內只存儲索引,不存儲數據,從而單個節點能存儲的索引數量遠遠大於B樹

2,數據均存儲在葉子節點中,而且有序的相連【範圍查詢效果棒!】

  • 優勢

加快數據檢索速度

  • 缺點
佔用物理存儲空間(/var/lib/mysql)
當對錶中數據更新時,索引須要動態維護,下降數據維護速度
  • 索引示例
# cursor.executemany(SQL,[data1,data2,data3])
# 以此IO執行多條表記錄操做,效率高,節省資源
一、開啓運行時間檢測
  mysql>show variables like '%pro%';
  mysql>set profiling=1;
二、執行查詢語句(無索引)
  select name from students where name='Tom99999';
三、查看執行時間
  show profiles;
四、在name字段建立索引
  create index name on students(name);
五、再執行查詢語句
  select name from students where name='Tom88888';
六、查看執行時間
  show profiles;

索引分類

普通(MUL) and 惟一(UNI)

  • 使用規則
一、可設置多個字段
二、普通索引 :字段值無約束,KEY標誌爲 MUL
三、惟一索引(unique) :字段值不容許重複,但可爲 NULL
                    KEY標誌爲 UNI
四、哪些字段建立索引:常常用來查詢的字段、where條件判斷字段、order by排序字段
  • 建立普通索引and惟一索引

建立表時

create table 表名(
字段名 數據類型,
字段名 數據類型,
index(字段名),
index(字段名),
unique(字段名)
);

已有表中建立

create [unique] index 索引名 on 表名(字段名);
  • 查看索引
一、desc 表名;  --> KEY標誌爲:MUL 、UNI
二、show index from 表名\G;
  • 刪除索引
drop index 索引名 on 表名;

主鍵(PRI)and自增加(auto_increment)

  • 使用規則
一、只能有一個主鍵字段
二、所帶約束 :不容許重複,且不能爲NULL
三、KEY標誌(primary) :PRI
四、一般設置記錄編號字段id,能惟一鎖定一條記錄
  • 建立

建立表添加主鍵

create table student(
id int auto_increment,
name varchar(20),
primary key(id)
)charset=utf8,auto_increment=10000;##設置自增加起始值

已有表添加主鍵

alter table 表名 add primary key(id);

已有表操做自增加屬性

一、已有表添加自增加屬性
  alter table 表名 modify id int auto_increment;
二、已有表從新指定起始值:
  alter table 表名 auto_increment=20000;
  • 刪除
一、刪除自增加屬性(modify)
  alter table 表名 modify id int;
二、刪除主鍵索引
  alter table 表名 drop primary key;

今日做業

  • 一、把今天全部的課堂練習從新作一遍
  • 二、面試題

有一張文章評論表comment以下

comment_id article_id user_id date
1 10000 10000 2018-01-30 09:00:00
2 10001 10001 ... ...
3 10002 10000 ... ...
4 10003 10015 ... ...
5 10004 10006 ... ...
6 10025 10006 ... ...
7 10009 10000 ... ...

以上是一個應用的comment表格的一部分,請使用SQL語句找出在本站發表的全部評論數量最多的10位用戶及評論數,並按評論數從高到低排序

備註:comment_id爲評論id

​ article_id爲被評論文章的id

​ user_id 指用戶id

  • 三、操做題

綜述:兩張表,一張顧客信息表customers,一張訂單表orders

表1:顧客信息表,完成後插入3條表記錄

c_id 類型爲整型,設置爲主鍵,並設置爲自增加屬性
c_name 字符類型,變長,寬度爲20
c_age 微小整型,取值範圍爲0~255(無符號)
c_sex 枚舉類型,要求只能在('M','F')中選擇一個值
c_city 字符類型,變長,寬度爲20
c_salary 浮點類型,要求整數部分最大爲10位,小數部分爲2位

表2:顧客訂單表(在表中插入5條記錄)

o_id 整型
o_name 字符類型,變長,寬度爲30
o_price 浮點類型,整數最大爲10位,小數部分爲2位
設置此表中的o_id字段爲customers表中c_id字段的外鍵,更新刪除同步
insert into orders values(1,"iphone",5288),(1,"ipad",3299),(3,"mate9",3688),(2,"iwatch",2222),(2,"r11",4400);

增刪改查題

一、返回customers表中,工資大於4000元,或者年齡小於29歲,知足這樣條件的前2條記錄
二、把customers表中,年齡大於等於25歲,而且地址是北京或者上海,這樣的人的工資上調15%
三、把customers表中,城市爲北京的顧客,按照工資降序排列,而且只返回結果中的第一條記錄
四、選擇工資c_salary最少的顧客的信息
五、找到工資大於5000的顧客都買過哪些產品的記錄明細         
六、刪除外鍵限制            
七、刪除customers主鍵限制
八、增長customers主鍵限制c_id
相關文章
相關標籤/搜索