軟件測試常用的sql語句


一.數據庫基礎(mysql)

1.windows命令行連接服務器

  • mysql -h&ip -p&port -u&用戶名 -p
    • -h (host) 連接的ip localhost
    • -p (port) 端口號 3306
    • -u (username) 用戶名 root
    • -p (password) 密碼 123456
  • 如果在本地登錄,直接寫mysql -uroot -p

2.數據庫的執行原理

  • 數據服務器提供服務,客戶端連接到數據庫服務器。向服務器發送sql語句,服務器執行SQL,返回結果。

3.字段類型

  • 整型
    • 整型

      占用字節

      范圍

      范圍

      tinyint

      1

      -27~27-1

      -128~127

      smallint

      2

      -215~215-1

      -32768~32767

      mediumint

      3

      -223~223-1

      -8388608~8388607

      int

      4

      -231~231-1     

      -2147483648~2147483647

      bigint

      8

      -263~263-1

    • 顯示寬度最小的顯示位數,比如int(11)最少用11位數字顯示值。

    • 顯示的時候不夠11位以0填充

    • 顯示寬度必須結合zerofill才起作用

  • 無符號數(unsigned)
    • 無符號數就是沒有負數,無符號數的正數的范圍是有符號數正數范圍的2 

      create table t4(

      id tinyint(255)unsigned

      );

    • unsigned的在sql中的使用方法:

      tinyint unsigned

 

      mediumint unsigned

 

      int unsigned;

 

  • 浮點數

浮點數

占用字節

范圍

float(單精度)

4

-3.4E+38~3.4E+38

double(雙精度)

8

-1.8E+308~1.8E+308

 

 

    • 浮點數的聲明float(M,D)double(M,D)

 

      M:總位數 D:小數位數 M-D:整數位數

      例如:float(9,3) 一共9位數,小數3,整數6.

 

           double(9,3) 一共9位數,小數3,整數6.

    • 精度問題:float 只有 6~7位可信數

           double 14~15位可信數據

  • 定點型-保存小數
    • 主要用於存儲金額
    • decimal(M,D) D位小數,M-D位整數,總共M

    • M的最大值是65D的最大值是30,默認是(10,0)

4.字符型

  •  字符集:字符到二進制的編碼的集合,叫字符集
    • latin1 使用1個字節表示字符,gbk使用2個字節表示字符,utf8使用3個字節表示字符,如果有6個字節,gbk中可以存3個漢字,utf8可以存兩個漢字

    • mysql支持 40種字符集,查詢語法:show charset;
    • 客戶端設置字符集是為了告訴服務器,我要用哪個字符集來跟服務器溝通,設置字符集:set names utf8;
  • 定長和變長字符串
    • 定長char(L):有多少空間就占用少空間,不會回收剩余的空間。L的最大長度是255字符,utf8中一個字符相當於3個字節,gbk中一個字符相當於2個字節
    • 變長varchar(L):如果空間沒用完,剩余的空間,mysql會回收。L:最多字符數,理論最大長度是65535字節,但事實上達不到
    • 一般我們不能確定插入的值的長度,要用varchar

  • text型-保存長文本

數據類型

描述

char(L)

定長字符

varchar(L)

可變長度字符

tinytext

大段文本(大塊數據)   28-1=255個字符

text

大段文本(大塊數據)   216-1=65535個字符

mediumtext

224-1

longtext

232-1

  •  枚舉enum-相當於單選
    • 語法:enum(選項)

      

    • 意義:只能選擇指定的值的一個
    • 優點可以控制插入的數據;節省保存數據的空間;可以提高查詢的速度。
  • 集合set-相當於多選
    • 語法:set('值1','值2',,,)
    • 創建表

      

    • 插入數據

       

  •  日期時間

數據類型

描述

datetime

日期時間   占8個字節

0001-01-01 00:00:01 ~ 9999-12-31 23:59:59

date

日期

time

時間

year

年份,占用1個字節

timestamp

時間戳,占用4個字節

最大值1970-01-01 00:00:01 ~ 2038-01-19 11:14:07

5.列屬性

 

6.運算符

  • 運算符
    • 算數運算符:+   -  *  /  % 取余/取模
    • 關系運算符:> ≥ < ≤ !=
    • 邏輯運算符
      • &&  and  兩個條件都滿足

      • ||    或 or    兩個條件滿足一個

      • !    not   取反

  • 小括號()

    小括號內優先級最高

  • 別名as

    可以對表名,字段名使用as來取別名,可以解決重名問題。取別名as可省略

7.索引

 

二.基礎語句(sql)

1.語法

  select 選項 from 表名 [where 條件] [group by 字段名] [having 條件] [order by 字段] [limit 參數];

2.字段列表

  from子句;distinct;聚合函數-做一些統計

聚合函數

描述

sum()

求和

avg()

求平均值

max()

最大值

min()

最小值

count()

記錄數

3.where條件

  • 關系和邏輯運算:對值進行過濾,符合條件的就查詢出來。所有的關系運算,都可以使用到where條件里面。
  • 空和非空:is null和is not null
  • 在和不在:in和not in
    • in 在......范圍內:where 字段 in('值1','值2')
    • not in 不在......范圍內:where 字段 not in('值1','值2')
  • between和not between
    • 在什么范圍 -- 數值型,日期時間
    • 語法: ....where 字段 between 1 and 2.  在什么范圍之內
    • 語法: ....where  字段 not between 1 and 2.  不在什么范圍之內

  • 通配符
    • 下划線(_):匹配一個字符
    • 百分號(%):匹配多個字符(包括沒有字符) 
  • 模糊查詢(like)
    • ......where 字段 like '值'; 值一般使用通配符
  • group by 分組: ......[where 條件] group by 字段
    • select sex,group_concat(name) name from stu group by sex;通過分組顯示男的所有成員的姓名和女的所有成員的姓名,使用group_concat()函數將同一組的值連接起來
    having條件:對查詢結果進行篩選
    • where:查找的范圍是當前表中的字段
    • having:查找的范圍是select后面的選項(即查詢結果)作為條件查找
    order by排序:...表名 order by 字段 as || desc
    • asc:升序,默認,從小到大,可省略不寫
    • desc:降序,從大到小
  • limit限制:...... limit 起始位置,個數; 如果開始位置為0,可以省略
    • select * from stu order by age desc limit 3;首先降序
    • limit m,n:從m開始向后取n條數據
    • 從表中查詢的結果都是從0開始排序

4.數據庫操作

  • 創建數據庫:creat database [if not exists] '數據庫名'  charset=字符編碼;
    • 數據庫名是關鍵字或特殊符號需要,一般不需要反引號
    • if not exists,創建了一個已經存在的數據庫,此命令不報錯且不覆蓋
  • 查看數據庫:show database;
    • 數據的本質是文件夾
  • 查看創建數據庫的sql語句:show creat database 數據庫名;
  • 數據庫修改-修改字符集:alter database 數據庫名 charset-字符集;
  • 刪除數據庫:drop database [if exists] '數據庫名';
    • if exists刪除之前判斷一下,存在就刪除

5.表的操作

  • 數據庫的選擇:use '數據庫名';
  • 創建表:creat table 表名(字段列表) [values('','',,,)]
    • creat table ceshi(id int);
    • 表也是以文件的形式保存的
  • 查看所有表:show tables;
  • 查看創建表的sql語句:show creat table 表名[\G];
    • 加上\G則不需要分號
  • 查看表結構:desc 表名;
    • desc即describe
  • 修改表名:alter table 原表名 rename to 新表名;
  • 修改表的字符集:alter table 表名 charset=新字符集;
  • 修改字段屬性:alter table 表名 modify 字段名 新數據類型;
  • 修改字段名稱和屬性:alter table 表名 change 原字段 新字段 新屬性;
  • 表引擎修改:alter table 表名 engine=新引擎;
    • mysql引擎分為:MyISAM:查詢的速度比較快; InnoDB:新的引擎,主要維護數據的安全。
  • 刪除表:drop table [if exists] 表名;
  • 刪除多個表:drop table 表1,表2,,,;
  • 添加表字段:alter table 表名 add 字段名 數據類型;
  • 刪除字段:alter table 表名 drop 字段;
  • 修改字段:alter table 表名 change 字段名 新字段名 新數據類型;

6.數據操作

  • 創建一個表:

    creat table ceshi(

      id int,

      name varchar(20),

      hobby varchar(10),

      addr char(10)

      );

  • 插入1-n條數據:

    insert into 表名(字段列表) values(字段列表1),(字段列表2),,,

    • 值和字段一定一樣,他倆一致則再添加可以省略字段
    • insert into ceshi(id,name,hobby,addr) values(1,'玉環','吃荔枝','唐朝');
  • 查看表數據:select * from 表名 [where 條件];
  • 漢字亂碼要給顯示框設置字符集:set names utf8;
  • 更新數據:update 表名 set 字段1=值1,字段2=值2,,, where 條件;
  • 刪除數據:delete from 表名 where 條件;
    • 注意添加where條件,沒有條件則全表刪除
  • 給字段(或者表)起別名:select id as '新id',name as '新名字,hobby as '新愛好',addr as '新地址' from ceshi;
  • 去除重復的數據:select distinct name,hobby from ceshi;

7.子查詢

  • 在一個select語句中,嵌入了另外一個select語句,那么被嵌入的select語句稱之為子查詢語句
  • select * from stu where math>(select avg(math) from stu);
      • ......where 字段=some || any || all(子查詢);
        • some:一些,any:任何,all:所有
        • some和any等同於in,not in可以寫成!=all
      • ......where exists || not exists
    • exists:存在,not exists:不存在

8.連表查詢

  •  連接的作用:當查詢結果的列表來源於多張表時,需要將多張表連接一個大的數據集,再選擇合適的列返回
    • 內連接查詢:查詢的結果為兩個表重疊部分匹配到的數據
    • 左連接查詢:查詢的結果為兩個表匹配到的數據加左表特有的數據,對於右表中不存在的數據使用null填充
    • 右鏈接查詢:查詢的結果為兩個表匹配到的數據加右表特有的數據,對於左表中不存在的數據使用null填充
  • 內連接:select 選項 from 表1 inner join 表2 on 表1.相同字段=表2.相同字段;
  • 左連接:select 選項 from 表1 left join 表2 on 表1.相同字段=表2.相同字段; 
    • 左表數據全部取出,右表只要符合條件的,沒有的用null
  • 右連接:select 選項 from 表1 right join 表2 on 表1.相同字段=表2.相同字段;
    • 右表數據全部取出,左表只要符合條件的數據,沒有的用null
  • 兩張表中的字段名是一樣的可以簡寫成using形式
    • select * from student right join scores using(studentno);
  • 笛卡爾積:多表中數據排列組合,結果是字段連接,行數相乘,通過where條件,可以篩選出我們需要的數據
    • select * from table1,table2 where 連接條件

9.事務

10.視圖view

11.函數

  • select 函數名() from ...;
  • 聚合函數:
    • sum(expr): 求和

 

    • avg(expr): 求平均數
    • max(expr)  求最大值
    • min(expr)  獲取最小
  • 數值處理:rand()隨機數
    • 隨機排序:select * from 表名 order by rand();  隨機數:select rand()...
    • 四舍五入round():select round()

 

  • 字符處理:
    • 左邊截取:left('字段',長度)
    • 右邊截取:right('字段',長度)
    • 查看字節長度:select length('字段') '字節長度';
    • 查看字符長度:select char_length('字段') '字符長度';
    • 字段拼接:select group_concat(字段) from 表名;
  • 加密函數
    • select md5(密碼);
    • select password(密碼);

12.外鍵

二.工作中遇到的較復雜語句(postgresql)

1.with

  • sql語句

    WITH type as (select DISTINCT on(kbid) * from rptsvc_leak_event ORDER BY kbid,event_time desc) SELECT leak_type,count(*) FROM type GROUP BY leak_type

    

  • 解釋
    • 括號中的語句:select DISTINCT on(kbid) * from rptsvc_leak_event ORDER BY kbid,event_time desc,按照event_time降序、且對kbid去重后,返回所有內容。注意:order by之后一定要加kbid,不然報錯。

    

    • with后用as 將括號中的sql語句賦值給type,即type是一個新表。
    • 這整個with語句可以替換成:

      SELECT leak_type,count(*) FROM (select DISTINCT on(kbid) * from rptsvc_leak_event ORDER BY kbid,event_time desc) as type GROUP BY leak_type,

      同樣也要注意加as,不然語句不正確

2.row_number() over

  • sql語句

    select *, row_number() over(partition by gid,mid,kbid ORDER BY event_time desc ) from rptsvc_leak_event

    

  • 解釋
    •  row_number() over(partition by gid,mid,kbid ORDER BY event_time desc ):先按照kib,gid,mid分組、且按照event_time降序排序,再為返回的內容每條給一個序號,每組的序號都是從1開始。

3.jsonb

  • sql語句

   select victim_ip from alarms where victim_ip @>'["203.208.41.46"]'::jsonb;

    

  • 解釋
    • 當某個字段是jsonb類型時,要查詢包含某內容的所有字段。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM