① 【急】sql語句中否定的用法
簡單的說就是「符號+符號」「單詞+單詞」
比如,你要不屬於,也就是not in,你不可能寫! in.
再比如不等於,不可能寫not =,肯定是!=或者<>.
大概就是這個意思,用字母表達的時候就用not,用符號表達的時候,一般不用not
② 請問在SQL語句中 not exists嵌套怎麼用來解決雙重否定的問題 以及exists語法嵌套時應該注意哪些問題
-------
where not exists(select * from talbe where not exists(select * from table))
-------
理解意態行思就好了,一般雀游不常用帆歲嘩
③ 求sql,用not exist雙重否定的方式
你說的雙重否定是指not exist 否定一次,然後查詢語句里否定一春歷次么?你看這樣符合你的要求扒螞搜么?
select*fromswherenotEXISTS(select*fromscwhere物畝s3<>學生S3的學號)
④ sql解決問題思路
Not IN
Example:
查詢沒學過"張三"老師授課的同學的信息
IN + NOT IN
Example:
查詢學過編號為"01"但是沒有學過編號為"02"的課程的同塌哪含學的信息
NOT IN + NOT IN
Example:
查詢和"01"號的同學學習的課程完全相同的其他同學的信息團笑
這部分就表示圖中 2,4
這部分表緩漏示圖中1,3,所以最後分組求和判斷課程數相同就得到完全一致的。
這題用正向的思維是,不好做的。總是會出現部分相同,使用這種反向雙重否定的方式去處理「完全」這種sql最好
case when ...then .... else .....end
Example:
顯示所有學生的所有課程的成績以及平均成績,按平均成績從高到低排序
Sum(condition)
Example:
查詢各科成績最高分、最低分和平均分:以如下形式顯示:課程ID,課程name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率
-- 及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90
Example:
按各科成績進行排序,並顯示排名
思想:首先排序好,那麼從第一個開始比較,不相等就加+,最後數字就是排名
結果
思路:先排名然後篩選即可
Example:
去重方式:distinct or group by
思路:自關聯+使用條件+NOT IN
多欄位交叉去重
使用函數:
week() year() day() month() now() datediff()
Example:
查詢各學生的年齡
查詢下周過生日的學生
寫sql,多使用函數,如果普通思維完成不了使用集合逆向求反的思維
⑤ 如何解決SQL Server資料庫置疑問題
您好,是這樣的:
1.首先確認已經備份了.mdf和.ldf文件。
2. 在SQL Server中新建一個同名的資料庫,然後停止SQL Server服務。
3. 用原有的.mdf和.ldf文件覆蓋新建資料庫對應的.mdf和.ldf文件。
4. 重新啟動SQL Server服務,這是應該會看到這個資料庫處於置疑(Suspect)狀態。
5. 在SQL查詢分析器中執行以下命令,以允許更新系統表:use mastergosp_configure "allow updates",1reconfigurewithoverridego。
6. 將這個資料庫置為緊急模式:update sysdatabases set status = 32768 where name="db_name"go。
7. 使用DBCC CHECKDB命令檢查資料庫中的錯誤:DBCC CHECKDB("db_name")GO。
8. 如果DBCC CHECKDB命令失敗,請轉至第10步,否則先將資料庫置為單用戶模式,再嘗試對其進行修復:sp_dboption "db_name","single
user","true"DBCCCHECKDB("db_name",REPAIR_ALLOW_DATA_LOSS)GO
如果在執行DBCCCHECKDB("db_name",REPAIR_ALLOW_DATA_LOSS)命令時提示說資料庫未處於單用戶模式狀態的話,則重新啟動SQLServer服務,然後繼續嘗試。
9. 如果DBCCCHECKDB("db_name",REPAIR_ALLOW_DATA_LOSS)命令失敗,請轉至第10步,否則若成功修復了資料庫中的錯誤:
重新執行DBCC CHECKDB("db_name")命令,確認資料庫中已沒有錯誤存在。
清除資料庫的置疑狀態:sp_resetstatus "db_name"
清除資料庫的單用戶模式狀態:sp_dboption "db_name","single user","false"
重新啟動SQL Server服務,如果一切正常的話,則資料庫已經成功恢復。
10.如果以上步驟都不能解決問題的話,請參考附件中的文檔嘗試通過重建事務日誌來恢復資料庫中的數據。如果您只有MDF文件,問題就更加復雜一些,我們需要直接重建事務日誌了:
1. 在SQL Server中新建一個同名的資料庫,然後停止SQL Server服務。
2. 用原有的ldf文件覆蓋新建資料庫對應的.mdf文件,將其日誌文件(.ldf)刪除。
3. 啟動SQL Server服務,並將資料庫置為緊急模式(同上: 步驟5和步驟6)。
4. 停止並重新啟動SQL Server服務。
5. 執行以下命令重建資料庫日誌文件:(下面是個示例,您要用您實際的資料庫名)
DBCC REBUILD_LOG("cas_db", "D:\cas_db\cas_db_Log.LDF")
6. 重新將該資料庫置為單用戶模式。
7. 再次嘗試使用DBCC CHECKTABLE或DBCC CHECKDB命令檢查並修復資料庫中。
⑥ 如何解決「SQL對象名無效」的問題
SQL對象名無效的解決方法
產生SQL對象名無效的問題大多原因是由於數據遷移導致的,下面我們給出解決方法.
在使用資料庫的過程中,經常會遇到資料庫遷移或者數據遷移的問題,或者有突然的資料庫損壞,這時需要從資料庫的備份中直接恢復。但是,此時會出現問題,這里說明幾種常見問題的解決方法。
一、孤立用戶的問題
比如,以前的資料庫的很多表是用戶test建立的,但是當我們恢復資料庫後,test用戶此時就成了孤立用戶,沒有與之對應的登陸用戶名,哪怕你建立了一個test登錄用戶名,而且是以前的用戶密碼,用該用戶登錄後同樣沒辦法操作以前屬於test的用戶表。
這個問題有兩種辦法解決。 先說解決的前提條件。
首先,要用備份文件還原資料庫,我們這里的資料庫名為testdb,裡面有屬於用戶test的用戶表。這個很容易了操作了,不多講了,在企業管理器中很方便可以恢復。恢復後,就產生了孤立用戶test。然後,用sa用戶或者具有DBA許可權的用戶登錄,創建一個test資料庫登錄用戶,密碼隨便設置了,也可以和以前的保持一致。我們用它來對應孤立的test用戶。
使登錄用戶和資料庫的孤立用戶對應起來
其實我們建立了同樣名稱的資料庫登錄用戶後,資料庫中的表我們照樣不能使用時因為sid的不同,就是系統登錄表和資料庫用戶表中的用戶名相同,單是sid欄位,資料庫中的還是以前舊系統的sid值,所以我們就要把它對應成我們新建的,資料庫靠sid來識別用戶。
這里可以使用存儲過程sp_change_users_login。它有三種動作,分別是report,update_one和auto_fix。
運行sp_change_users_login 'report',系統會列出當前資料庫的孤立用戶數。
我們只需要選擇當前資料庫為testdb,然後運行 sp_change_users_login 'update_one','test','test' --系統就會提示修復了一個孤立用戶。
如果沒有建立test的登錄用戶,還可以用 sp_change_users_login 'Auto_Fix', 'test', NULL,
'testpassword' --來創建一個登錄用戶名為test,密碼為testpassword的用戶與之對應。
好了,到這里通常情況下,資料庫對象得到訪問問題已經解決了。如果有多個資料庫中有同一個用戶的數據表,只需要選擇不同的資料庫,執行update_one的那個就行了。
二、對象名 『tablename』 無效的問題 這里可能會有人遇到對象名
『tablename』無效的問題。系統表卻不會產生這個問題,而用戶表還要加上用戶名,然後是表明才能訪問,比如select * from
author,會說對象名 author 無效,而用select * from test.author就可以訪問,這個是用戶首選身份的問題。
方法一: 解決很簡單,就是察看test登錄用戶是否具有dbo的許可權或者系統管理的許可權,有的話去掉就行了。 因為如果用戶有dbo身份,那麼它登陸後的默認表空間是dbo的系統表空間,所以去掉了之後,就會以正常的test表空間訪問數據表了。
方法二: 將所有test所有表設置為dbo就OK了
執行語句:exec sp_msforeachtable "sp_changeobjectowner '?','dbo'"
孤立帳戶,就是某個資料庫的帳戶只有用戶名而沒有登錄名,這樣的用戶在用戶庫的sysusers系統表中存在,而在master資料庫的syslogins中卻沒有對應的記錄。
孤立帳戶的產生一般是一下兩種: 1.將備份的資料庫在其它機器上還原; 2.重裝系統或SQL SERVER之後只還原了用戶庫
解決方法是使用sp_change_users_login來修復。
sp_change_users_login的用法有三種
用法1: exec sp_change_users_login 'REPORT'
列出當前資料庫的孤立用戶
用法2: exec sp_change_users_login 'AUTO_FIX','用戶名'
可以自動將用戶名所對應的同名登錄添加到syslogins中
用法3: exec sp_change_users_login 'UPDATE_ONE','用戶名','登錄名' 將用戶名映射為指定的登錄名。
⑦ 請教sql語句中not like的用法
標准SQL中用like進行模糊查詢,有兩個通配符:%百分號代表任意個字元,_下劃線代表一個字元。
1、like'Mc%' 將搜索以字母 Mc 開頭的所有字元串。
2、like'%inger' 將搜索以字母 inger 結尾的所有字元串。
3、like'%en%' 將搜索在任何位置包含字母 en 的所有字元串。
SQL LIKE 操作符語法
『_':下劃線,表示1個任意字元;如 ... where name like '_am',表示僅第一位任意,並以'am'結尾,結果如"Tam","Mam","Pam"等。
'%』: 百分號,表示任意個任意字元;如 ... where name like 『%am',表示前面可以有任意位,只要以'am'結尾,結果如"abcam",「bcdefgham","qwertyuiopam","am"等等。
以上內容參考:網路-SQL LIKE
⑧ MySql中Sql的執行過程
如果查詢緩存沒有命中,那麼SQL請求會進入分析器,分析器是用來分辨SQL語句的執行目的,其執行過程大致分為兩步:
表1 語法分析關鍵字然後再通過語法規則解析,判斷輸入的SQL 語句是否滿足MySQL語法,並且生成圖5的語法樹。由SQL語句生成的四個單詞中,識別出兩個關鍵字,分別是select 和from。根據MySQL的語法Select 和 from之間對應的是fields 欄位,下面應該掛接username;在from後面跟隨的是Tables欄位,其下掛接的是userinfo。
優化器的作用是對SQL進行優化,生成最有的執行方案。如圖6所示,前面提到的SQL解析器通過語法分析和語法規則生成了SQL語法樹。這個語法樹作為優化器的輸入,而優化器(黃色的部分)包含了邏輯變換和代價優化兩部分的內容。在優化完成以後會生成SQL執行計劃作為整個優化過程的輸出,交給執行器在存儲引擎上執行。
所處的位置如上圖所示,這節的重點在優化器中的邏輯變換和代價優化上。
邏輯變換也就是在關系代數基礎上進行變換,其目的是為了化簡,同時保證SQL變化前後的結果一致,也就是邏輯變化並不會帶來結果集的變化。其主要包括以下幾個方面:
這樣講概念或許有些抽象,通過圖7 來看看邏輯變化如何在SQL中執行的吧。
如圖7所示,從上往下共有4個步驟:
1. 針對存在的SQL語句,首先通過「否定消除」,去掉條件判斷中的「NOT」。語句由原來的「or」轉換成「and」,並且大於小於符號進行變號。藍色部分為修改前的SQL,紅色是修改以後的SQL。2. 等值傳遞,這一步很好理解分別降」t2.a=9」 和」t2.b=5」分別替換掉SQL中對應的值。3. 接下來就是常量表達式計算,將「5+7」計算得到「12」。4. 最後是常量表達式計算後的化簡,將」9<=10」化簡為」true」帶入到最終的SQL表達式中完成優化。
代價優化是用來確定每個表,根據條件是否應用索引,應用哪個索引和確定多表連接的順序等問題。為了完成代價優化,需要找到一個代價最小的方案。因此,優化器是通過基於代價的計算方法來決定如何執行查詢的(Cost-based Optimization)。簡化的過程如下:
這里將配置操作的代價分為MySQL 服務層和MySQL 引擎層,MySQL 服務層主要是定義CPU的代價,而MySQL 引擎層主要定義IO代價。MySQL 5.7 引入了兩個系統表mysql.server_cost和mysql.engine_cost來分別配置這兩個層的代價。如下:MySQL 服務層代價保存在表server_cost中,其具體內容如下:
由上可以看出創建臨時表的代價是很高的,尤其是內部的myisam或innodb臨時表。MySQL 引擎層代價保存在表engine_cost中,其具體內容如下:
目前io_block_read_cost和memory_block_read_cost默認值均為1,實際生產中建議酌情調大memory_block_read_cost,特別是對普通硬碟的場景。MySQL會根據SQL查詢生成的查詢計劃中對應的操作從上面兩張代價表中查找對應的代價值,並且進行累加形成最終執行SQL計劃的代價。再將多種可能的執行計劃進行比較,選取最小代價的計劃執行。
當分析器生成查詢計劃,並且經過優化器以後,就到了執行器。執行器會選擇執行計劃開始執行,但在執行之前會校驗請求用戶是否擁有查詢的許可權,如果沒有許可權,就會返回錯誤信息,否則將會去調用MySQL引擎層的介面,執行對應的SQL語句並且返回結果。例如SQL:「SELECT * FROM userinfo WHERE username = 'Tom';「假設 「username「 欄位沒有設置索引,就會調用存儲引擎從第一條開始查,如果碰到了用戶名字是」 Tom「, 就將結果集返回,沒有查找到就查看下一行,重復上一步的操作,直到讀完整個表或者找到對應的記錄。需要注意SQL語句的執行順序並不是按照書寫順序來的,順序的定義會在分析器中做好,一般是按照如下順序:
如果命中的記錄比較多,應用會從MySql Server一批批獲取數據
本文從MySQL中SQL語句的執行過程作為切入點,首先介紹了查詢請求的執行流程,其中將MySQL的處理分為MySQL Server層和MySQL存儲引擎層。通過介紹SQL語句的流轉,引出了後面要介紹的5大組件,他們分別是:連接器、查詢緩存、分析器、優化器、執行器。後面的內容中對每個組件進行了詳細的介紹。連接器,負責身份認證和許可權鑒別;查詢緩存,將查詢的結果集進行緩存,提高查詢效率;分析器,對SQL語句執行語法分析和語法規則,生成語法樹和執行計劃;優化器,包括邏輯變換和代價優化;執行器,在檢查用戶許可權以後對數據進行逐條查詢,整個過程遵守SQL語句的執行順序。