sql中值
⑴ sql 字元長度查詢
SQL獲取字元長度使用len函數。
問題答案描述:SQL獲取字元長度使用len函數。
SELECT * FROM store WHERE LEN(name)<8;
SELECT * FROM store WHERE LEN(address)<8。
2.函數功能:函數返迴文本欄位中值或者字元串的長度。
3.語法:LEN(欄位或字元串),SELECT * FROM Table WHERE LEN(ColumnName)<n
⑵ 誰能給些 常見SQL語句用法
有關資料庫的一寫操作:
創建表項就不說了.
CREATE TABLE Student
(Sno CHAR(5) NOT NULL UNIQUE,
Sname CHAR(20),
Ssex CHAR(1),
Sage INT,
Sdept CHAR(15));
插入記錄:
insert into Student (Sno,Sname,Ssex,Sdept) values('aaa','mary','f','172');
刪除記錄:
delete from Student where Sno = 'aaa';
註:只需要刪除一個主鍵就可以了。其他的記錄會相應的刪除掉。
刪除表中一個欄位:
ALTER TABLE Student DROP column Ssex; 列名;
修改表中的那一行數據:
原來的記錄:
Sno Sname Ssex Sdept
aaa mary f 172
update Student set Sname='mary1', Ssex='m' where Sno='aaa';
修改後:
Sno Sname Ssex Sdept
aaa mary1 m 172
desc倒敘排列:
建立索引:
create unique index Sno on Student(Sno);
索引的一點好處:在查詢時候比較方便,在存在的所有記錄中查找一個Sno=1的時候!建立索引的表中就直接查找Sno項比較它是否=1找到後查相關的記錄就比較快。沒有建立索引的需要把所有信息都查找一遍,再在其中找Sno欄位,再比較其值=1的相關記錄。
默認是ASC。
按表中哪個欄位倒敘排序:
select * from Student order by Sno desc;
注意:要排序的欄位必須是int型。
設置成自增長的欄位在插入數據的時候不需要插入該欄位的值:
select * from Student order by Sno desc;
原來沒有設置成自增長插入數據命令:
insert into Student (Sno,Sname,Ssex,Sdept) values('aaa','mary','f','172');
將int型的Sno欄位設置成自增長後
insert into Student (Sname,Ssex,Sdept) values('mary1','f','172');
insert into Student (Sname,Ssex,Sdept) values('mar1y','f','172');
insert into Student (Sname,Ssex,Sdept) values('ma1ry','f','172');
insert into Student (Sname,Ssex,Sdept) values('m1ary','f','172');
在表中的排序如下:
Sno Sname Ssex Sdept
1 mary1 f 172
2 mar1y f 172
3 ma1ry f 172
4 m1ary f 172
/*********************************************************************************
2006.7.20
*********************************************************************************/
查詢表中記錄總數:(無欄位名字)
select count() from usertable;
或:(userid 為欄位名字,結果是欄位的總行數)
select count(*) userid from Student;
查詢欄位的平均值:
selecet avg(Sno) from Student;
select avg(欄位名)from 表名;
給出查詢的欄位的平均值取別名:
select avg(欄位名) as (別名) from (表名);
查找指定的欄位的其他欄位
select Sdept,Ssex,Sname
from Student
where Sno=3;
(where Sname='mary1';或則where Sname like 'mary1';)
在between語句查詢的都是在and之間的所有值而IN語句則必須是in括弧裡面的值.
select Sno,Ssex,Sname from Student where Sdept between 180 and 190;
select Sno,Ssex,Sname from Student where Sdept in (172,190);
查詢Student表中的所有的名字中的Sno和Ssex值.
select Sno,Ssex from Student where Sdept >= 170 and Sname like '%%';
注:%%之間是把所有的String類型的值
like和where條件查詢
select last_name,salsry,department_id from employees where last_name like 'G%' and salary>3000;
查詢Student表中的所有的名字中間有mary的所有名字對應的的Sno和Ssex值.
select Sno,Ssex from Student where Sdept >= 170 and Sname like '%mary%';
注:mary1,1mary,marydsajdh,等.
注意:and or not 用的時候,and是用在連接並列條件的2個不同的欄位
or是用在選擇的2個不同的欄位之間,not一般用於not in(180,190)之間.
order by 和asc|desc的一點不同:
order by是按先進先排,desc是先進後排,asc和desc是排列順序不一樣.
disctinct條件查詢
distinct 這個關鍵字來過濾掉多餘的重復記錄只保留一條,
select distinct name from table 表示將返回table表中name欄位不重復的所有欄位的集合。
註:distinct必須放在開頭,select id distinct name from table 是錯誤的!
-------------------------------------------------------------------------------------
表TEST_1:
id name1 name2
9 aaa 11
8 bbb 22
3 ccc 33
4 ccc 44
5 bbb 55
6 ddd 66
7 eee 77
-------------------------------------------------------------------------------------
select distinct(name1) from test_1
結果:
name1
aaa
bbb
ccc
ddd
eee
distinct這個關鍵字來過濾掉多餘的重復記錄只保留一條,但往往只用它來返回不重復記錄的集合,而不是用它來返回不重記錄的所有值。其原因是distinct只能返回它的目標欄位,而無法返回其它欄位,即上表中只能返回name1欄位的所有不重復記錄集合。
-------------------------------------------------------------------------------------
如果現在想查詢出表test_1中所有name1不重復的id和name1欄位的記錄呢?
select distinct name, id from table
結果:
name1 id
aaa 9
bbb 5
bbb 8
ccc 3
ccc 4
ddd 6
eee 7
並不是我們所想要的結果
select distinct name,id from table 作用了兩個欄位,也就是必須得id與name都相同的才會被排除,即返回去除table表中id和name兩個欄位同時相同情況下所有集合。
-------------------------------------------------------------------------------------
如果現在想查詢出表test_1中所有name1不重復的所有欄位的記錄呢?
對於
select * from test_1 where name1 in (select distinct name1 from tablename)
等價於
select * from test_1 where name1 in ('aaa','bbb','ccc','ddd','eee')
我們很可能認為它是可行的,但實際上結果卻是:
id name1 name2
9 aaa 11
8 bbb 22
3 ccc 33
4 ccc 44
5 bbb 55
6 ddd 66
7 eee 77
正確sql應該是:
select * from test_1 inner join (select min(id) as id from test_1 group by name1 order by id ) T on test_1.id = T.id
min(id)或max(id)都行,order by id 可要可不要.這里用內連接實現聯合查詢,也可以用where語句
select * from test_1 ,(select min(id) as id from test_1 group by name1 order by id ) where test_1.id = T.id
-------------------------------------------------------------------------------------
**********************************************************************************
聯合查詢
**********************************************************************************
查詢表中的各個欄位的值
select Sno,Sname,Ssex,Sdept from Student;
多表查詢(2個表,publishtable和publishtable,給表起了別名)
select u.userid,u.age,u.username,p.publishname from usertable u,publishtable p where u.userid = p.publishid;
多表查詢(3個表employees,departments和locations表,給表起別名)
(從多表中查詢出所有姓smith的雇員的名字,所在部門以及部門所在的城市)
select e.first_name,e.last_name,d.department_name,l.city from employees e,departments d,locations l where e.department_id = d.department_id and d.location_id = l.location_id and e.last_name = 'smith';
***********************************************************************************
聯合查詢
***********************************************************************************
等值連接
/*將books表和表bookstype中的信息聯合查詢,條件是聯系鍵相等*/
select * from books,bookstype where bookstype.typeid = books.typeid
內連接
/*將books表和表bookstype中的信息聯合查詢,條件是聯系鍵相等,和等值連接等價*/
select * from books inner join bookstype on books.typeid = bookstype.typeid
左外連接
/*將books表和表bookstype中的信息聯合查詢,包括在books表中沒有和bookstype表關聯的信息*/
select * from books left outer join bookstype on bookstype.typeid = books.typeid
右外連接
/*將bookstype表和books表中的信息聯合查詢,包括在bookstype表中沒有和books表關聯的信息*/
select * from books right outer join bookstype on bookstype.typeid = books.typeid
全連接
/*將bookstype表和books表中的信息聯合查詢,包括在books表中沒有和bookstype表關聯的信息以及在bookstype表中沒有和books表關聯的信息*/
select * from books full outer join bookstype on bookstype.typeid = books.typeid
***********************************************************************************
聯合查詢
***********************************************************************************
多表查詢應該注意的幾點:
多表查詢和單表查詢的不同在於多表查詢在查詢某個欄位的時候應該帶上表名
格式是:表名.欄位名,表名.欄位名
select bbs.id,bbs.name,bbs.dep,bbsr.id,bbsr.name
from bbs,bbsr
where bbs.id=bbsr.id;
一般的在多表查詢中的表名取的麻煩用別名來代替
如下:
select b.id,b.name,b.dep,c.id,c.name
from bbs as b ,bbsr as c // from bbs b,bbsr c***注意取別名也可以用空格或則用as.
where b.id=c.id;
*************************************************************************************
分組查詢
*************************************************************************************
在select 語句中可以使用group by 子句將行劃分成較小的組,然後,使用聚組函數返回每一個組的匯總信息,另外,可以使用having子句限制返回的結果集。group by 子句可以將查詢結果分組,並返回行的匯總信息SQLServer 按照group by 子句中指定的表達式的值分組查詢結果。
-------------------------------------------------------------------------------------
分組查詢一般是用來進行統計需求的,要進行分組查詢必須使用group by子句或having子句,在分組統計時要用到SQL的多行存儲函數。在where條件中不能使用多行存儲函數.
查詢語句的select 和group by ,having 子句是聚組函數唯一出現的地方,在where 子句中不能使用聚組函數。
在帶有group by 子句的查詢語句中,在select 列表中指定的列要麼是group by 子句中指定的列,要麼包含聚組函數.
------------------------------------------------------------------------------------
部門表department:
department_id department_name
10 開發部
20 測試部
30 用服部
40 財務部
50 培訓部
雇員表employees:(department_id為外鍵)
id employees_name department_id
1 cheng 10
2 zhou 50
3 liguo 10
4 wang 20
5 feng 30
6 ling 30
7 wu 20
8 tang 20
9 yang 40
10 tan 50
------------------------------------------------------------------------------------
按部門編號統計出表employees中的每個部門的人數(group by分組查詢)
select department_id, count(*) from employees
group by department_id;
顯示出部門人數少於5人的部門編號以及人數( 按照department_id來分組,having count(*)<5做為限制條件 )
select department_id 部門號, count(*) 部門人數 from employees
group by department_id
having count(*)<5;
--------------------------------------
(注意:having必須在group by子句的後面)
--------------------------------------
圖:
部門號 部門人數
------------------------------
10 2
20 3
30 2
40 1
50 2
-------------------------------------------------------------------------------------
where子句和having子句可以同時使用,where子句是對要分組的行進行過濾,即選擇要分組的行;
而having子句是對分組後的數據進行過濾。此時where子句必須在group by...having子句之前
-------------------------------------------------------------------------------------
顯示出所有工資大於5000,且部門人數大於5個的部門號,部門最低工資和部門人數
select department_id 部門號(記住department_id 和部門號之間要空格), min(salary) 最低工資,count(*) 部門人數 from employees
where salary >5000
group by department_id
having count(*)>5;
圖:
--------------------------------------
部門號 最低工資 部門人數
80 6100 34
100 6800 6
group by 按照哪個欄位來排序查詢,一般的group by和having一起使用,注意在查詢中只能查詢與group by和having有關的欄位。
--------------------------------------
where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾數據,條件中不能包含聚組函數,使用where條件顯示特定的行。
having 子句的作用是篩選滿足條件的組,即在分組之後過濾數據,條件中經常包含聚組函數,使用having 條件顯示特定的組,也可以使用多個分組標准進行分組。
查詢每個部門的每種職位的雇員數(待測試...)
select deptno,job,count(*) from emp group by deptno,job;
*********************************************************************************
數據排序
*********************************************************************************
order by子句中可以用asc(升序)和desc(降序)來完成相應的排序,默認時是按找asc(升序)。
---------------------------------------------------------------------------------
顯示出所有工資大於5000,且部門人數大於5個的部門號,部門最低工資和部門人數,並要求按照部門人數降序排序.
select department_id 部門號(記住department_id 和部門號之間要空格), min(salary) 最低工資,count(*) 部門人數 from employees
where salary >5000
group by department_id
having count(*)>5
order by count(*)desc
-------------------------------------------------------------------
(注意:當對分組查詢後的結果進行排序時,order by 必須在group by之後)
-------------------------------------------------------------------
圖:
--------------------------------------
部門號 最低工資 部門人數
80 6100 34
100 6800 30
90 6500 28
70 6300 25
*******************************************************************************
子查詢
*******************************************************************************
-----------------------------------------------------------------------------------------------------
子查詢是一個在select查詢中含有其他的select語句,子查詢通常用在where子句中,即將一個查詢結果做為查詢的條件.
-----------------------------------------------------------------------------------------------------
統計表employees中所有工資小於平均工資的人數
select count(*)工資 from employees
where salary <
(select avg(salary) from employees)
圖:
----------------
工資
56
49
36
Select MIN(Salary),Manager_id
from Employee
group by Manager_id
having MIN(Salary) >
(Select MIN(Salary)
From Employee
where Manager_id=004);
注意在多表查詢中返回的值應該是一個唯一確定的值,而不應該是多中值。
select Employee_id,Last_name,Salary,Manager_id
from Employee
WHERE Salary>
(select Salary
from Employee
where Manager_id=003)
and
Last_name= (select Last_name
from Employee
where Last_name like 'mary');
注意在any,or,all的區別:
Select Salary,Manager_id,Last_name,Employee_id
from Employee
where Salary < any
(Select Salary
From Employee
where Manager_id=005);
Select Salary
From Employee
where Manager_id=005;返回的是2000,2500
就是在工資中小於2000.2500其中一個就可以了,而ALL則必須是小於2000和2500其中任何一個
。而or則是和and用在一起的.
******************************************************************************************
集合運算
******************************************************************************************
---------------------------------------------------------------------------------
集合運算是將2個或多個子查詢結果進行(並union),交(intersect)和減(minus)
---------------------------------------------------------------------------------
(並union):
select employee_id,empname from emp1
union
select employee_id,name from emp2
圖:
-----------------
employee_id empname
100 king1
1000 king2
1000 king3
10000 king4
100000 king5
1000000 king6
注:使用union,重復行只包括一個,當使用union all時將包括重復行
交(intersect):2個或多個子查詢的公共行
select employee_id,empname from emp1
intersect
select employee_id,name from emp2
減(minus):從第一個查詢結果中去掉出現在第二個查詢結果中的行:
select employee_id,empname from emp1
minus
select employee_id,name from emp2
*****************************************************************************************
視圖,存儲過程和觸發器
*****************************************************************************************
創建視圖:(查詢數據,用於系統統計報表)
create view dept_sum_vu
(name,minsal,maxsal,avgsal)
as select d.department_name,min(e.salary),max(e.salary),avg(e.salary)
from employees e,departments d
where e.department_id = d.department_id
group by d.department_name;
存貯過程,觸發器和刪除外鍵
1).存貯過程:
存貯過程的路徑:打開Stored Proceres中new一個新的Stored Proceres,中間填寫代碼,代碼如下:
CREATE PROCEDURE sa.bbsTest AS
select Bbsid ,content , area_id , name FROM BBs a JOIN bbs_area b
on a.area_id = b.id
CREATE PROCEDURE bbsTest AS
select Bbsid ,content , area_id , name FROM BBs a JOIN bbs_area b
on a.area_id = b.id
2).觸發器
打開用戶表項,點設計表,選中其中一個欄位,右鍵task點manager triggers,在彈出的表單中寫代碼:
CREATE TRIGGER [tD_bbs_area] ON [dbo].[bbs_area]
FOR DELETE
AS
BEGIN
DELETE rebbs
FROM bbs, deleted
WHERE rebbs.bbs_id = bbs.bbsid
AND bbs.area_id = deleted.id
DELETE bbs
FROM deleted
WHERE bbs.area_id = deleted.id
END
3).刪除外鍵
打開用戶表項,點設計表,選中其中一個欄位,右鍵relationships,在彈出的主鍵和外鍵中選擇就可以了.
刪除外鍵,需要先刪除主鍵表裡面的有關外鍵的欄位,再來刪除外鍵的有關欄位.
⑶ 求SQL的全部函數!完整的加100分!
一.聚合函數
AVG 返回組中值的平均值。空值將被忽略
BINARY_CHECKSUM 返回對表中的行或表達式列表計算的二進制校驗值。BINARY_CHECKSUM 可用於檢測表中行的更改
CHECKSUM 返回在表的行上或在表達式列表上計算的校驗值。CHECKSUM 用於生成哈希索引
CHECKSUM_AGG 返回組中值的校驗值。空值將被忽略
COUNT 返回組中項目的數量
COUNT_BIG 返回組中項目的數量。COUNT_BIG 的使用與 COUNT 函數相似。它們之間的唯一差別是它們的返回值:COUNT_BIG 總是返回 bigint 數據類型值,而 COUNT 則總是返回 int 數據類型值
GROUPING "是一個聚合函數,它產生一個附加的列,當用 CUBE 或 ROLLUP 運算符添加行時,附加的列輸出值為1,當所添加的行不是由 CUBE 或 ROLLUP 產生時,附加列值為0。
僅在與包含 CUBE 或 ROLLUP 運算符的 GROUP BY 子句相聯系的選擇列表中才允許分組"
MAX 返回表達式的最大值
MIN 返回表達式的最小值
SUM 返回表達式中所有值的和,或只返回 DISTINCT 值。SUM 只能用於數字列。空值將被忽略
STDEV 返回給定表達式中所有值的統計標准偏差
STDEVP 返回給定表達式中所有值的填充統計標准偏差
VAR 返回給定表達式中所有值的統計方差。
VARP 返回給定表達式中所有值的填充的統計方差。
二.數學函數
ABS 返回給定數字表達式的絕對值
ACOS 返回以弧度表示的角度值,該角度值的餘弦為給定的 float 表達式;本函數亦稱反餘弦。
ASIN 返回以弧度表示的角度值,該角度值的正弦為給定的 float 表達式;亦稱反正弦
ATAN 返回以弧度表示的角度值,該角度值的正切為給定的 float 表達式;亦稱反正切
ATN2 返回以弧度表示的角度值,該角度值的正切介於兩個給定的 float 表達式之間;亦稱反正切
CEILING 返回大於或等於所給數字表達式的最小整數
COS 一個數學函數,返回給定表達式中給定角度(以弧度為單位)的三角餘弦值
COT 一個數學函數,返回給定 float 表達式中指定角度(以弧度為單位)的三角餘切值
DEGREES 當給出以弧度為單位的角度時,返回相應的以度數為單位的角度
EXP 返回所給的 float 表達式的指數值
FLOOR 返回小於或等於所給數字表達式的最大整數
LOG 返回給定 float 表達式的自然對數
LOG10 返回給定 float 表達式的以 10 為底的對數
PI 返回 PI 的常量值
POWER 返回給定表達式乘指定次方的值
RADIANS 對於在數字表達式中輸入的度數值返回弧度值
RAND 返回 0 到1 之間的隨機float 值
ROUND 返回數字表達式並四捨五入為指定的長度或精度
SIGN 返回給定表達式的正 (+1)、零 (0) 或負 (-1) 號
SIN 以近似數字 (float) 表達式返回給定角度(以弧度為單位)的三角正弦值
SQUARE 返回給定表達式的平方
SQRT 返回給定表達式的平方根
TAN 返回輸入表達式的正切值
三.日期函數
DATEADD 在向指定日期加上一段時間的基礎上,返回新的 datetime 值。
DATEDIFF 返回跨兩個指定日期的日期和時間邊界數
DATENAME 返回代表指定日期的指定日期部分的字元串
DATEPART 返回代表指定日期的指定日期部分的整數
DAY 返回代表指定日期的天的日期部分的整數
GETDATE 按 datetime 值的 Microsoft�0�3 SQL Server�6�4 標准內部格式返回當前系統日期和時間
GETUTCDATE 返回表示當前 UTC 時間(世界時間坐標或格林尼治標准時間)的 datetime 值
MONTH 返回代表指定日期月份的整數
YEAR 返回表示指定日期中的年份的整數
四.系統函數
APP_NAME 返回當前會話的應用程序名稱(如果應用程序進行了設置)。
CASE 表達式 計算條件列表並返回多個可能結果表達式之一(詳見PPT資料)
CAST 和 CONVERT 將某種數據類型的表達式顯式轉換為另一種數據類型(詳見PPT資料)
COALESCE 返回其參數中第一個非空表達式
COLLATIONPROPERTY 返回給定排序規則的屬性
CURRENT_TIMESTAMP 返回當前的日期和時間。等價於 GETDATE()
CURRENT_USER 返回當前的用戶。價於 USER_NAME()