圖片、部分試題來源網絡,侵刪,謝謝。html
create database school; use school; #學生表 create table `Student` ( `Sno` varchar(20) not null COMMENT '人名', `Sname` varchar(20) not null COMMENT '姓名', `Ssex` varchar(20) not null COMMENT '性別', `Sbirthday` datetime COMMENT '出生日期', `Class` varchar(20) COMMENT '班級' ); #課程表 create table `Course`( `Cno` varchar(20) not null COMMENT '課程號', `Cname` varchar(20) not null COMMENT '課程名稱', `Tno` varchar(20) not null COMMENT '教工編號' ); #成績表 Create table `Score` ( `Sno` varchar(20) not null COMMENT '學號', `Cno` varchar(20) not NULL comment '課程號', `Degree` DECIMAL(4,1) null COMMENT '成績' ); #教師表 create table `Teacher` ( `Tno` varchar(20) not null COMMENT '教工編號', `Tname` varchar(20) not null COMMENT '教工姓名', `Tsex` varchar(20) not null COMMENT '教工性別', `Tbirthday` datetime null COMMENT '教工出生日期', `Prof` varchar(20) null COMMENT '職稱', `Depart` varchar(20) null COMMENT '教工所在部門' ); insert into `Student` value (108,'曾華','男','1977-09-01',95033), (105,'匡明','男','1975-10-02',95031), (107,'王麗','女','1976-01-23',95033), (101,'李軍','男','1976-02-20',95033), (109,'王芳','女','1975-02-10',95031), (103,'陸軍','男','1974-06-03',95031); insert into `Course` value ('3-105','計算機導論',825), ('3-245','操做系統',804), ('6-166','數字電路',856), ('9-888','高等數學',831); insert into `Score` value (103,'3-245',86), (105,'3-245',75), (109,'3-245',68), (103,'3-105',92), (105,'3-105',88), (109,'3-105',76), (101,'2-105',64), (107,'3-105',91), (108,'3-105',78), (101,'6-166',85), (107,'6-166',79), (108,'6-166',81); insert into `Teacher` value (804,'李城','男','1958-12-02','副教授','計算機系'), (856,'張旭','男','1969-03-12','講師','電子工程系'), (825,'王萍','女','1972-05-05','助教','計算機系'), (831,'劉冰','女','1977-08-14','助教','電子工程系');
select Sname, Ssex, Class from student;
select distinct depart from teacher;
select * from student;
select Sno, Cno, degree from score where degree >= 60 and degree < 80;
select Sno, Cno, degree from score where degree = 85 or degree = 86 or degree = 88;
#或另外一種寫法
select * from score where degree in (85, 86, 88)
select * from student where Class = '95031' or Ssex = '女';
select * from student order by Class desc;
select * from score order by Cno asc, degree desc; # asc, ascending order(升序排列), desc, descending order(降序排列), 默認按升序排列
select count(Class) as '95031班學生數' from student where Class = '95031';
select * from score where degree = (select max(degree) from score); # 直接寫 select * from score where degree = max(degree)不行,會報錯
select Cno, avg(degree) as '課程平均分' from score group by Cno ;
select cno, avg(degree) from score where cno like '3%' group by cno having count(sno) > 4; #參考網站是5名學生,則查詢不到,應爲4名學生 #like '3%' 以3開頭,或like '%3' 以3結尾, 或包含'%12%'\ #HAVING增長的緣由是WHERE關鍵字沒法與合計函數一塊兒使用
SELECT SNO FROM SCORE WHERE DEGREE BETWEEN 70 AND 90;
select student.Sname, score.Cno, score.Degree from student, score where student.Sno = score.Sno;
#另外一種inner join 寫法
select student.Sname, score.Cno, score.Degree from student inner join score on student.Sno = score.Sno
select score.Sno, course.Cname, score.Degree from score, course where course.Cno = score.Cno;
#或另外一種inner join寫法
select score.Sno, course.Cname, score.Degree from score INNER JOIN course on course.Cno = score.Cno;
select student.Sname, course.Cname, score.Degree from student, course, score WHERE student.Sno = score.Sno and score.Cno = course.Cno;
select avg(degree) as '95033班平均分' from score where sno in (select sno from student where Class = '95033');
create table `grade`( `low` int COMMENT '人名', `upp` int not null COMMENT '課長', `weight` varchar(20) not null COMMENT '等級' ); 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');
#網絡上的grede,錯誤, rank關鍵字不能用,sql存在rank函數,經測試更改成weight能夠
#select Sno,Cno,Degree,rank from grade join Score on Score.Degree between low and upp; #select Sno,Cno,Degree,rank from Score, grade where Degree between low and upp;
以上爲網絡上的答案,在Navicat 11.1.13測試錯誤,實際也是由於rank關鍵字的緣由
select Sno, Cno, weight from Score, grade where (score.Degree > grade.low and score.Degree < grade.upp);
或者是
select Sno, Cno, weight from Score, grade where Degree between low and upp;
或者是
select Sno, Cno, weight from Score inner join grade where Degree between low and upp
select sno from score where score.cno = '3-105' and score.degree>(select Degree from Score where Cno = '3-105' and Sno = '109');
#上面是個人答案,題目要求是查詢到全部同窗的記錄,我的是把全部的同窗找出來了,下面是網絡上的答案,把知足條件的同窗的特徵又補全了。
select * from Student,Score where Score.Cno = '3-105' and Student.Sno = Score.Sno
and Score.Degree>(select Degree from Score where Cno = '3-105' and Sno = '109');
select * from Score a where Degree<(select MAX(Degree)from Score b where a.Cno = b.Cno) and Sno in(select Sno from Score group by Sno having count(*) > 1);
select * from Student,Score where Student.Sno = Score.Sno and Score.Degree> (select Degree from Score where Cno='3-105' and Sno = '109');
#此爲網絡上答案,我的感受不對,第一要求只查詢課程號3-105的課程,實際查詢少限制條件,第二信息不全
select * from student, course, score where score.sno = student.sno and score.cno = course.cno and score.cno = '3-105' and score.degree >
(select degree from score where cno = '3-105' and sno = '109')
select Sno, Sname, Sbirthday from student where YEAR(Sbirthday) = (select year(Sbirthday) from student where sno = '107');
#用到了year()函數
select * from student, course, score where student.sno =score.sno and score.cno = course.cno and course.tno = (select tno from teacher where tname = '張旭');
#以上爲個人答案,將學生的信息補充的較爲完整,如下是網絡答案,兩個where in 跟score.cno = course.cno student.sno = score.sno 等價,也是另外一種寫法
select Sno,Cno,Degree from Score where Cno in(select Cno from Course where Tno in(select Tno from Teacher where Tname = '張旭'));
select DISTINCT tname from teacher where tno in (select tno from course where cno in (select cno from score group by cno having count(sno) > 5));
#以前的聯等的寫法行不通,由於沒想到group by 與having count和where之間的鏈接方式
select * from student where Class='95033' or Class='95031'
select cno from score where degree >= 85;
select * from teacher, student, course, score where score. sno = student.sno and score.cno = course.cno and teacher.tno =course.tno and teacher.depart = '計算機系';
#此處有歧義的是成績表到底包含哪些內容,一般學生姓名、性別、學號包含,因此這裏我把信息特徵補的較爲齊全
select sno,Cno ,Degree from Score where Cno in (select Cno from Course where Tno in (select tno from Teacher where Depart='計算機系'))
#以上爲網絡答案
select Tname,Prof from Teacher a where Prof not in(select Prof from Teacher b where a.Depart!=b.Depart);
#此處感受略奇怪,不一樣職稱的應該有遺漏
select Cno,Sno,Degree from Score a where (select Degree from Score b where Cno='3-105' and b.Sno = a.Sno)>=(select Degree from Score c where Cno='3-245' and c.Sno = a.Sno)order by Degree desc ;
select cno, sno, degree from score a where (select degree from score b where cno = '3-105' and a.sno = b.sno) > (select degree from score c where cno = '3-245' and a.sno = c.sno);
select distinct sname as name, ssex as sex, sbirthday as birthday from student union select distinct tname as name, tsex as sex, tbirthday as birthday from teacher (ORDER BY birthday) ;
#這裏order by birthday 是本身加的,按生日升序排列,實際不用
select distinct sname as name, ssex as sex, sbirthday as birthday from student where ssex = '女' union select distinct tname as name, tsex as sex, tbirthday as birthday from teacher where tsex = '女';
SELECT sno, cno, degree from score a where a.degree < (select avg(Degree) from score b where a.sno = b.sno);
select tname, depart from teacher where tname in (select distinct tname from teacher, course, score, student where course.tno = teacher.tno and course.cno = score.cno and score.sno =student.sno);
select tname, depart from teacher where tname not in (select distinct tname from teacher, course, score, student where course.tno = teacher.tno and course.cno = score.cno and score.sno =student.sno);
select Class from student where Ssex='男' group by Class having count(*)>1;
select * from Student where Sname not like ('王%');
select Sname,YEAR(GETDATE())-year(Sbirthday) from student;
#getdate函數不可用
select MAX(Sbirthday) as 最大,MIN(Sbirthday) as 最小 from student;
select * from Student order by Class desc ,Sbirthday asc;
#注意生日數字越大,年齡越小
select Tname,Cname from Teacher,Course where teacher.Tsex='男' and Teacher.Tno = Course.Tno;
select sno, cno, degree from score where degree = (select max(Degree) from score);
select sname from student where ssex = (select ssex from student where sname = '李軍') and sname not in ('李軍');
select Sname from Student where Ssex=(select Ssex from Student where Sname='李軍')and Sname not in ('李軍')and Class=(select Class from Student where Sname='李軍');
select Sno,Degree from Score where Sno in(select Sno from Student where Ssex='男')and Cno in (select Cno from Course where Cname='計算機導論');
id 學生姓名 課程名稱 課程成績 1 張三 Linux 85 2 張三 MySQL 92 3 張三 Java 87 4 李四 Linux 96 5 李四 MySQL 100 7 王五 Linux 91 8 王五 MySQL 83 9 王五 Java 98
學生姓名 Linux MySQL Java 張三 85 92 87 李四 96 89 100 王五 91 83 98
#建立數據表
CREATE TABLE tb_lemon_grade (
id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
student_name VARCHAR(20) DEFAULT NULL,
course VARCHAR(20) DEFAULT NULL,
score FLOAT DEFAULT '0');
#更改顯示形式
SELECT student_name, MAX(IF(COURSE = 'Linux',SCORE,0)) 'Linux', MAX(IF(COURSE = 'MySQL',SCORE,0)) 'MySQL', MAX(IF(COURSE = 'Java',SCORE,0)) 'Java' FROM lemon_grade group by student_name;
year month amount 1991 1 1.1 1991 2 1.2 1991 3 1.3 1991 4 1.4 1992 1 2.1 1992 2 2.2 1992 3 2.3 1992 4 2.4 year m1 m2 m3 m4 1991 1.1 1.2 1.3 1.4 1992 2.1 2.2 2.3 2.4 select year, (select amount from aaa m where month=1 and m.year=aaa.year) as m1, (select amount from aaa m where month=2 and m.year=aaa.year) as m2, (select amount from aaa m where month=3 and m.year=aaa.year) as m3, (select amount from aaa m where month=4 and m.year=aaa.year) as m4 from aaa group by year
姓名 類別 花費 李 看電影 30 李 吃飯 100 李 旅遊 500 王 吃飯 500 王 看電影 100 王 買衣服 700 姓名 TOP1類別 TOP1花費 TOP2類別 TOP2花費 TOP3類別 TOP3花費 李 旅遊 500 吃飯 100 看電影 30 王 買衣服 700 吃飯 500 看電影 100
#decode(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,缺省值)
索引就一種特殊的查詢表,數據庫的搜索引擎能夠利用它加速對數據的檢索。它很相似與現實生活中書的目錄,不須要查詢整本書內容就能夠找到想要的數據。索引能夠是惟一的,建立索引容許指定單個列或者是多個列。缺點是它減慢了數據錄入的速度,同時也增長了數據庫的尺寸大小。git
union 去重且排序, union all 不去重且不排序github
WHERE 子句用來篩選 FROM 子句中指定的操做所產生的行。GROUP BY 子句用來分組 WHERE 子句的輸出。HAVING 子句用來從分組的結果中篩選行面試
經常使用的日期提取函數包括 year()/month()/day()/hour()/minute()/second()sql
日期運算函數包括datediff(enddate,startdate) 計算兩個時間的時間差(day);數據庫
date_sub(startdate,days) 返回開始日期startdate減小days天后的日期。網絡
date_add(startdate,days) 返回開始日期startdate增長days天后的日期。模塊化
存儲過程是一個預編譯的 SQL 語句,優勢是容許模塊化的設計,就是說只需建立一次,之後在該程序中就能夠調用屢次。若是某次操做須要執行屢次 SQL ,使用存儲過程比單純 SQL 語句執行要快。能夠用一個命令對象來調用存儲過程。函數
create proc StuProc @sname varchar(100) as begin select S#,Sname,Sage,Ssex from student where sname=@sname end go
給定user_id, login_time(時間戳),表A測試