1. 程式人生 > >SQL 基礎知識 速查手冊

SQL 基礎知識 速查手冊

本文為了閱讀和書寫方便使用了小寫,SQL不區分大小寫,但是工程師需要標準書寫。
0、登入
      命令:mysql -u root -h 10.161.24.231 -p 
               unicom123
      幫助:  help 
      註釋:--  單行註釋 或 /*多行*/
      oracle資料庫不支援as,去掉as即可。
1、資料庫操作
     檢視: show databases;
     建立:create dababase db;
     使用:use db;
2、表的操作
    檢視:show tables;
    建立:create table st
               (
                  mkey   char(10)  not null,
                  c1        varchar(100)  ,
                  c2        int,
                  primary key(mkey)
                );
     *定義各列,並設定表約束。、
      常見約束:
      主鍵約束:非空、唯一。
      唯一約束:unique
      非空:not null
      預設值;default 0;
      型別:char varchar int integer date
      查看錶結構:desc st;
      修改-新增列
              alter table st add column (addc  int not null);
      修改-刪除列;
              alter table st drop column addc;
      插入資料:
              insert into st values("01","wang",100);
              insert into st values("02","wang2",null);
             *空值用Null代替,主鍵不能為空。
      查詢:select
      重新命名:rename table st to st2;
      刪除:drop table st2;
3、基本查詢規則

     基礎查詢:select xuehao,score from st1;
     設定別名: select xuehao as c1,score as c2 from st1;
     常數查詢:select "zuche" as changshu,xuehao as c1 from st1;
                     select 'haha' as h,xuehao from st1; 
     查詢結果去重複: select score from st1;
                               distinct:區別的、不同的、不重複的
                               select DISTINCT score from st1;
                               select DISTINCT score,date from st1;
                              *以結果行為標準 去除重複。
      條件:where
                select * from st1 where score >=99;
      算術運算:
      >1:+ - * /
                select score*2 from st1 where score >=99;
                select score*2 as sc2 from st1 where score >=99;
      >2:=  <>  >= <=
                select * from st1 where score <>99;
      >3:表示式
                select * from st1  where score*2>100;
      >4:字串按字典順序比較 :即 “1”<"11"<"2"
                select * from st1 where  name >"w" && name <"z";
                +----------+------+-------+------------+
                | xuehao   | name | score | day        |
               +----------+------+-------+------------+
                | 20180103 | wang |   100 | 2010-01-01 |
               +----------+------+-------+------------+
       >5: IS NULL  IS  NOT NNULL
                select * from st1 where name is not null;
                select * from st1 where name is null;
       >6: AND OR () 條件運算
                select * from st1 where name is not null and  score >90;
4、聚合查詢(除*號外,將自動排除列值為NULL的行)

     【1】函式:count() 統計行數  sum 求和 avg 平均值 max  min 極值
                      select count(*),max(score),avg(score) from st1;
     【2】排重distinct
                      select count(distinct score) from st1;
5、分組查詢
     【1】group by
                      select * from st1 group by score;
     【2】having 條件 
                      對分組後的資料指定條件 
     【3】區別:
             where用於指定行的條件,其條件可包含任意列,但不能包含聚合函式。
             select name as c1 from st1 where name<>"wang";
             having 用於指定組條件,且列的條件必須來自group的列或select 列,可以使用聚合函式。
             select day  as c1 from st1 group by score having score<120;來自group by 執行正確。
             select name as c1 from st1 group by score having name<>"wang"; 來自select 執行正確。

            select day  as c1 from st1 group by score having name<>"wang";

            //執行錯誤; Unknown column 'name' in 'having clause'

            二者都不能用別名。
       【4】使用聚合函式:select * from st1 group by score having count(score)>2;
6、排序查詢
         order by :select * from st1 order by score;
         降序desc:select * from st1 order by score desc;
         升序asc:select * from st1 order by score asc;
         使用聚合函式:
         /*按個數排序*/select *,count(score) from st1 group by score order by count(score) desc;
         可以使用別名:select *,count(score) c1 from st1 group by score  order by c1;
7、資料操作
  【1】插入資料:  (列清單)==(值清單)
      格式:insert  into st1 (列x,列y,..)  values(值x,值y,..);
 預設時,需全部值且必須按順序輸入,空用NULL代替。
      insert into st1 values("21321332","qeare",80,"20130203");
 列項輸入,無需全部輸入且按列清單順序輸入,但預設自動填充NULL。
 insert into st1 (xuehao,score) values("21321432",65);
  【2】設定預設值
       方法1:利用約束設定。
  create table st 
       (
           name char(10) not null,
           score int default 0
       );
       insert into st (name) values("ZHANGSAN");
  方法2:插入設定。
  insert into st  values("ZHANGSAN",default);
  錯誤:值不會被設定預設值而是null。
  insert into st  values("ZHANGSAN",null);
  【3】複製資料 insert select 
       create table st2 ( name char(10) not null,jishu int);
  insert into st2 (name,jishu) select name,score from st where score is not null;
  *原理:遍歷使用select來生成值清單。
  【4】刪除資料(按行刪除)---delete from table where cond;
        刪除部分資料:
delete from st1 where name is null;
刪除全部資料:truncate st2;
刪除全部資料和表:drop table st;
  【5】修改資料
       update st1 set day="20130102";    
       update st1 set score=60 where score is null;  
  --  多列修改
  update st1 set name="ddas",score=121 where xuehao=20180204;
  【6】事物
   原子性 獨立性 多條SQL執行不被打斷。
   start transaction
         insert/delete/update/
...
   commit/rollback;
   注意:不同資料庫事物開始語句不同,Oracle可省略。
         commit 執行後,SQL結果會儲存。
rollback,可撤銷/回滾SQL執行結果,不儲存。
8、複雜查詢:
  【1】檢視理論:
   原理:檢視儲存的是一條select語句,當查詢時會臨時建立一個臨時表。該表不做任何儲存。
         檢視的目的在於簡化操作、安全等等但不會加快查詢速度。
檢視之上建立檢視->多重檢視嚴重影響效率。
   限制條件:
         (1)檢視資料無順序性,多數系統不支援group by 語句。
(2)限制更新操作
     原理:無法保證檢視資料與實際表之間資料的一致性!
 可更新需滿足條件:未使用distinct,from只有一張表,未使用group by  having語句。
  【2】檢視操作:
       建立:creat view 檢視名(檢視列1,檢視列2...) AS select (對應列1,列2...) from ...
             create view v(name,num) as select name,xuehao from st1;
  使用: select * from v;
  刪除:drop view v;
 【3】巢狀查詢/子查詢
      從查詢結果中再查詢:
 格式:select ..from (巢狀子查詢語句) [as] 子查詢生成結果存放的臨時表
 select * from (select name from st1) as st2;
 注意:mysql可省略as,oracle不支援as.
 【4】標量查詢
      標量:查詢結果只能一行一列,即是標量。
 原理:在查詢語句中會先執行標量查詢語句,計算這個標量,然後帶入到查詢語句中執行。
 select name,score from st1 where score>(select avg(score) from st1);
 分解執行:
    1.select avg(score) from st1;
         2.select name,score from st1 where score>164;
 select name,score,(select avg(score) from st1) from st1;
 分解執行:
    1.select avg(score) from st1;
    2.select name,score,164 from st1;
  【5】關聯子查詢
       關聯原由:子查詢語句引用了外部查詢語句的表。
  select name,score from st1 a where score>(select avg(score) from st1 b where a.day=b.day group by day);
  格式:定義:資料表 別名  引用:別名.列名 
  【*】標量查詢、關聯子查詢每條記錄都要執行一次子查詢,比較消耗資源。
9、函式(根據不同資料函式名稱/定義不同)
   算術函式:abs mod round
   字串函式:拼接concat、長度length、lower\replace
   日期函式: select current_time;/*返回當前時間*/
   轉換函式:
   cast:型別轉換:select cast(xuehao as signed int )from st1;
   coalesce:將null轉換成其他值。
   select coalesce(name,"noname") from st1;
10、謂詞
   【1】like
        需使用模式匹配 %代表0及以上字元  _代表一個字元
select * from st1 where name like "g%";
select * from st1 where name like "gan_";
   【2】between  and
   select * from st1 where score between 100 and 160;
   【3】 is null is not null
   【4】in  not in
        in(值1,值2..) 資料為值1或值2或..
not in  否之。 
select * from st1 where score in(121,158);
應用到子查詢:!只能有一列。
select * from st1 where score in (select score from st1 where score>190);
   【5】exists not exist 是否存在記錄
11、CASE表示式 分情況查詢
    類似於巨集,當一行表示式滿足when的一個條件時,則執行此表示式。
    select case when 條件 then 表示式
           when 條件 then 表示式
...
else 表示式
end as somename  from table;
select case 
          when score>150 
  then concat(xuehao,name)  
  else concat(name,xuehao) 
end 
as testcase from st1;
12、集合運算(針對列的操作) 
    集合運算時select兩端 列數、型別必須一一對應。
加法:UNION
特點:列數、型別必須一一對應,order by 只能放在最後一條語句。
select xuehao from st1 union select xuehao from st2 order by xuehao;
特點:沒有重複的資料
全加: union all
特點:顯示重複的資料,顯示全部資料。
交集:intersect
差集:except
13、連線操作(針對行的操作)
    內連線:根據連線條件,兩張表格分別提取各自資料把符合連線條件的資料拼接組合成一張表格。
連線條件使用ON.
select * from st1  inner join st2 on st1.xuehao=st2.xuehao;
外連線:保留主表的全部資料,提取附表的資料,把符合連線條件的資料拼接到主表上,其餘用NULL補充。
主表選擇使用:left\right 關鍵字。
select * from st1  right outer join st2 on st1.xuehao=st2.xuehao;
select * from st1  left outer join st2 on st1.xuehao=st2.xuehao;
交叉連線:cross join 或預設省略
多表連線:配合使用別名完成多表連線操作。 
14、視窗函式(OLAP函式)
    格式:<視窗函式> over ([partition by 列清單]  order by 排序列)
視窗函式有:聚合函式,專用函式(RANK 等)
原理:視窗函式是在select執行結果後執行的,是對查詢結果的呈現。
Rank() 函式:
    partition決定操作範圍,order排序方式。
select *, rank() OVER(partition by day order by score) as ranking from st1;/*mysql不支援*/
*放在高階SQL高階部分。
15、grouping運算子(超組)
    用於group by 配合使用,完成其不具備的聚合功能。
此功能在於會將所有group by 列的結果都執行聚合效果。
彌補了使用group by 語句後不能對分組和全域性一併聚合操作的缺點。
roolup:合計行函式
select name,sum(score) as zongfen from st1 group by roolup(day);
等效於:select name,sum(score) as zongfen from st1 group by ();
       select name,sum(score) as zongfen from st1 group by day;
grouping 函式,將Null置0,其餘為1.
cube:積木函式 等。
16、Java連線MySQL方法
    1.import jdbc 包
2.定義:
連線物件:connect 
執行宣告:statement 
返回結果:resultset
    3.載入驅動:class.forname(驅動名);
4.獲取連線:con==getconnet..(uRL,usr,password);
      建立宣告:con.creates..
    5.執行SQL:result==executexxx(sql...)
6.分析結果:result.getxxx("id")
7.關閉:結果-》宣告-》連線 close順序
17、儲存過程與觸發器
    儲存過程是預編譯的,執行速度較快.
語法:DELIMITER分隔符,防止SQL語句被執行.
格式:
DELIMITER //
    CREATE PROCEDURE  過程名([[IN|OUT|INOUT] 引數名 資料型別[,[IN|OUT|INOUT] 引數名 資料型別…]]) 
[特性 ...] 
    begin
SQl...
end
    DELIMITER 
觸發器:當插入更新時觸發執行一段SQL語句,可在事件之前或之後執行.
Create trigger triggerName
    After/before insert/update/delete  //定義觸發條件 
on 表名  
    For each row #這句話是固定的
    Begin
    Sql語句; # 一句或多句,insert/update/delete範圍內
    End;
    刪除觸發器:
    Drop trigger 觸發器名
    檢視觸發器
    Show triggers
18、索引
  索引屬於資料庫高階部分。
  【1】概念
    索引會佔用一定的空間。
優勢:當wherei條件查詢時,沒有索引,查詢資料會全表遍歷,有索引會直接跳轉。
特點:經常被查詢的主鍵、外來鍵、分組的列可以建立索引。
     頻繁更新的列、多重複、數值小長的列不建議建立索引。
    聚集索引:建立索引後,插入資料表會重新排序,儲存記錄是連續的,像字典。
非聚集索引:插入資料值記錄指標,資料不連續,像指標表。
單列索引:只有一列
組合索引:多個列
全文索引:
按索引建立方式分類:B-tree、HASH、點陣圖索引等。
  【2】建立索引
    SQL server方式:
CREATE [UNIQUE][CLUSTERED | NONCLUSTERED]  INDEX  index_name  
    ON {table_name | view_name} [WITH [index_property [,....n]]
    說明:
       UNIQUE: 建立唯一索引。
       CLUSTERED: 建立聚集索引。
       NONCLUSTERED: 建立非聚集索引。
       Index_property: 索引屬性。
Mysql方式:
CREATE INDEX IndexName ON `TableName`(`欄位名`(length)) ;
ALTER TABLE TableName ADD INDEX IndexName(`欄位名`(length));//普通索引
CREATE UNIQUE INDEX account_UNIQUE_Index ON `award`(`account`);//唯一索引
CREATE INDEX IndexName On `TableName`(`欄位名`(length),`欄位名`(length),...);//組合索引
全文索引:前面只能用length針對列的前幾個字元,不能對where column lick '%xxxx%'使用。
               故建立全文索引。
     ALTER TABLE tablename ADD FULLTEXT(column1, column2);
  【3】刪除索引  
    SQL server方式:
 DROP INDEX table_name.index_name;
Mysql方式:
 DORP INDEX IndexName ON `TableName`;
19、SQL執行順序
    FROM:對FROM子句中的前兩個表執行笛卡爾積(Cartesian product)(交叉聯接),生成虛擬表VT1
    ON:對VT1應用ON篩選器。只有那些使<join_condition>為真的行才被插入VT2。
    OUTER(JOIN):
    WHERE:對VT3應用WHERE篩選器。只有使<where_condition>為true的行才被插入VT4.
    GROUP BY:按GROUP BY子句中的列列表對VT4中的行分組,生成VT5.
    CUBE|ROLLUP:把超組(Suppergroups)插入VT5,生成VT6.
    HAVING:對VT6應用HAVING篩選器。只有使<having_condition>為true的組才會被插入VT7.
    SELECT:處理SELECT列表,產生VT8.
    DISTINCT:將重複的行從VT8中移除,產生VT9.
    ORDER BY:將VT9中的行按ORDER BY 子句中的列列表排序,生成遊標(VC10).
    TOP:從VC10的開始處選擇指定數量或比例的行,生成表VT11,並返回呼叫者
20、資料庫管理
    字符集的問題:伺服器級、庫級、表級、列級。
引擎設定..
許可權管理:mysql資料庫:user、host、table_priv
賬號管理:GRANT語句或直接操作user表(不安全)
  GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
  GRANT ALL PRIVILEGES ON *.* TO 'admin'@'192.168.100.1' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;
檢視許可權、更改許可權:show grant for usrname;grant; revoke;
修改密碼:SET password for usrname=password("密碼”);
刪除賬號:drop user name;
資料匯入匯出:
工具使用:mysqldump.exe 
資料匯出:mysqldump -uroot -p -dtest  >xxx.sql
資料匯入:mysql -uroot -p -dtest<xxx.sql    
附錄1:redhat 安裝Mysql
     檢查當前系統已經安裝的mysql
    rpm -qa|grep -i mysql
    刪除已安裝的mysql
    rpm  -e --nodeps mysql-libs-5.1.71-1.el6.x86_64
    解壓縮安裝檔案
    tar -xvf MySQL-5.6.28-1.el6.x86_64.rpm-bundle.tar
    安裝MySQL
    rpm -ivh MySQL-server-5.6.28-1.el6.x86_64.rpm
    rpm -ivh MySQL-client-5.6.28-1.el6.x86_64.rpm
    service mysql start
    修改密碼:
    cat /root/.mysql_secret
    SET PASSWORD = PASSWORD('[email protected]');
    FLUSH PRIVILEGES;
    支援遠端訪問
    支援遠端訪問
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
本地YUM更新:
     http://blog.51cto.com/mrdeng/1792489
    配置YUM源伺服器
    /etc/yum.repos.d
附錄二:Mysql自帶資料庫
      information_schema:資料庫物件資訊
      mysql:使用者資訊
      performance_schema:效能表
 show VARIABLES like "character_set_client";
附錄三:資料型別:建議詳細學習。
       bit
  bool
  int
  bigint
  float double
  date time char 
  text:長文字
  set enum
  BLOB:二進位制大物件,圖片等。
附錄四:官網資料
        https://dev.mysql.com/doc/refman/5.6/en/help.html
        https://downloads.mysql.com/docs/refman-5.7-en.pdf

相關推薦

SQL 基礎知識 手冊

本文為了閱讀和書寫方便使用了小寫,SQL不區分大小寫,但是工程師需要標準書寫。0、登入       命令:mysql -u root -h 10.161.24.231 -p                 unicom123      幫助:  help       註釋:

機器學習 Python基礎1 Pandas DataFrame 常用方法手冊中文版

本文轉載自知乎文章 Pandas速查手冊中文版 ,原英文版 Pandas Cheat Sheet - Python for Data Science,在這基礎上加入了一些自己的理解。 Pandas 速查手冊 匯入資料 匯出資料 建立測試物件 檢視、

Keras cheat sheet(Keras 手冊

heat 打開 sset mage .com pdf .cn log amazon 轉自:https://s3.amazonaws.com/assets.datacamp.com/blog_assets/Keras_Cheat_Sheet_Python.pdf 右擊在新標

第16講++T-SQL基礎知識

from logs http splay msg 分享 ++ sel 學生表 分別定義一個整型變量和兩個字符型變量。 declare @name varchar(10) declare @age smallint , @msg

Pandas手冊中文版

文章 sheet ges .info count() ble 重要 標準 agg 本文翻譯自文章: Pandas Cheat Sheet - Python for Data Science ,同時添加了部分註解。 對於數據科學家,無論是數據分析還是數據挖掘來說,Pandas

awk手冊

連接數 txt -c 連接 查看 use 在一起 就是 net awk速查手冊 score.txt cat score.txt Marry 2143 78 84 77 Jack 2321 66 78 45 Tom 2122 48 77 71 Mike

GIT手冊

就是 form ads 1.0 重要 三種 rect 其他 指針 一、GIT 1.1 簡單配置 git是版本控制系統,與svn不同的是git是分布式,svn是集中式 配置文件位置 # 配置文件 .git/config 當前倉庫的配置文件 ~/.gitconfig 全局配置文

實用掌中寶--HTML&CSS常用標簽手冊 PDF掃描版

適合 維護 jin 第6章 bsp 知識 -h 講解 AR 實用掌中寶--HTML&CSS常用標簽速查手冊 內容推薦: 本書第一篇以語法和實例相結合的形式,詳細講解了HTML語言中各個元素及其屬性的作用、語法和顯示效果;第二篇從CSS基本概念開始,分別講解了CSS基

Sql-基礎知識

order creat esc ins 自動 into 類型 屬性 年齡 -- 數據庫(database):存儲數據的倉庫,-- 數據庫(database)--數據表(table)--列名(字段-field)--數據(值-value)--創建表--(在sqlite數據庫中創

sublime手冊

data sha 地方 mono man 列表 row advance 不用 零、sublime的優勢 容易上手 支持多點編輯 包管理:Package Control 速度快 深度可訂制,配置文件放github上 sublime-config 快速文件切換 cmd + p

pandas基礎命令

根據 位置 isn sha cat dataframe app 導出 fill pandas基礎命令速查表 數據的導入 數據的導出 創建測試對象 數據的查看與檢查 數據的選取 數據的清洗 數據的過濾(filter)排序(sort)和分組(group) 數據的連接(joi

4、numpy+pandas手冊

正態分布 矩陣轉置 chan pan union python 維度 argmax ndarray 《Python數據分析常用手冊》一、NumPy和Pandas篇 一、常用鏈接: 1.Python官網:https://www.python.org/

【轉載】匯編手冊

有效 查表 cal pxc 移位 寄存器 add 匯編 定義 一、數據傳輸指令 ─────────────────────────────────────── 它們在存貯器和寄存器、寄存器和輸入輸出端口之間傳送數據. 1. 通用數據傳送指令.

Python機器學習Numpy, Scipy, Pandas, Scikit-learn, Matplotlib, Keras, NN手冊

Python機器學習Numpy, Scipy, Pandas, Scikit-learn, Matplotlib, Keras, NN速查手冊   Numpy SciPy Scikit-Learn Pandas Keras Matp

console 手冊

// 用於輸出一個 js 物件列表* console.log(obj1 [, obj2, ..., objN); // // 一個 js 字串,其中包含0或多個不同型別的替代字串 // console.log('String: %s, Int: %d,Float: %f, Object: %o', str,

Git 常用命令手冊

哪些 常用命令 bsp 某個文件 status 如果 oba git add str 來源:https://www.jianshu.com/p/5ee9897b6b65 1、初始化倉庫 git init 2、將文件添加到倉庫 git add 文件名 #

SQL基礎知識整理

本文是對SQL相關內容的一個梳理。首先SQL語言的分類主要有四大類 DDL資料定義語言: 關鍵字有CREATE、ALERT、DROP建立一個新的表或者表的檢視或者物件; 操作資料庫 建立:create database mydb2 character set

sql 基礎增刪改語句

1.1【插入單行】insert [into] <表名> (列名) values (列值)例:insert into Strdents (姓名,性別,出生日期) values ('開心朋朋','男',

SAP - SD模組開發手冊

SAP - SD模組開發速查手冊 1. 相關表 VBAK:銷售訂單擡頭 VBAP:銷售訂單專案 VBUK:擡頭狀態 VBUP:行專案狀態 VBKD:銷售憑證:業務資料 VBPA:銷售憑證:合作伙伴 VBEP:銷售憑證:計劃行資料 LIKP

Git常用命令手冊

命令不斷更新中…… Git的四個組成部分 img 1、初始化倉庫 git init 2、將檔案新增到倉庫 git add 檔名 # 將工作區的某個檔案新增到暫存區    gi