sqlanyin
1. 在sql 用any()查詢工資是1500或3000的工資的人的姓名和編號。
any是從一個查詢集中的任一個的意思,不能直接寫結果,如果你確定了是1500,3000,就要用in(1500,3000),否則就要用any(單列查詢語句)。
2. SQL Server中,ALL,ANY,IN的用法
select * from table where 倉庫號<> "wh1" and 倉庫號<> "wh2"
3. SQL 中ANY和ALL的用法
any表示任意一個,all表示所有的。舉例如下:
1、創建測試表,create table test_any_all(id number);
4. 用SQL語句檢索出年齡大於等於18小於等於20的學生姓名和性別
1、首先,在SC表中找到學了C2的學生學號。
5. sql語句中in的用法
IN 操作符允許我們在 WHERE 子句中規定多個值。
SQL IN 語法:
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)
(5)sqlanyin擴展閱讀:
1、IN 與 = ANY 等價,均表示,變數在(子查詢)列表之中,即 a IN (table B) 表示 a = ANY B.b
2、NOT IN 與 <> ALL 等價,而不等於<> ANY,前兩者均表示,變數不在(子查詢)列表之中,即 a NOT IN (table B) 表示 a <> ALL B.b。而如果a <> ANY B.b,則只要任意一個b<>a就true了。
3、IN 與 EXISTS 的性能區別主要來自,IN 會編列子查詢的每行記錄,然後再返回,而EXISTS 則只要遇到第一個滿足條件的記錄就馬上返回。
6. SQL資料庫的、外鍵和查詢
增加外鍵
創建表的時候增加外鍵:在所有的表欄位之後,使用foreign key(外鍵欄位) references 外部表(主鍵欄位)
在新增表之後增加外鍵:修改表結構,使用alter table 表名 add [constraint 外鍵名字] foreign key(外鍵欄位) references 父表(主鍵欄位);
修改外鍵&刪除外鍵
alter table 表名 drop foreign key 外鍵名;
外鍵條件
外鍵要存在,首先必須保證表的存儲引擎是innodb
列類型必須與父表的主鍵類型一致
一張表中的外鍵名字不能重復
增加外鍵的欄位數據已經存在,必須保證數據與父表主鍵要求對應
外鍵約束
有三種約束模式
district:嚴格模式(默認的)
cascade:級聯模式
set null:置空模式
語法:foreign key(外鍵欄位) references 父表(主鍵欄位) on delete 模式 on update 模式;
聯合查詢
基本語法:
select 語句1
union [union 選項]
select 語句2……
union 選項
all:保留所有,不管重復
distinct:去重,默認的
子查詢(sub query)
按位置分類
from子查詢
where子查詢
exists子查詢
按結果分類
標量子查詢
列子查詢
行子查詢
表子查詢
子查詢
列子查詢
=any等價於in; -- 其中一個即可
any等價於some; -- 二者是一樣的
=all為全部
-- 創建外鍵
create table my_foreign1(
idint primary key auto_increment,
name varchar (20)not null comment
'學生姓名',
c_idint comment'班級id',
-- 增加外鍵
foreign key(c_id)references
my_class(id)
)charset utf8;
-- 創建表
create table my_foreign2(
idint primary key auto_increment,
name varchar (20)not null comment
'學生姓名',
c_idint comment'班級id' -- 普通欄位
)charset utf8;
-- 增加外鍵
alter table my_foreign2add
-- 指定外鍵的名字
constraint student_class_1 -- 可以指定多個外鍵 但是名字不能相同
-- 指定外鍵的欄位
foreign key(c_id)
-- 引用父表主鍵
references my_class(id);
-- 刪除外鍵
alter table my_foreign1drop
foreign key my_foreign1_ibfk_1; -- my_foreign1_ibfk_1 通過外鍵的名字來刪
-- 插入數據;外鍵欄位在父表不存在
insert into my_foreign2values (
null,'郭富城',4); -- 沒有4號班級
insert into my_foreign2values (
null,'項羽',1);
insert into my_foreign2values (
null,'劉邦',2);
insert into my_foreign2values (
null,'韓信',3);
-- 更新父表的記錄
update my_classset id=4 where id=1; -- 失敗;id=1記錄已經被學生引用
update my_foreign2set c_id=2 where id=4; -- 更新
update my_classset id=4 where id=3; -- 可以;沒有學生引用此班級
-- mysql中添加外鍵約束遇到一下情況:
-- cannot add foreign key constraint
-- 出現這個問題的原因是,外鍵的使用:
-- 1. 外鍵欄位不能為該表的主鍵;
-- 2. 外鍵欄位參考欄位必須為參考表的主鍵
-- 插入數據
insert into my_foreign1values (
null,'馬超','3'
);
-- 增加外鍵
alter table my_foreign1add
foreign key(c_id)references
my_class(id); -- 失敗;因為沒有3號班了
-- 創建外鍵,指定模式;刪除置空;更新級聯
create table my_foreign3(
idint primary key auto_increment,
name varchar (20)not null,
c_idint,
-- 增加外鍵
foreign key (c_id)
-- 引用表
references my_class(id)
-- 指定刪除模式
on delete set null
-- 指定更新模式
on update cascade
)charset utf8;
-- 插入數據
insert into my_foreign3values (
null,'劉備',1),
(null,'曹操',1),
(null,'孫權',1),
(null,'祝賀量',2),
(null,'周瑜',2);
-- 解除My_foreign2表的外鍵
alter table my_foreign2drop
foreign key student_class_1;
-- 更新父表主鍵
update my_classset id=3 where id=1;
-- 刪除父表主鍵
delete from my_classwhere id=2;
-- 聯合查詢
select * from my_class
union -- 默認去重
select * from my_class;
select * from my_class
union all -- 不去重
select * from my_class;
select id,c_name,roomfrom my_class
union all -- 不去重
select name,number,idfrom my_student;
-- 需求;男生升序;女生降序(年齡)
(select * from my_student
where sex='男'
order by ageasc limit9999999)
union
(select * from my_student
where sex='女'
order by agedesc limit9999999);
select * from my_studentwhere
c_id=(
-- 標量子查詢
select idfrom my_classwhere
c_name='python1903');-- id一定只有一個值(一行一列)
insert into my_classvalues (1,
'python1907','B407');
-- 列子查詢
select * from my_studentwhere
c_idin(select idfrom my_class);
-- any,some,all
select * from my_studentwhere
c_id=any(select idfrom my_class);
select * from my_studentwhere
c_id=some(select idfrom my_class);
select * from my_studentwhere
c_id=all(select idfrom my_class);
select * from my_studentwhere
c_id!=any(select idfrom my_class); -- 所有結果(null除外)
select * from my_studentwhere
c_id!=some(select idfrom my_class); -- 所有結果(null除外)
select * from my_studentwhere
c_id!=all(select idfrom my_class); -- 所有2號班級(null除外)
select * from my_studentwhere
age=(select max(age)from
my_student)
and
height=(select max(height))from
my_student);
-- 行子查詢
select * from my_student
-- (age,height)稱之內為行元素
where (age,height)=(select max(
age),max(height)from my_student);
update my_studentset height=188
where name='王五';
select * from my_studentorder by
agedesc,heightdesc limit1;
select * from my_studentorder by
heightdesc;
-- 表子查詢
select * from my_studentgroup by
c_idorder by heightdesc; -- 每個班選出第一個學生再按身高排序
select * from (select * from
my_studentorder by heightdesc)
as studentgroup by student.c_id;
7. 資料庫當中:如果子查詢中返回的是單列多值,則必須在子查詢前使用關鍵字all或any
我來回答一下,這個問題不好說清楚....
學生表
-- 查詢1、查詢出 年齡 = 17 的所有學生
select t.* from學生表 t where t.年齡 = 17;
-- 查詢2、查詢出 年齡 = 17或者 = 18的所有學生
select t.* from 學生表 t where t.年齡in (17, 18);
-- 查詢3、查詢出 性別 = 男 的所有學生,這里因為子查詢「學生表 t2」只有一條記錄滿足條件(即單列單行),所以查詢不會報錯
select t.* from 學生表 t where t.年齡 = (
select t2.年齡
from 學生表 t2 where t2.性別 = '男'
);
-- 查詢4、查詢出 年齡 = 17 的所有學生,這里因為子查詢 「學生表 t2」 有兩條數據符合條件(即單列多行),而 「t.性別 =」 只能等於某一個給定的值,參考 「查詢1」 ,所以執行查詢會報錯;這里把 =替換為 =any 或者 in 就可以正常查詢,因為 =any 和 in 是告訴 「t.性別」 要找的數據必須在我范圍內;而 <> any 和 not in 則表示取反的意思,告訴 「t.性別」 要找的數據必須排除我給你的范圍。
select t.* from 學生表 t where t.性別 = (
select t2.性別
from 學生表 t2 where t2.年齡 = 17
);
-- ANY 和 ALL 的具體用法,這里不再贅述。。。。
-- 查詢5、多列多值,參考查詢4,子查詢 「學生表 t2」 滿足條件的有兩條,如下查詢:
select t.* from 學生表 t where t.年齡 || t.性別=any (
select t2.年齡 || t2.性別
from 學生表 t2 where t2.性別 = '男'
);
注1:其實 ANY 和 ALL 不涉及什麼多行多列,查詢5隻是一種另類的解決方案。
注2:「||」 雙數線表示 在 ORACLE 資料庫中用來做合並的關鍵字元。
總結:
首先,請不要在查詢1、2、3、4、5上過於糾結,說什麼我可以用更簡單的SQL實現你的查詢1、2、3、4、5,我這里僅僅是為了舉例說明。
select t.* from 學生表 t where t.年齡 = 17;
= 後面可以是一個 特定的值,可以是一個 子查詢等等,但是需要保證 = 後面的任何運算或查詢只返回一個值,不然SQL是無法執行的;
而 any 和 all 以及 in,表示的是一個數據范圍,即單列多行,而使用 雙豎線 是把 多列合並為一列來處理,最終還是模擬的單列多行。
8. 操作符的SQL里的操作符
相等:相等操作符在SQL語句里比較一個值與另一個值,等號(=)表示相等。在進行相等比較時,被比較的值必須完全匹配,否則就不會返回數據。如果在相等比較過程中兩個值相等,那麼這個比較的返回值就是true,否則就是false。這個布爾值(true或false)用於決定是否返回數據。
不相等:在SQL里表示不相等的操作符是<>(一個小於號和一個大於號)。如果兩個值不相等,條件就返回true,否則就返回false。另一種表示不相等的方式是!=,而且很多主要的SQL實現採用這種方式。
小於:<
大於:>
比較操作符的組合:等號可以與小於號和大於號聯合使用。 用戶對SQL關鍵字而不是符號進行比較。
is null:這個操作符用於與null值進行比較。
between:操作符between用於尋找位於一個給定最大值和最小值之間的值,這個最大值和最小值是包含在內的。between是包含邊界值的,所以查詢結果里會包含指定的最大值和最小值。
in:操作符in用於把一個值與一個指定列表進行比較,當被比較的值至少與列表中一個值相匹配時,它會返回true。使用操作符in可以得到操作符or一樣的結果,但它的速度更快。
like:操作符like利用通配符把一個值與類似的值進行比較,通配符有兩個:百分號(%);下劃線(_)。百分號代表零個、一個或多個字元;下劃線( _ )代表一個數字或字元。
exists:這個操作符用於搜索指定表裡是否存在滿足特定條件的記錄。
all:操作符all用於把一個值與另一個集合里全部值進行比較。
any/some:操作符any用於把一個值與另一個列表裡任意值進行比較。some是any的別名,它們可以互換使用。 如果想在SQL語句里利用多個條件來縮小數據范圍,我們就需要組合多個條件。這正是連接操作符的功能。
and:操作符and讓我們可以在一條SQL語句的where子句里使用多個條件。在使用and時,無論SQL語句是事務操作還是查詢,所有由and連接的條件都必須為true,SQL語句才會實際執行。
or:操作符or可以在SQL語句的where子句中連接多個條件,這時無論SQL語句是事務操作還是查詢,只要or連接的條件里有至少一個是true,SQl語句就會執行。
注意:比較操作符和邏輯操作符都可以單獨或彼此復合使用。
提示:當SQL語句里包含多個條件和操作符時,利用圓括弧把語句按照邏輯關系進行劃分可以提高語句的可讀性。當然,不恰當地使用圓括弧也會影響輸出結果。 操作符not可以顛倒邏輯操作符的含義,它可以與其他操作符構成以下幾種形式:
not equal:不相等
not between:操作符between的求反
not in:操作符in的求反
not like:操作符like的求反
is not null:操作符is null的求反
not exists:操作符exists的求反
not unique:操作符distinct的求反 加法(+)
減法(-)
乘法(*)
除法(/)
算術操作符可以彼此組合使用,並且遵循基本算數運算中的優先順序:首先執行乘法和除法,然後是加法和減法。用戶控制算術運算次序的唯一方式是使用圓括弧,圓括弧里包含的表達式會被當作一個整體進行優先求值。
9. SQL語句中WHERE NOT EXISTS ; WHERE title NOT IN; WHERE title IN 這些語句是什麼意思 這些語句後接子查詢
exists 英文存在的意思,父查詢where not exists(子查詢)---不存在子查詢則滿足父查詢出發條件, where 欄位 not in(子查詢)。操作方法如下:
1、打開SQL Server Management Studio管理工具,連接上SQL Server資料庫,打開SQL語句書寫界面。
10. 請教高手在sql里in,all,any,some的區別和具體應用范圍
給你些例子:
in 是 確定集合的
SELECT au_lname, state
FROM authors
WHERE state IN ('CA', 'IN', 'MD')
結果:
au_lname state
-------- ----
Yokomoto CA
DeFrance IN
Stringer CA
MacFeather CA
Karsen CA
Panteley MD
Hunter CA
all 是查詢還可以是子查詢
如:
select name from edit
其中name前省略了all.
name前可以加ALL|DISTINCT
all是所有記錄.
distinct是不重復的。
帶【any】的嵌套查詢和【some】的嵌套查詢功能是一樣的。早期的SQL僅僅允許使用【any】,後來的版本為了和英語的【any】相區分,引入了【some】,同時還保留了【any】關鍵詞。
any:
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal >any(select sal from scott.emp where job='MANAGER');
帶any的查詢過程等價於兩步的執行過程。
(1)執行「select sal from scott.emp where job='MANAGER'」
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal >2975 or sal>2850 or sal>2450;
some:
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal =some(select sal from scott.emp where job='MANAGER');
帶some的嵌套查詢與any的步驟相同。
(1)子查詢,執行「select sal from scott.emp where job='MANAGER'」,其結果如圖4.22所示。
(2)父查詢執行下列語句。
―――――――――――――――――――――――――――――――――――――
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal =2975 or sal=2850 or sal=2450;