1 #1、數據庫 2 3 #1.建立數據庫 4 #if not exists 可忽略不寫 5 CREATE DATABASE IF NOT EXISTS school ; 6 7 #2.查看數據庫 8 SHOW DATABASES ; 9 10 #3.查看數據庫建立的結構 11 SHOW CREATE DATABASE school; 12 13 #3.使用數據庫 14 USE school; 15 16 #4.刪除數據庫 17 DROP DATABASE school; 18 #drop 連表結構都給刪除掉 19 DROP TABLE 表名 20 #truncate:截斷表操做 清除全部數據,保留表結構 21 TRUNCATE TABLE 表名 22 #delete:有條件的刪除表中的記錄 where 23 DELETE FROM 表名 24 25 #2、表 26 27 #1.列的類型 28 #(1)數值類型 經常使用int整形(取值範圍正負21億) double float(浮點型) decimal(5,2)表示數值共有五位 小數點有兩位 若是超過設置的範圍 則顯示該範圍的最大值 運用SET sql_mode='strict_trans_tables'以後 系統會變成嚴格檢查模式 識別該錯誤 29 #(2)字符串類型 char 固定長度不可變 varchar(20)給了長度實際少於長度 則會自動收縮 長度可變 text(長文本) #(3)日期類型 經常使用datatime 格式爲yyyy-mm-dd hh:mm:ss 30 31 #2.字段的屬性 32 #(1)UNSIGNED 表示無符號的 用在數值上 表示不能有負數 33 #(2)ZEROFILL 表示用零自動填充 好比數值給了五位 實際是單位數3 則變成00003 34 #(3)AUTO_INCREMENT 表示自動曾長 配合primary 可使用 默認爲1 每次增長1 35 #(4)PRIMARY KEY 表示字段爲主鍵 惟一 不能爲空 36 #(5)DEFAULT 設置字段的默認值 37 #(6)COMMENT 爲字段添加註釋 給字段加註釋 空格後加註釋 給表加註釋要 comment='註釋' 38 #(7)NULL,NOT NULL 表示當前字段可不能夠爲空 39 #屬性之間也有先後順序之分: UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT COMMENT 40 41 #3表的屬性 (每一個庫 表 列均可以設置字符集) 42 #表的屬性包括引擎 編碼 和註釋 43 #(1)查看mysql的支持引擎 44 SHOW ENGINES; 45 #經常使用的引擎是InnoDb安全 可靠 不支持全文索引 MYISAM只支持索引 46 47 #3.建立表 48 CREATE TABLE IF NOT EXISStudent( 49 `id` INT(3) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT COMMENT '主鍵', #零填充 不爲空 自增 註釋 50 `stuname` VARCHAR(5) COMMENT '學生姓名', #默認值 51 `password` VARCHAR(20) DEFAULT '123456' COMMENT '密碼', 52 `sex` VARCHAR(2) DEFAULT '男' COMMENT '性別', 53 `brithday` DATETIME COMMENT '出生日期', 54 `addresss` VARCHAR(100), 55 PRIMARY KEY (`id`) 56 )AUTO_INCREMENT=100 COMMENT='學生表'; #設置自增的起始值 57 SET @@auto_increment_increment=1; #設置自動增加的多少 58 59 #4.查看錶 60 SHOW TABLES 61 62 #5.修改數據表 63 64 #(1)修改表名 65 ALTER TABLE student RENAME AS student3; 66 67 #(2)添加字段 68 ALTER TABLE student3 ADD sub INT(3) NOT NULL; 69 70 #(3)修改字段名 71 ALTER TABLE student3 MODIFY 成績 VARCHAR(10) DEFAULT '77'; #把原來的字段改爲心得類型和屬性 72 ALTER TABLE student3 CHANGE sub 成績 VARCHAR (20) DEFAULT '88'; #把舊的字段全新的改爲名字 和類型屬性 73 74 #(4i٤字段 75 ALTER TABLE student3 DROP 成績; 76 77 #6.刪除表 78 DROP TABLE student1; 79 80 #3、外鍵管理 81 #1.外鍵的概念 82 /*每一個表只有一個主鍵 多個外鍵 83 擁有主鍵的表叫作主表,引用外鍵的表叫作從表或字表 84 */ 85 #2.建立外鍵 86 #方式一 建立字表時建立外鍵 87 CREATE TABLE grade( 88 gradeid INT(10) PRIMARY KEY AUTO_INCREMENT , 89 gradename VARCHAR(5) 90 ) 91 CREATE TABLE student( 92 stuid INT(10) PRIMARY KEY, 93 stuname VARCHAR(5) NOT NULL, 94 sutgrade INT(10), 95 stusex VARCHAR(2), 96 #Fk_被引用的字段名開始 外鍵類型 外鍵名 外鍵 被引用字段名 引用於 grade表 的id主鍵 97 CONSTRAINT PK_stugrade FOREIGN KEY(stuid) REFERENCES grade(gradeid) 98 ); 99 #方式二 建立完字表以後 建立外鍵 100 ALTER TABLE student ADD CONSTRAINT PK_stugrade FOREIGN KEY(stuid) REFERENCES grade(gradeid); 101 102 #3.刪除外鍵 103 #在生成外鍵時會生成一個索引 因此刪除外鍵還要在刪除索引 刪除表時先刪除字表 在刪除主表 104 ALTER TABLE student DROP FOREIGN KEY PK_stugrade; # 105 ALTER TABLE student DROP INDEX PK_stugrade; 106 107 108 #4、數據管理 109 #語法出現的順序 where → group by → having → order by → limit 110 #DML (database make laugage 數據操做語言) 111 #1.使用語句添加數據 112 #insert into 表名 (表的列名) values(值) 113 #列名能夠省略 可是值必須填寫全面 填寫多個用逗號隔開 114 INSERT INTO grade(gradename) VALUES('大二'); 115 116 #2.修改數據 117 UPDATE 表名 SET 列名=新值 WHERE 118 UPDATE student SET sutgrade=1 WHERE stuid BETWEEN 1 AND 3; 119 120 #3.刪除數據 121 #若是刪除自增列的最後一個 再次添加數據時 添加的自增數值是會從上次刪除的繼續增長 122 若是想要從一開始則要在調用TRUNCATE刪除表的結構 123 DELETE FROM student WHERE stuid=1 124 TRUNCATE student; 125 #4查詢操做 select 要查的列名 from 表名 where 126 escape關鍵字用於自定義轉移字符 例如 ESCAPE ":"廥:爲轉移字符 127 #(1)單表查詢: 128 #查詢部分列 別名 129 SELECT stuname 學生姓名,sex 性別 FROM student; 130 #查詢全部列 131 SELECT * FROM student stu; 132 #where條件查詢:where True和False 133 SELECT * FROM student WHERE stuname='山間的風' OR stuname='李四' 134 #模糊查詢 135 SELECT result 及格 FROM result WHERE result BETWEEN 95 AND 100 ORDER BY DESC 136 SELECT NAME 姓名 FROM student WHERE NAME LIKE "_大%" 137 SELECT NAME 姓名 FROM student WHERE id IN(3,4,5) 138 #空查詢 139 SELECT NAME 姓名 FROM student WHERE id IS NULL; 140 SELECT NAME 姓名 FROM student WHERE id IS NOT NULL; 141 SELECT NAME 姓名 FROM student WHERE id IS ""; 142 #使用聚合函數查詢 max() min() count() avg() sum() 143 SELECT MAX(result) AS 最高分 FROM result; 144 SELECT MIN(result) AS 最低分 FROM result; 145 SELECT COUNT(rid) FROM result; 146 SELECT AVG(result) AS 平均分 FROM result; 147 SELECT SUM(result) AS 總分 FROM result; 148 #分組查詢:group by 列 149 SELECT (result) AS 平均分,subid AS 科目編號 FROM result GROUP BY subid; 150 #排序查詢:order by 列 默認是升序ASC 降序DESC 151 SELECT * FROM result ORDER BY result 152 #分頁查詢:獲取表中的某幾條記錄 limit [a],b(跳過a條獲取b條記錄) 153 SELECT * FROM result LIMIT 3#獲取前三條 154 #每頁展現三條數據 155 # 1 limit 0,3 156 # 2 limit 3,3 157 # 3 limit 6,3 158 # b=(a-1)*c 159 #聚合函數判斷查詢 having 160 SELECT AVG(result) AS 平均分,subid AS 科目編號 161 FROM result GROUP BY subid HAVING 平均分<60; 162 #平均分+科目編號,按照科目分組 降序排列成績,要求展現及格的平均分 163 SELECT AVG(result) 平均分, 164 subid 科目編號 165 FROM result 166 GROUP BY subid 167 HAVING 平均分>60 168 ORDER BY 平均分 DESC LIMIT 2; 169 #函數 字符串鏈接 170 SELECT * FROM student WHERE NAME LIKE CONCAT('%','王','%'); 171 SELECT INSERT('山間的風好人',5,2,'正直'); 172 SELECT SUBSTRING('山間的風好人',1,4) 173 #獲取彍日期 174 SELECT CURDATE(); 175 #獲取當前時間. 176 SELECT CURTIME(); 177 #獲取當前時間和日期 178 SELECT NOW(); 179 #返回日期中一年中的第幾周 180 SELECT WEEK(NOW()) 181 #返回日期中的年份 182 SELECT YEAR('2002-10-01') 183 #返回的是時間中的第幾小時 184 SELECT HOUR(CURTIME()) 185 #返回一小時中的第幾分組 186 SELECT MINUTE(CURTIME()) 187 #兩個日期之間的天數 188 SELECT DATEDIFF(CURDATE(),'2002-10-1'); 189 #日期與天數相加後的新日期 190 SELECT ADDDATE(NOW(),10000); 191 192 #(2)鏈接查詢:多張表之間查詢的一種方式 193 #但凡須要多張表的記錄,鏈接查詢 194 #內鏈接查詢:去尋找表與表之間的公共列(從表外鍵--->主表中的主鍵) 195 #語法一:使用where條件判斷公共列是否相等 196 #該列的定義不明確(要注意的問題,表別名.) 197 SELECT AVG(result) AS 平均分,subname AS 科目名稱 198 FROM result r,SUBJECT s WHERE r.`subid`=s.`subid` GROUP BY r.subid; 199 #語法二:inner join語句去篩過濾條件 on 後是公共列相等 200 SELECT AVG(result) AS 平均分,subname AS 科目名稱 201 FROM result r INNER JOIN SUBJECT s ON r.`subid`=s.`subid` GROUP BY r.subid; 202 #外鏈接查詢:既能夠獲取符合條件的記錄,也能夠獲取不符合條件的記錄 203 #1:左外鏈接 left join on,會把左表中不知足條件的數據也檢索出來 204 SELECT result AS 分數,subname AS 科目名稱 205 FROM result r LEFT JOIN SUBJECT s ON r.`subid`=s.`subid` 206 #2:右外鏈接 right join on會把右表中不知足條件的數據也檢索出來 207 #SELECT AVG(result) AS 平均分,subname AS 科目名稱 208 #FROM result r right JOIN SUBJECT s ON r.`subid`=s.`subid` GROUP BY s.`subid` 209 SELECT result AS 分數,subname AS 科目名稱 210 FROM result r RIGHT JOIN SUBJECT s ON r.`subid`=s.`SUBID` 211 #3:全鏈接 full join on 可使用union並集解決該問題 212 SELECT result AS 分數,subname AS 科目名稱 213 FROM result r LEFT JOIN SUBJECT s ON r.`subid`=s.`subid` 214 UNION 215 SELECTsult AS 分數,subname AS 科目名稱 216 FROM result r RIGHT JOIN SUBJECT s ON r.`subid`=s.`subid`; 217 #4:自鏈接 :將同一張表 擬成兩個別名至關於 兩張表 利用連接查詢 實現自鏈接 218 SELECT a.categoryname AS "父欄目",b.categoryname AS "子欄目" FROM category AS a, category AS b WHERE a.`categoryid`=b.`pid` 219 220 #5.子查詢 : 在查詢語句中有添加的select語句稱之爲子查詢 221 #簡單子查詢:使用比較運算符鏈接子查詢 222 #查詢科目爲java基礎的考試成績 223 SELECT r.`result` AS 考試成績,s.`subname` AS 科目 224 FROM result r INNER JOIN SUBJECT s ON r.subid=s.subid 225 WHERE s.subname='java基礎'; 226 SELECT r.result AS 考試成績 FROM result r WHERE r.`subid`= 227 ( 228 #1 內層查詢先執行,執行外層查詢 229 #2 外層查詢要什麼,內層查詢查什麼? 230 SELECT subid FROM SUBJECT WHERE subname='java基礎' 231 ) 232 #查詢最近一次參加'Java第一學年'考試的最高分和最低分 233 SELECT MAX(studentresult) AS 最高分,MIN(studentresult) AS 最低分 234 result r WHERE subjectNo IN( 235 #查詢的是Java第一學年科目的編號 236 SELECT subjectNo FROM SUBJECT WHERE subjectName='JAVA第一學年' 237 ) AND examDate IN( 238 #Java第一學年考試的最近一第二天期 239 SELECT MAX(examDate) FROM result WHERE subjectNo=( 240 SELECT subjectNo FROM SUBJECT WHERE subjectName='JAVA第一學年' 241 ) 242 ) 243 #in和not in 有可能子查詢返回的記錄數爲多條 244 #參加了Java第一學年考試的學生信息 245 SELECT * FROM student WHERE studentNo IN( 246 SELECT studentNo FROM result WHERE subjectNo=( 247 SELECT subjectNo FROM SUBJECT WHERE subjectName='JAVA第一學年' 248 ) 249 ) 250 #未參加Java第一學年考試的學生信息 251 SELECT * FROM student WHERE studentNo NOT IN( 252 SELECT studentNo FROM result WHERE subjectNo=( 253 SELECT subjectNo FROM SUBJECT WHERE subjectName='JAVA第一學年' 254 ) 255 ) 256 #批量刪除:藉助in或not in實現 257 DELETE FROM student WHERE studentNo IN(1015,1016,1017); 258 #批量修改 259 260 #exists和not exists 返回的True(真)和False(假) 261 #exists:若是子查詢中存在記錄 返回真 不然假 262 #not exists:若是子查詢中不存在記錄 返回值 不然假 263 #相關子查詢的思想 264 #查詢Java第一學年考試的成績是否存在大於80分的學生,若是存在打印全部人 265 SELECT studentName AS 學生姓名 266 FROM student stu WHERE EXISTS( 267 SELECT studentresult,studentNo FROM result r WHERE subjectNo=( 268 SELECT subjectNo FROM SUBJECT WHERE subjectName='JAVA第一學年' 269 )AND studentresult>80 AND r.studentNo=stu.studentNo# 大於80分的成績===>學生編號 270 ) 271 #檢查Java第一學年考試的成績是否存在小於80分,若是有,則全部成績+5分,直至>=80分 272 UPDATE result SET studentresult=studentresult+5 WHERE EXISTS( 273 #欺騙SQL編譯器 274 SELECT studentresult,studentNo FROM (SELECT * FROM result) temp 275 WHERE subjectNo=( 276 SELECT subjectNo FROM SUBJECT WHERE subjectName='JAVA第一學年' 277 )AND studentresult<80 AND temp.subjectNo=result.subjectNo AND temp.studentNo=result.studentNo 278 #姓名+身份證號:姓名相同+身份證編號不一樣 279 ) 280 #五.數據庫的事務 281 #1什麼是事務: 將一組SQL一句放在同一批次內去執行 若是一個語句出錯,則全部語句都取消執行 mysql只支持 innodb 282 #2.事務的特色(ACID) 原子性 一致性 隔離性 持久性關閉自動提交 283 #3.事務的應用 284 #SHOW VARIABLES LIKE '%autocommit%'; 查看狀態 285 # SET AUTOCOMMIT=0; 關閉自動提交事務 286 #START TRANSACTION :開始一個事務 標記事務的起始點 287 #commit :提交一個事務給數據庫 288 #pollback :將事務回滾袋本次事務的初始狀態 289 # SET AUTOCOMMIT=1; 開啓自動提交事務 290 #六.數據庫的索引 291 #是提升查詢速度 確保數據的惟一,實現表與表之間的參照完整性 不加索引會逐條查詢,加了索引以後會有獨特的算法 提升查詢的效率 292 293 #主鍵索引 294 #設置主鍵時 默認增長主鍵索引,能肯定記錄在數據庫的位置 不爲空 不重複 295 296 #惟一索引 UNIQUE 297 #做用避免數據中重複值 不重複 可爲空 298 #常規索引 index 299 #快速定位特殊數據 不能添加多的索引 300 #全文索引 fulltext 301 #只能用於MYISAM 只能用於 char varchar 302 #方式一 303 CREATE TABLE test1( 304 id PRIMARY KEY, 305 test VARCHAR(5) UNIQUE, 306 c VARCHAR(9), 307 d VARCHAR(9), 308 INDEX index_cd(c,d), 309 e TEXT, 310 FULLTEXT(e) 311 ); 312 #方式二: 313 CREATE TABLE test1( 314 id , 315 test VARCHAR(5) , 316 c VARCHAR(9), 317 d VARCHAR(9), 318 e TEXT, 319 ); 320 ALTER TABLE test1 ADD PRIMARY KEY(id); 321 ALTER TABLE test1 ADD UNIQUE KEY(test) 322 ALTER TABLE test1 ADD INDEX(c,d) 323 ALTER TABLE test1 ADD FULLTEXT(e); 324 325 #在應用全文索引是 不能超過庫中的百分之五十 不然不會應用索引 326 在搜索時 SELECT *FROM studentname WHERE MATCH(studentname) AGAINST("李"); 327 328 #顯示索引 show index from 表名 329 #刪除索引 drop index 索引名 on 表名 或 330 331 #七.構建視圖: 332 CREATE VIEW student_result 333 AS 334 SELECT r.studentResult AS 學生成績,s.`StudentName` AS 姓名 335 FROM result r INNER JOIN student s ON r.studentNo=s.studentNo 336 WHERE EXISTS( 337 #判斷的是是否存在90以上的成績 338 SELECT studentResult FROM result WHERE studentResult>90 AND 339 subjecTNo=r.`SubjectNo` 340 ) AND r.`SubjectNo`=( 341 SELECT subjectNo FROM SUBJECT WHERE subjectName='JAVA第一學年' 342 )ORDER BY r.`StudentResult` DESC LIMIT 3; 343 344 #檢索視圖 345 SELECT * FROM student_result; 346 347 #刪除視圖的操做 348 DROP VIEW student_result; 349 #OUTFILE備份方式 350 SELECT * FROM student INTO OUTFILE 'D:/qiangge.txt' 351 #清空student表中的全部數據 352 TRUNCATE student; 353 #INFILE還原數據 354 LOAD DATA INFILE 'D:/qiangge.txt' INTO TABLE student; 355 356 #九if結構的存儲過程 357 DELIMITER ;; #將SQL分隔符聲明爲兩個分號 358 CREATE PROCEDURE `proc_if`(IN param INT,OUT result VARCHAR(20)) 359 BEGIN 360 DECLARE word VARCHAR(20); #聲明瞭一個字符串變量 長度爲20 361 IF param=0 THEN 362 SET word='type參數是0'; 363 ELSEIF param=1 THEN 364 SET word='type參數是1'; 365 ELSE 366 SET word='type參數既不是0,也不是1'; 367 END IF; 368 SET result=word;#爲輸出參數賦值 369 END;; 370 DELIMITER ; 371 #調用存儲過程 372 SET @a=100; 373 SET @result=''; 374 CALL `proc_if`(@a,@result); 375 SELECT @result AS '最終結果';
2、數據庫的練習java
*********************************************************************** 關於MySQL的練習 create table Student ( Sno int primary key not null,--學號主鍵 Sname varchar(50) not null,--學生姓名 Ssex varchar(50) not null,--學生性別 Sbirthday datetime,--出生年月 Class int--班級 ) truncate table Student--清空表格 insert into Student values(108,'曾華','男','1977-09-01',95033) insert into Student values(105,'匡明','男','1975-10-02',95031) insert into Student values(107,'王麗','女','1976-01-23',95033) insert into Student values(101,'李軍','男','1976-02-20',95033) insert into Student values(109,'王芳','女','1975-02-10',95031) insert into Student values(103,'陸君','男','1974-06-03',95031) select *from Student delete from Student create table Course-- ( Cno char(5) primary key not null,--課程號主鍵 Cname Varchar(10)not null,--課程名稱 Tno Varchar(50) not null--教工編號(外碼) foreign key(Tno) references Teacher (Tno), ) insert into Course values('3-105','計算機導論','825') insert into Course values('3-245','操做系統','804') insert into Course values('6-166','數字電路','856') insert into Course values('9-888','高等數學','831') select *from Course delete from Course create table Score ( Sno int not null, --學號(外碼) Cno Char(5) not null,--課程號(外碼) Degree Decimal(4,1),--成績 foreign key(Sno) references Student(Sno),--學號(外碼) foreign key(Cno) references Course(Cno),--課程號(外碼) primary key(Sno,Cno) ) insert into Score values(103,'3-245',86) insert into Score values(105,'3-245',75) insert into Score values(109,'3-245',68) insert into Score values(103,'3-105',92) insert into Score values(105,'3-105',88) insert into Score values(109,'3-105',76) insert into Score values(101,'3-105',64) insert into Score values(107,'3-105',91) insert into Score values(108,'3-105',78) insert into Score values(101,'6-166',85) insert into Score values(107,'6-166',79) insert into Score values(108,'6-166',81) delete from Score create table Teacher ( Tno varchar(50) primary key not null,--教工編號(主碼) Tname varchar(50)not null,--教工姓名 Tsex varchar(50)not null,--教工性別 Tbirthday datetime,--教工出生年月 Prof varchar(50),--職稱 Depart Varchar(10)not null--教工所在部門 ) insert into Teacher values(804,'李誠','男','1958-12-02','副教授','計算機系') insert into Teacher values(856,'張旭','男','1969-03-12','講師','電子工程系') insert into Teacher values(825,'王萍','女','1972-05-05','助教','計算機系') insert into Teacher values(831,'劉冰','女','1977-08-14','助教','電子工程系') select *from Student select *from Course select *from Teacher select *from Score delete from Teacher --1.查詢Student表中的全部記錄的Sname、Ssex和Class列。 select Sname,Ssex,Class from Student; --2.查詢教師全部的單位即不重複的Depart列。 select distinct Depart from Teacher --3.查詢Student表的全部記錄。 select * from Student --4.查詢Score表中成績在60到80之間的全部記錄。 select *from Score where Degree between 60 and 80; --5.查詢Score表中成績爲85,86或88的記錄。 select *from Score where Degree in(85,86,88); --6.查詢Student表中「95031」班或性別爲「女」的同窗記錄。 select *from Student where Class=95031 or Ssex='女'; --7.以Class降序查詢Student表的全部記錄。 select *from Student order by Class desc; --8.以Cno升序、Degree降序查詢Score表的全部記錄。 select *from Score order by Cno,Degree desc; --9.查詢「95031」班的學生人數。--聚合函數,針對數據列,計算求和或者計數等一系列算數性,返回結果是一個數值 --SUM(數值類型列) AVG(數值類型列) MAX(數值類型列) MIN(數值類型列) COUNT(*) select COUNT(*) from Student where Class=95031 select MAX(Degree) as maxfen ,MIN(Degree) minfen from Score where Cno='3-105'--as起別名 --10.查詢Score表中的最高分的學生學號和課程號。(子查詢或者排序) select Sno,Cno from Score where Degree=(select MAX(Degree) from Score); select top 1 *from Score order by Degree desc--從大到校排序再取第一行 --11.查詢‘3-105’號課程的平均分。 Select AVG(Degree) from Score where Cno='3-105'; --查詢每門課的平均成績--分組和聚合結合的時候,先分組,而後對每一組分別進行聚合 Select AVG(Degree) from Score group by Cno;--先按Cno分組,在對Cno聚合 --12.查詢Score表中至少有5名學生選修的並以3開頭的課程的平均分數。 select x.Cno ,avg(x.Degree) from Score x where Cno like '3%' and 5<(select count (*) from Score y where x.Cno = y.Cno) group by x.Cno select Cno,AVG(Degree) from Score where Cno like '3%' group by Cno having COUNT(*)>=5--篩選分組完了再對每一組進行AVG聚合,分完組以後至關於只剩下分完組的列 select Cno,AVG(Degree) as degreess from Score where Cno like '3%' group by Cno having COUNT(*)>=1 order by degreess--order by理解爲最後才執行 --13.查詢最低分大於70,最高分小於90的Sno列。 select x.Sno from Score x where 70 < (select MIN(y.Degree) from Score y where x.Sno=y.Sno)and 90>(select max(z.Degree) from Score z where x.Sno=z.Sno); select Sno from Score where Degree >70 and Degree <90--分數大於70,小於90的Sno列 --14.查詢全部學生的Sname、Cno和Degree列。--錶鏈接,必定有主外鍵關係:都好隔開兩個表造成笛卡爾積,再進行where篩選,經過表主外鍵關係篩選,where只是個篩選條件 select Sname, Cno, Degree from Student,Score where Student.Sno = Score.Sno; --15.查詢全部學生的Sno、Cname和Degree列。--left right select Sno,Cname,Degree from Score inner join course on Score.Cno=Course.Cno--不寫默認也是有inner select Student.Sno,Sname,Ssex,Student.Class,Score.Sno,Score.Cno,Score.Degree from Student left join Score on Student.Sno=Score.Sno--left join左表顯示全,右表有關係的顯示,沒有的顯示爲空 select Student.Sno,Sname,Ssex,Student.Class,Score.Sno,Score.Cno,Score.Degree from Student right join Score on Student.Sno=Score.Sno select Sno,(select Cname from Course where Score.Cno=Course.Cno) as 課程 ,Degree from Score--Cname不在Score表中,用子查詢時()內的Cname必訓as一個新名稱 --16.查詢全部學生的Sname、Cname和Degree列。 select Sname,Cname,Degree from student join Score on Student.Sno=Score.Sno join Course on Score.Cno=Course.Cno --17.查詢「95033」班所選課程的平均分。 select AVG(degree)from Student join Score on Student.Sno=Score.Sno and Class='95033' --18.★假設使用以下命令創建了一個grade表: create table grade(low int,upp int,[rank] char(1)) insert into grade values(90,100,'A') insert into grade values(80,89,'B') insert into grade values(70,79,'C') insert into grade values(60,69,'D') insert into grade values(0,59,'E') select *from grade --現查詢全部同窗的Sno、Cno和rank列。(三種方法) select Sno,Cno,Degree,[rank] from Score,grade where Degree between low and upp order by [rank] select Sno,Cno,Degree,[rank] from Score join grade on Degree between low and upp order by [rank]--on後面加篩選條件 select Sno,Cno,(select [rank] from grade where Score.Degree between low and upp) as LV from Score order by Degree desc--子查詢獲得的結果必須惟一 --19.查詢選修「3-105」課程的成績高於「109」號同窗成績的全部同窗的記錄。 select*from Score where Cno='3-105'and degree>(select degree from score where Sno='109' and Cno='3-105') --20.查詢score中選學多門課程的同窗中分數爲非最高分紅績的記錄。select x.* from Score x where Degree<(select MAX(y.Degree) from Score y where y.Sno=x.Sno) select * from score as a where sno in(select sno from score group by sno having COUNT(*)>1 )and degree <(select MAX(degree) from score as b where b.cno = a.cno group by cno)--去掉每門課的最高分 select *from Score a where Sno in(select Sno from Score group by Sno having COUNT(*)>1) and Degree not in (select MAX(Degree) from Score b group by Cno having b.Cno=a.Cno)--去掉每門課的最高分 select *from Score where Sno in(select Sno from Score group by Sno having COUNT(*)>1) and Degree not in(select MAX(Degree) from Score where Sno in(select Sno from Score group by Sno having COUNT(*)>1))--除去所有課程中的最高分 select *from Score a where Degree not in (select MAX(Degree) from Score b group by Cno having b.Cno=a.Cno)--查詢除了每門課最高分以外的其餘學生分數信息 --a.Con=b.Con是比較同一門課程(Con)的條件下篩選的,至關於在課程名稱相同的狀況下比較分數,除去每一門課程的最高分 1.查詢學號出現兩次及以上的學號出來 select Sno from Score group by Sno having COUNT(*)>1 2.查詢步驟1中的學號的人的分數 select *from Score where Sno in(select Sno from Score group by Sno having COUNT(*)>1) 3.查詢全部人的分數最高分 select MAX(Degree) from Score where Sno in(select Sno from Score group by Sno having COUNT(*)>1) 4.從步驟2的結果中提出最高分即步驟3的 select *from Score where Sno in(select Sno from Score group by Sno having COUNT(*)>1)and Degree!=(select MAX(Degree) from Score) --21.查詢成績高於學號爲「109」、課程號爲「3-105」的成績的全部記錄。 select *from score where Degree>(select degree from score where sno='109'and Cno='3-105') --22.查詢和學號爲108的同窗同年出生的全部學生的Sno、Sname和Sbirthday列。 select sno,Sname,sbirthday from student where YEAR(Sbirthday)=(select YEAR(Sbirthday) from Student where Sno='109') --23.查詢「張旭「教師任課的學生成績。 select degree from Score where Cno in (select Cno from Course where Tno in (select Tno from Teacher where Tname = '張旭')) select degree from Score join Course on Score.Cno=Course.Cno join Teacher on Course.Tno=Teacher.Tno where Tname = '張旭' --24.查詢選修某課程的同窗人數多於5人的教師姓名。 select Tname from Teacher where Tno=(select Tno from Course where Cno=(select Cno from Score group by Cno having COUNT(Cno)>=5)) --25.查詢95033班和95031班全體學生的記錄。 select*from student inner join Score on Student.Sno=Score.Sno where Class in(95033,95031) select *from Student,Score where Class in(95033,95031) and Student.Sno=Score.Sno --26.查詢存在有85分以上成績的課程Cno. select distinct Cno from Score where degree>=85;--去重 --2七、查詢出「計算機系「教師所教課程的成績表。 select *from Score where Cno in( select Cno from Course where Tno in (select Tno from Teacher where Depart='計算機系')) select Sno,Score.Cno,Degree from Score join Course on Score.Cno=Course.Cno join Teacher on Course.Tno=Teacher.Tno where Depart='計算機系' --2八、查詢「計算機系」與「電子工程系「不一樣職稱的教師的Tname和Prof。 select Tname,Prof from Teacher where Prof not in (select prof from Teacher where Depart='電子工程系' and Prof in (select Prof from Teacher where Depart='計算機系')) and Depart in ('計算機系','電子工程系') --查詢兩個系中教師相同職稱名稱,不在這裏面的就是除去兩個系都有的剩下的,見上面 select prof from Teacher where Depart='電子工程系' and Prof in (select Prof from Teacher where Depart='計算機系') --2九、查詢選修編號爲「3-105「課程且成績至少高於選修編號爲「3-245」的同窗的Cno、Sno和Degree,並按Degree從高到低次序排序。 select*from Score where Cno='3-105'and Degree>(select MAX(Degree) from Score where Cno='3-245') order by Degree --30、查詢選修編號爲「3-105」且成績高於選修編號爲「3-245」課程的同窗的Cno、Sno和Degree. select*from score where cno='3-105'and Degree>(select MAX(degree) from Score where Cno='3-245') --3一、 查詢全部教師和同窗的name、sex和birthday.--錶鏈接,union(縱向鏈接,表1和表2數據類型要對應且列數對應)上下連接,與join on左右相關連接不一樣 select sname,ssex,sbirthday from student union select Tname,Tsex,Tbirthday from Teacher --32.查詢全部「女」教師和「女」同窗的name、sex和birthday. select sname,ssex,sbirthday from student where Ssex='女' union select Tname,Tsex,Tbirthday from Teacher where Tsex='女' --33.查詢成績比該課程平均成績低的同窗的成績表。--相關子查詢--同一門學科的平均分,,每門學科低於自身平均分的 select * from score as a where a.degree< (select AVG(degree) from score as b where a.cno = b.cno group by cno)--至關於foreach列出每一門課的平均分 select * from score as a where a.degree< (select AVG(degree) from score as b group by cno having a.cno = b.cno) --34.查詢全部任課教師的Tname和Depart. select Tname,Depart from Teacher where Tno in(select distinct Tno from Course) --35.查詢全部未講課的教師的Tname和Depart. select Tname,Depart from Teacher where Tno in(select Tno from Course where Cno not in(select Cno from Score group by Cno)) select Tname,Depart from Teacher where Tno not in(select Tno from Course) --36.查詢至少有2名男生的班號。 select Class from Student where Ssex='男' group by Class having COUNT(*)>=2 --37.查詢Student表中不姓「王」的同窗記錄。 select *from Student where Sname not like '王%' --38.★查詢Student表中每一個學生的姓名和年齡。 select Sname,nianling=(select DATEDIFF(YEAR,Sbirthday,GETDATE())) from Student --39.★查詢Student表中最大和最小的Sbirthday日期值。 select max(Sbirthday)as [max],MIN(Sbirthday) as[min] from Student --40、以班號和年齡從大到小的順序查詢Student表中的所有記錄。 select *from Student order by Class desc,Sbirthday asc --4一、查詢「男」教師及其所上的課程。 select Teacher.Tno,Tname,Tsex,Cname,Cno from Teacher join Course on Teacher.Tno=Course.Tno where Tsex='男' --4二、查詢最高分同窗的Sno、Cno和Degree列。 select *from Score where Degree=(select MAX(Degree)from Score) --4三、查詢和「李軍」同性別的全部同窗的Sname. select Sname from Student where Ssex in (select Ssex from Student where Sname='李軍') --4四、查詢和「李軍」同性別並同班的同窗Sname. select Sname from Student where Ssex=(select Ssex from Student where Sname='李軍') and Class iN (select Class from Student where Sname='李軍') --4五、查詢全部選修「計算機導論」課程的「男」同窗的成績表。 select *from Score where Sno in(select Sno from Student where Ssex='男') and Cno=(select Cno from Course where Cname='計算機導論'); --至查詢student表的第三、4行--分頁查詢 ★必需要用主鍵Sno來排除,防止重複 select *from Student select top 2 *from Student where Sno not in(select top 2 Sno from Student)--第二頁,屏蔽掉當前頁的前面頁的內容,前面top是取屏蔽以後的數據的一頁顯示條數 --2行爲一頁 select top 2 *from Student where Sno not in(select top 4 Sno from Student)--第三頁