sql分布
❶ MSsql查詢數值的分布情況
創建一個表WeightLevel,填充數據樣例如下,樣例中只包含了其中四條數據。
SelectLevelName,Count(Weight)
FromWeightLevel,表A
WhereWeight>=MinScoreAndWeight<=MaxScore
GroupByLevelName
OrderByLevelName
❷ 怎樣sql統計數據區間分布
select
count(case when time>=1 and time <=2 then muid end),
count(case when time>=2.1 and time <=3 then muid end),
count(case when time>=3.1 and time <=4 then muid end)
from table
❸ TDSQL TCA 分布式實例特點初探分布表和SQL透傳
TDSQL分布式實例通過Proxy介面提供和mysql兼容的連接方式,用戶通過IP地址、埠號以及用戶名、密碼進行連接:
(注意:公有雲TDSQL需要在實例頁面申請公網連接地址)
連接示例:mysql -h172.21.32.13 (proxy地址) -P3306(proxy埠) -utest (資料庫賬號) -p
與普通的mysql連接方法一致,分布式實例兼容mysql的協議和語法,支持SSL加密等功能。當然,您也可以使用navicat、 jdbc、 odbc、 php、 Python等來連接分布式TDSQL實例。
1、TDSQL分布式實例支持表的類型介紹
a、分布式表: 即水平拆分表,也成為「分表」,該表從業務視角是一張完整的邏輯表,但後端根據分表鍵(shardkey)的HASH值將數據分布到不同的物理節點組(SET)中。
b、普通表: 又名Noshard表,即無需拆分的表,和傳統集中式資料庫中的表一致,且沒有做任何特殊處理的表,目前分布式實例將該表默認存放在第一個物理節點組(set)中。
c、廣播表: 又名小表廣播技術,即設置為廣播表後,該表的所有操作都將廣播到所有物理節點組(set)中,每個set都有該表的全量數據,常用於業務系統關聯查詢較多,修改較少的小表或配置表等。
表類型選用注意事項:
在分布式實例中,如果兩張表分表鍵相等,這意味著兩張表**相同的分表鍵對應的行**,存儲在相同的物理節點組中。這種場景通常被稱為組拆分(groupshard),會極大的提升業務聯合查詢等語句的處理效率。由於單表默認放置在第一個set上,如果在分布式實例中建立大的單表,則會導致第一個set的負載太大。除非特別需要,在分布式實例中盡量使用分布式表,這也是分布式實例的特點之一。
2、TDSQL分布式實例表的創建
接下來我們來看下分布式資料庫TDSQL所支持的三種類型表的使用方法和注意事項。
a、分布式表的使用
簡述:普通的分表創建時必須在最後面**指定分表鍵(shardkey)的值,該值為表中的一個欄位名字,會用於後續sql的路由選擇。連接到TDSQL分布式實例後,我們創建一個本次操作使用的資料庫名為:testdb
mysql> create database testdb;
mysql>use testdb;
接下來我們創建分布式表,命名以分布式拼音首字母命名
**建表語句1:**
MySQL testdb> create table fbs ( a int, b int, c char(20),primary key (a),unique key u_1(a,c) ) shardkey=a;
Query OK, 0 rows affected (0.07 sec)
**建表語句2:**
MySQL testdb> create table fbs2 ( a int, b int, c char(20), primary key (a,b) ) shardkey=a;
Query OK, 0 rows affected (0.09 sec)
b、廣播表的創建
簡述:支持建小表(廣播表),此時該表在所有set中都是全部數據,這個主要方用於跨set的join操作,同時通過分布式事務保證修改操作的原子性,使得所有set的數據是完全一致的 。
**語句:**
MySQL testdb> create table gbb(a int,b int key) **shardkey=noshardkey_allset;**
Query OK, 0 rows affected (0.03 sec)
c、傳統普通表
簡述:支持建立普通的表,語法和傳統mysql完全一樣,此時該表的數據全量存在第一個set節點中,所有該類型的表都放在第一個set中。
MySQL testdb> create table ptb(a int ,b varchar(10));
Query OK, 0 rows affected (0.03 sec)
注意事項:
1、在分布式實例中,分布式表shardkey對應後端資料庫的分區欄位,因此必須是主鍵以及所有唯一索引的一部分, 否則可能無法完成建表操作。
2、分布式表shardkey欄位的值不包含中文, 否則proxy會轉換字元集可能會出錯。另外SQL語法上如:shardkey=a 一般放在SQL語句最後來寫。
3、TDSQL分布式實例表的數據操作
為了更好的發揮分布式架構的優勢,在進行SQL操作時和傳統資料庫還是有部分差異。接下來我們從資料庫的插入,更新,刪除方面分別來看有哪些注意事項。
======INSERT插入操作=======
**插入語句1:**
MySQL testdb> insert into fbs(a,b) values(10,1000);
Query OK, 1 row affected (0.00 sec)
**插入語句2:**
MySQL testdb> insert into fbs values(1,10,1000);
或
MySQL testdb> insert into test1 (b,c) values(100,"record3");
ERROR 810 (HY000): Proxy ERROR:sql is too complex,need to send to only noshard table.Shard table insert must has field spec
注意:語句2報錯的原因insert時欄位需要包含shardkey,否則會拒絕執行該sql,因為Proxy不知道該sql發往哪個後端分片節點。
=====UPDATE、DELETE更新、刪除操作=====
更新語句1:
MySQL testdb> update fbs set b=2000 where a=10;
Query OK, 1 row affected (0.00 sec)
更新語句2:
MySQL testdb> update fbs set b=2000 ;
ERROR 658 (HY000): Proxy ERROR: Join internal error: update query has no where clause
刪除操作:
MySQL testdb> delete from fbs;
ERROR 913 (HY000): Proxy ERROR:Join internal error: delete query has no where clause
注意事項:
1、出於數據操作安全上和減少人為誤操作導致數據丟失情況的出現,TDSQL禁止update 無 where 條件的更新動作。
2、同樣的delete操作無where條件也會被禁止執行,如果確認要刪除表數據或表,建議備份後用truncate或drop方式操作。
3、同樣的update操作時盡量避免更新shardkey欄位,因為影響Proxy中的路由更新,會導致錯誤。
1、TDSQL透傳功能介紹
對於分布式實例,會對SQL進行語法解析,有一定的限制,如果用戶想在某個set中獲取單個節點數據,或在指定節點執行SQL,可以使用TDSQL的透傳SQL的功能。
使用透傳功能,我們需要重新連接登錄TDSQL分布式實例時指定 **- c選項**。普通登錄方式,不支持指定節點執行SQL的透傳功能。
登錄如下:
mysql -h172.21.32.13 (proxy地址) -utest -P3306 -p -c(透傳必須指定-c)
2、TDSQL透傳操作演示
首先我們重新登陸TDSQL分布式實例: mysql -h172.21.32.13 -utest -P3306 -p -c
仍舊切換使用testdb資料庫。
a、查看分布式實例set節點
使用/*proxy*/show status 查看當前的TDSQL分布式實例的節點信息,共有兩個set ,分別為set_1605181898_1、set_1605181972_3
MySQL testdb> /*proxy*/show status ;
+-----------------------------+-------------------------------------------------------------------+
| status_name | value |
+-----------------------------+-------------------------------------------------------------------+
| cluster | group_1605181791_302290 |
| **set_1605181898_1:ip | 10.53.179.14:4322;[email protected]:4322@1@IDC_GZ_YDSS0301_79263@0 |
| set_1605181898_1:hash_range | 0---31 |
| **set_1605181972_3:ip | 10.53.179.14:4323;[email protected]:4323@1@IDC_GZ_YDSS0301_79263@0 |
| set_1605181972_3:hash_range | 32---63 |
| set | set_1605181898_1,set_1605181972_3 |
+-----------------------------+-------------------------------------------------------------------+
6 rows in set (0.00 sec)
b、演示數據插入
我們針對之前創建的fbs分布式表進行數據的插入
MySQL testdb> insert into fbs(a,b,c) values(10,1,'AAA'),(20,2,'bbb'),(30,3,'ccc'),(40,4,'dddd'),(50,5,'eee'),(60,6,'fff'),(70,7,'ggg'),(80,8,'hhhh');
MySQL testdb> select * from fbs order by 1;
+----+------+------+
| a | b | c |
+----+------+------+
| 10 | 1 | AAA |
| 20 | 2 | bbb |
| 30 | 3 | ccc |
| 40 | 4 | dddd |
| 50 | 5 | eee |
| 60 | 6 | fff |
| 70 | 7 | ggg |
| 80 | 8 | hhhh |
+----+------+------+
8 rows in set (0.00 sec)
c、透傳查看數據在各個節點的分布情況
MySQL testdb> /*proxy*/show status;
+-----------------------------+-------------------------------------------------------------------+
| status_name | value |
+-----------------------------+-------------------------------------------------------------------+
| cluster | group_1605181791_302290 |
| **set_1605181898_1:ip | 10.53.179.14:4322;[email protected]:4322@1@IDC_GZ_YDSS0301_79263@0 |
| set_1605181898_1:hash_range | 0---31 |
| set_1605181972_3:ip | 10.53.179.14:4323;[email protected]:4323@1@IDC_GZ_YDSS0301_79263@0 |
| set_1605181972_3:hash_range | 32---63 |
| set | set_1605181898_1,set_1605181972_3 |
+-----------------------------+-------------------------------------------------------------------+
6 rows in set (0.00 sec)
查看數據在set_1605181898_1 節點上的分布
MySQL testdb> /*sets:set_1605181898_1*/select * from fbs order by 1;
+----+------+------+------------------+
| a | b | c | info |
+----+------+------+------------------+
| 10 | 1 | AAA | set_1605181898_1 |
| 30 | 3 | ccc | set_1605181898_1 |
| 40 | 4 | dddd | set_1605181898_1 |
| 50 | 5 | eee | set_1605181898_1 |
| 80 | 8 | hhhh | set_1605181898_1 |
+----+------+------+------------------+
5 rows in set (0.00 sec)
查看數據在set_1605181972_3節點上的分布
MySQL testdb> /*sets:set_1605181972_3*/select * from fbs order by 1;
+----+------+------+------------------+
| a | b | c | info |
+----+------+------+------------------+
| 20 | 2 | bbb | set_1605181972_3 |
| 60 | 6 | fff | set_1605181972_3 |
| 70 | 7 | ggg | set_1605181972_3 |
+----+------+------+------------------+
3 rows in set (0.00 sec)
d、通過shardkey分片號查看數據
MySQL testdb> /*shardkey:2*/select * from fbs order by 1;
+----+------+------+
| a | b | c |
+----+------+------+
| 20 | 2 | bbb |
| 60 | 6 | fff |
| 70 | 7 | ggg |
+----+------+------+
3 rows in set (0.00 sec)
支持透傳種類和格式:
1、set名字可以通過/*proxy*/show status查詢
2、/*sets:set_1名稱*/ 透傳指定節點
3、/*sets:allsets*/ 透傳所有節點
4、/*shardkey:10*/ 透傳到shardkey分片對應的set
5、支持透傳sql到對應的一個或者多個set
分布式表的DDL部分的語句限制:
暫不支持CREATE TABLE ... LIKE
暫不支持CREATE TABLE ... SELECT
暫不支持CREATE TEMPORARY TABLE
暫不支持CREATE/DROP/ALTER SERVER/LOGFILE GROUP/
暫不支持ALTER對分表鍵(shardkey)進行重命名,不過可以修改類型
分布式表的DML部分的語句限制:
暫不支持SELECT INTO OUTFILE/INTO DUMPFILE/INTO LOAD DATA導出
暫不支持INSERT ... SELECT
暫不支持UPDATE 分布式shardkey列的值
本操作主要是面向傳統資料庫的開發者或者DBA用戶,讓大家能夠初步入手了解分布式資料庫的特點。另外分布式資料庫在架構上提供了靈活的讀寫分離模式,在SQL上支持全局的order by, group by, limit操作,支持聚合函數,跨set節點的join、子查詢、支持分布式事務,傳統資料庫所支持的大部分操作在分布式資料庫中得到繼承。分布式資料庫是在傳統資料庫的基礎之上發展起來的,對傳統集中式的資料庫有較好的兼容性,對SQL語句語法的使用上兼容大部分SQL1999,SQL2003標准,且對SQL的ACID特性都予以支持。分布式資料庫在邏輯上是一個獨立完整的資料庫,但在架構上和物理上採用 多節點分片方式,經過內部演算法將數據打散分布來到不同節點存儲數據,對前端業務屏蔽後端的復雜架構,並且自身具備數據的最終一致性訪問,可用性和分區容災等特性的資料庫。希望本次操作能給大家帶來一些對分布式資料庫TDSQL的一些認識和收獲。
*禁止轉載,可轉發(轉發文章請註明出處)
TDPub企業級分布式關系資料庫
❹ 求高手寫sql語句,如何實現平均分布
純sql恐怕無能為力,用存儲過程吧
❺ 關於sqlserver2000的分布顯示
sqlserver2000中可以用top關鍵字,如顯示第11到20條記錄:
select top 20 * from table where id not in (select top 10 id from table)
❻ sql查詢問題 查詢成績分布情況
呵呵,你這是一堆的問題呀:
優秀、良好……各級別的(人數):
首先,假設你的分數是 百分制,優秀即高於85分等。。。。
因此:
select 課程,count(*) as 人數,『優秀』 as 類別
from 成績
where 分數>85
group by 課程
union
select 課程,count(*) as 人數,『良好』 as 類別
from 成績
where 分數>70 and 分數<=85
group by 課程
union
select 課程,count(*) as 人數,『及格』 as 類別
from 成績
where 分數>60 and 分數<=70
group by 課程
分布情況及百分比:
得根據上面的結果來再計算。
先弄個總人數的視圖:select count(*) as 總人數 from 成績
再計算百分比:
select 課程,人數/總人數*100% as 百分比 from 各級別人數 group by 課程,類別
其他的統計也就雷同了。
❼ sql語句 怎麼統計各年齡段人數分布情況 年齡為user_age,表為worker,年齡已知為數字類型
selectuser_age年齡,count(user_age)人數,cast(cast((count(user_age)/((selectcount(*)fromworker)*1.0)*100)asdecimal(9,2))asvarchar)+'%'所佔比例fromworkergroupbyuser_age
❽ SQL求和按時間段分布輸出求和結果
select 獲取分鍾函數(time),sum(data)
from 數據表
group by 獲取分鍾函數(time)
❾ SQL裡面的沒有標准正態分布的累積函數NORMSDIST,有什麼辦法解決
這是數學問題吧...
假如說 X~N(μ,σ^2) 要求P{X>a}
其中 X是隨機變數 μ是期望 σ^2是方差 σ是標准差 P{X>a}就是大於a左區間的概率值
則 (X-μ)/σ~N(0,1) P{X>a}=P{(X-μ)/σ>(a-μ)/σ}=1-Φ((a-μ)/σ)
Φ(x)是標准正態分布函數 這是可以用excel中NORMSDIST函數求的
如NORMSDIST(0)=0.5 NORMSDIST(2)=0.977
你可以在excel中敲入=NORMSDIST((A2-B2)/C2) A2就是分位數點 B2就是期望 C2就是標差
做題的時候一定要看清楚給的標差還是方差 求的是左區間還是右區間