SQL 結構化查詢語言。
MySQL 數據庫管理系統。
SQL Server 微軟的數據庫管理系統。
Oracle(甲骨文) 數據管理系統。
show databases; 顯示數據庫管理系統中所有數據庫
create database 數據庫名; 創建數據庫。
drop database 數據庫名; 刪除數據庫。
use 數據庫名; 使用指定數據庫。
在創建數據庫的過程中可以指定編碼語言和校對規則。
ISO 8859-1
gbk gb2312 都是簡體中文編碼。
big5 繁體編碼集。
utf8 比較全面的一個編碼集。支持大多數編碼格式。
了解if exists 以及 if not exists 從句的含義。
了解編碼集 以及 校對規則的含義。
掌握使用navicat 創建數據庫的方式。
3月14日
了解:
alter 修改 其實對數據庫我們修改的只有編碼集和校對 alert 警告
timestamp 時間戳
掌握:
show tables;
yyyy-mm-dd hh:mm:ss
yyyy 年份 mm 月份 dd 日期
hh 小時 mm 分 ss 秒
3月19日
課堂目標:
完成創建簡單的 table 以及 數據的插入處理。
創建表: create table 表名(列名 類型,……);
創建表的最簡單的語法。
desc 表名
查看表的結構。
select * from 表名;
查詢表中的所有的內容。
在任意的數據表中,
每一個有效行都描述了一個完整的對象。
insert into 表名 values(值……);
select name from stuinfo;
select age from stuinfo;
select name,age from stuinfo;
select * from stuinfo;
4月2日
1、查詢 xs_kc表中 成績大於75的同學的 學號 和成績?
成績>75 條件 where 成績>75
查詢的 是不是 學號 和 成績 滿足我要求的條件。
select 學號,成績 from xs_kc where 成績>75
2、我想找到成績最高的同學的學號?
select 學號 from xs_kc where 成績= max(成績);
本條語句的錯誤是因為 max函數的使用語法不對
正確的寫法為:
select 學號 from xs_kc where 成績=
(select MAX(成績) from xs_kc)
練習:查詢到成績最低的同學的學號 ?
3、我想查詢一下成績在平均分以上的同學的學號和成績?
條件: 成績在平均分以上。
查詢結果為:學號、成績。
聚合函數: max() min() avg() count()(此函數在所有的管理系統的登錄過程中必用!)
select 學號,成績 from xs_kc where 成績>
(select avg(成績) from xs_kc)
4、我想查詢一下 課程編號為 101的 分數 大於平均分的 同學的 學號和成績
5、between and
我想查詢一下成績 大於 60 小於 70的學號和成績.
select 學號,成績 from xs_kc where 成績>60 and 成績<70
select 學號,成績 from xs_kc where 成績 between 60 and 70
6、SQL 查詢語句的書寫的規律。
結果:
條件:
7、我想查詢成績最高的同學的姓名和分數?
結果:xs表中姓名 xs_kc中的分數
中期結果 : 成績最高的同學的學號
條件: 成績最高
查詢的結果來自幾張表?
目前是兩張,xs.姓名 xs_kc.分數
8、笛卡爾積 n*m
9、查詢 最高成績的同學的姓名,成績
select 姓名,max(xs_kc.`成績`) from xs,xs_kc where xs.學號=
(
SELECT 學號 from xs_kc where `成績`=
(select MAX(成績) from xs_kc)
)
10、簡單的介紹count 函數的使用
count(主鍵名) 如果沒有主鍵 再使用count(*) 進行查詢
查詢一下學號為081102 姓名為 王林的同學是否存在
select COUNT(學號) from xs WHERE
學號='081102' and 姓名='王林'
2018年4月4日
1、查詢XS表中各個同學的姓名、專業名、總學分。
2、查詢XS表中計算機系同學的學號、姓名、和總學分,結果中各列的標題分別指定為
number、name、mark。
select 姓名 as name,學號 as number ,總學分 as mark from xs
where 專業名='計算機'
條件查詢 以及 列名的顯示
3、查詢XS表中計算機系各同學的學號,姓名和總學分,對其總學分按照以下規則進行替換,
若總學分為空 替換為 尚未選課
總學分小於50,替換為不合格
總學分在50和52之間替換為合格
大於52 替換為優秀。
列標題替換為 等級。
select 學號,姓名,
CASE
when 總學分 is NULL then '尚未選課'
WHEN 總學分 <50 then '不合格'
WHEN 總學分 >=50 and 總學分<=52 then '合格'
WHEN 總學分 >52 then '優秀'
END AS 等級
from xs
where `專業名`='計算機'
4、按120 分計算成績,顯示 xs_kc表中學號為081101的學生課程信息
結果:課程信息
條件:學號為081101
SELECT 學號,課程號,FLOOR(`成績`*1.2)
as 成績,學分 from xs_kc
where 學號='081101'
5、查詢XS表中的專業名和總學分 並且消滅重復行
distinct 關鍵字用於消滅結果集中的重復記錄。
6、求學生的總人數?
結果:人數
7、統計備注不為空的學生的數目。
結果:數目
條件:備注不為空
select COUNT(學號) as 總人數 from xs
where 備注 is not null
8、統計總學分在50分以上的同學的人數。
select COUNT(學號) as 總人數 from xs
where 總學分>50
9、查詢選修101課程的學生的最高分和最低分。
min() ,max()
10、求學號081101的學生所學課程的總成績
select SUM(成績) as 總成績 from xs_kc where 學號='081101'
11、求選修101課程的學生的平均成績
select AVG(成績) from xs_kc WHERE 課程號=101
12、查詢XS 表中學號為 081101的學生的情況
select * from xs where 學號='081101'
13、查詢XS表中總學分大於50 的情況
select * from xs where 總學分>50
14、查詢表中備注為空的學生的情況
select * from xs where 備注 is null
15、查詢表中專業為計算機,性別為女(0) 的同學的情況
select * from xs where 專業名='計算機' and 性別=0
16、查詢XS_KC表中102 和 206 課程中大於80分的同學的記錄?
select * from xs_kc where `成績`>80 and 課程號 in (102,206)
17、查詢xs表中姓“王”的學生的學號,姓名及性別
使用的關鍵字是“like” 和 “like”
配合使用的通配符是“%”(任意長度)“_”(一個長度)
select 學號,姓名,性別 from xs where 姓名 like '王%';
18、查詢xs表中姓“王”且名字為3個字的學生的學號,姓名及性別
select 學號,姓名,性別 from xs where 姓名 like '王__';
19、查詢XS表中學號倒數第二個數字為0的學生的學號姓名及專業名。
select 學號,姓名,專業名 from xs where 學號 LIKE '%0_'
20、查詢xs表中名字包含下划線的學生學號和姓名?
select 學號,姓名 from xs where 姓名 LIKE '\_'
//這個明天搞
21、查詢XS表中不在1989年出生的同學的情況
select 學號,姓名,專業名,出生時間 from xs
where 出生時間 >'1989-12-31' or 出生時間<'1989-01-01'
date類型的數據是可以比較大小的。
select 學號,姓名,專業名,出生時間 from xs
where 出生時間 not LIKE '1989%'
like關鍵字可以應用於date類型的列。
22、查詢表中專業名為"計算機" 、"通信工程"的學生的情況
select * from xs where 專業名='計算機' or 專業名='通信工程'
select * from xs where 專業名 in ('計算機','通信工程')
23、查詢 XS中 學分尚不確定的學生的情況
select * from xs where
備注 LIKE '%待補考%'
24、查詢所有學生選過的課程名和課程號。
結果:課程名和課程號
條件:選過的。
select kc.課程名,kc.課程號 from kc where kc.課程號 in
(select DISTINCT xs_kc.課程號 from xs_kc)
select DISTINCT kc.課程名,kc.課程號 from
kc,xs_kc
where kc.`課程號`=xs_kc.`課程號`
25、查找選修了 計算機基礎課程 且成績在80分以上的學生學號 姓名 課程名(計算機基礎課程) 成績。
select xs.`學號`,xs.`姓名`,xs_kc.`成績`,kc.`課程名`
from xs INNER JOIN xs_kc ON xs.`學號`=xs_kc.`學號`
INNER JOIN kc ON xs_kc.`課程號`=kc.`課程號` AND kc.`課程名`='計算機基礎'
AND xs_kc.`成績`>80
26、查找選修了 計算機基礎課程 且成績在80分以上的學生學號 姓名 課程名(所有課程), 成績。
select xs.`學號`,xs.`姓名`,kc.`課程名`,xs_kc.`成績` FROM
xs INNER JOIN xs_kc on xs.`學號` in
(select DISTINCT xs_kc.`學號`from xs_kc inner JOIN kc ON xs_kc.`成績`>80 AND
kc.`課程名`='計算機基礎')
INNER JOIN kc ON xs_kc.`課程號`=kc.`課程號`
27、查找課程不同,但是成績相同的學生的學號和課程號以及成績。
在同一表中查詢三個field。
條件:成績相同。
如果兩張表中存在一個 主外鍵 關系 可以 a.field = b.field
如果只是從一張表中查,那么 我們必須將這一張表看成是 兩張表。
select DISTINCT a.學號,a.課程號,a.成績 from xs_kc a,xs_kc b
where a.`課程號`!=b.`課程號` and a.`成績`=b.`成績`
28、查找所有學生的情況及他們選修的課程號、若學生未選修任何課程,也要包括其情況
29、查找 KC表中所有被學生選過的課的課程名
怎么才能知道是否被選過 ?
xs_kc 表中出現的課程號,才證明選過
select DISTINCT kc.`課程名` from kc , xs_kc where
kc.`課程號`=xs_kc.`課程號`
SELECT DISTINCT kc.`課程名` from kc INNER JOIN xs_kc
on kc.`課程號`=xs_kc.`課程號`
30、查找被選修了的課程的選修情況和所有開設的課程名
選修情況?
有多少人選了課程
SELECT COUNT(xs_kc.`學號`) as 人數,xs_kc.`課程號`,kc.`課程名`
from xs_kc RIGHT JOIN kc on xs_kc.`課程號`=kc.`課程號`
GROUP BY kc.`課程號`
31.查找未選修離散數學的學生的姓名、學號和專業名
SELECT xs.`學號`,xs.`姓名`,xs.`專業名` from xs
where xs.`學號` not in
(
select xs_kc.`學號` from xs_kc WHERE xs_kc.`課程號` =
(SELECT kc.`課程號` from kc where kc.`課程名`='離散數學')
)
32.查找選修了離散數學的學生學號
select xs_kc.`學號` from xs_kc WHERE xs_kc.`課程號` =
(SELECT kc.`課程號` from kc where kc.`課程名`='離散數學')
33.查找XS表中比所有計算機系的學生年齡都大的學生的學號、姓名、專業名和出生日期
SELECT xs.`出生時間` from xs where xs.`出生時間`<
(
select min(出生時間) from xs where xs.`專業名`='計算機'
)
SELECT xs.`出生時間` from xs where xs.`出生時間`<
all
(
select 出生時間 from xs where xs.`專業名`='計算機'
)
34.查找XS_KC表中課程號206的課程成績不低於課程號101的最低成績的學生的學號
select xs_kc.`學號` from xs_kc WHERE xs_kc.`成績`>=
any
(
SELECT 成績 from xs_kc where xs_kc.`課程號`=101
)
AND xs_kc.`課程號`=206
35.查找選修206號課程的學生姓名
select xs.`姓名` from xs INNER JOIN xs_kc
on xs.`學號`=xs_kc.`學號`
where xs_kc.`課程號`=206
36.將XS中各專業名輸出
37.求XS中各專業的學生數
38.求被選修的各門課程的平均成績和選修該課程的人數
select xs_kc.`課程號`,kc.`課程名`,COUNT(學號),AVG(成績) from xs_kc
INNER JOIN kc ON kc.`課程號`=xs_kc.`課程號`
GROUP BY `課程號`
39.在XSCJ數據庫上產生一個結果集,包括每個專業的男生人數、女生人數、總人數以及學生總人數
SELECT COUNT(學號) as 女生人數,專業名 from xs
where 性別 =0 GROUP BY 專業名;
SELECT COUNT(學號) as 男生人數,專業名 from xs
where 性別 =1 group by 專業名;
SELECT COUNT(學號) as 專業總人數, 專業名 from xs group by 專業名;
SELECT COUNT(學號) as 總人數 from xs;
40.查找平均成績在85分以上的學生的姓名,學號和平均成績
SELECT xs_kc.`學號`,AVG(xs_kc.`成績`) ,xs.`姓名`
from xs_kc
INNER JOIN xs on xs_kc.`學號`=xs.`學號`
GROUP BY xs_kc.`學號` having AVG(xs_kc.`成績`)>85
41.查找選修課程超過2門且成績都在80分以上的學生的學號,姓名
SELECT xs_kc.`學號`,xs.`姓名`
from xs_kc
INNER JOIN xs
on xs.`學號`=xs_kc.`學號`
GROUP BY xs_kc.`學號`
HAVING MIN(成績)>80
AND COUNT(xs_kc.`課程號`) >2
42.將通信工程專業的學生按出生日期先后排序
select * from xs where 專業名='通信工程'
ORDER BY `出生時間` ASC
43.將計算機專業學生的“計算機基礎”課程成績,姓名,學號按降序排列
SELECT xs_kc.`成績`,xs.`姓名`,xs.`學號` from xs_kc INNER JOIN xs
ON xs.`學號`=xs_kc.`學號`
INNER JOIN kc ON kc.`課程號`=xs_kc.`課程號`
where kc.`課程名`='計算機基礎' AND
xs.`專業名`='計算機'
ORDER BY xs_kc.`成績` DESC
44.將計算機專業學生按其平均成績排列
SELECT AVG(成績) from xs_kc INNER JOIN
xs on xs.`學號`=xs_kc.`學號`
where xs.`專業名`='計算機' GROUP BY xs_kc.`學號`
ORDER BY AVG(成績)
45.查找XS表中學號最靠前的5位學生的信息
SELECT xs.* from xs
ORDER BY 學號 LIMIT 0,5;
46.查找XS表中從第4位同學開始的5位學生的信息
查詢數據庫 select 所查的列名 from 表名 where 條件
插入數據庫 insert into 表名 values 數值
刪除數據庫 delete from 表名 where 條件
修改數據庫 update 表名 set 數字 where 數值
視圖
create view v_xs
as SELECT xs.`學號`,xs.`姓名`,xs.`出生時間` from xs
with check option 創建視圖
drop view 視圖名 刪除視圖
create or replace view v_xs
as SELECT xs.`學號`,xs.`姓名`,xs.`出生時間` from xs
with check option 修改視圖
show full tables 顯示視圖和表
alter view v_gameinfo as
select gameid,gamename from gameinfo 更改視圖
視圖是一種虛表
視圖是以存儲的查詢
索引是什么?
理解 索引其實就是類似於目錄
索引的作用都是 提高查詢的效率
什么是約束?
規則 index
primary key 主鍵約束 不能重復,並且不能為null,表示當前行與其他行的區別。
unique 唯一約束
index
fulltext
set autocommit=0
start transaction;
select * from gameinfo
delete frim gameinfo
select * from gameinfo
rollback
set autocommit=1
show index from class
create index index_xs on xs(姓名(2) desc); 創建索引
-- index 索引的作用就是提高一下查詢的效率。
show index from xs 顯示索引
-- create index index_xs on xs(姓名(2) desc);
-- index 索引的作用就是提高一下查詢的效率。
-- show index from xs
create unique index unique_xs on xs(姓名);
-- 確保當前列中的內容與其他行中內容不同
insert into xs(xs.`學號`,xs.`姓名`,xs.)
alter table xs
add unique index unique_xs (姓名)
刪除是使用 drop 關鍵字。
適合創建索引的列一般情況下都出現再條件語句中。
短索引的使用。
關於事物的概念
舉個例子:去銀行辦理一張銀行卡 從進門開始 對於銀行來說你這個業務就開始了。
整個辦理業務的過程,就稱值為“事物”。
原子性(不可分隔)
一致性(結果一致)
隔離性(對於用戶來說,業務單獨辦理)
持續性(作用的時間是一個長的時間段)
一組語句被稱作事物
事物的提交有兩種方式,一個是顯示提交 一個是隱式提交
關閉自動提交的指令
set autocommit=0
start transaction
savepoint p
rollback to SAVEPOINT p
-- 回滾到指定的保存點。
rollback
-- 回滾 (我反悔了)
commit
-- 提交(我確定這件事這樣了)
-- set autocommit=1
數據庫編程
1、我們所操作的數據,代表什么含義?
信息
信息或者說代表信息的數據必須要有容器去裝載。
裝載數據的容器就是常量或者變量。
2、MySQQL 種常量分為數值型,字符型,日期型,布爾型。
3、在MySQL種的賦值操作格式(全局變量):
1) set @變量名='xxxx'
2) select @變量名:='xxxx'
4、在局部變量中 變量的賦值可以使用select into 語句。
注意 存出過程的創建方式。可以在前文創建一個全局變量@name
set @name="王林";
select @name;
select * from xs where xs.`姓名`=@name;
select @pai:=(@pai:=3.14)+2
create PROCEDURE p01()
BEGIN
DECLARE myname varchar(8) DEFAULT '長信學生'
-- 聲明一個局部變量 myname 默認值為 長信學生
set @name= myname;
end;
call p01();
5、調用系統變量的方式,某些系統變量的使用可以不用"@@"
條件控制語句
if語句
create PROCEDURE p02()
BEGIN
set @a=80;
if @a>60 then select '及格';
else select '不及格';
end if;
END
drop PROCEDURE p02
call p02();
select @a
===============================================================
create PROCEDURE p02()
BEGIN
set @a=80;
set @b='成績';
if @a>60 then set @b='及格';
else set @b='不及格';
end if;
END
drop PROCEDURE p02
call p02();
select @b
==================================================================
create PROCEDURE p02()
BEGIN
set @a=70;
set @b='成績';
if @a>80 then set @b='優秀';
elseif @a>60 then set @b='及格';
else set @b='不及格';
end if;
END
drop PROCEDURE p02
call p02();
select @b
===================================================================
create PROCEDURE p02()
BEGIN
case
when @a>59 then select '及格';
else select '不及格';
end case;
END
drop PROCEDURE p02
call p02();
====================================================================
drop procedure p01
create procedure p01()
BEGIN
declare sum int default 0;
declare i int default 1;
while i<10 DO
set sum=sum+i;
set i=i+1;
end while;
select sum;
END
call p01();
select @a
===================================================================
drop procedure p01
create procedure p01()
BEGIN
declare sum int default 0;
declare i int default 1;
add_sum:while true do
set sum=sum+i;
set i=i+1;
if(i=101) then
leave add_sum;
end if;
end while add_sum;
select sum;
END
call p01();
==================================================================
drop procedure p01
create procedure p01()
BEGIN
declare sum int default 0;
declare i int default 1;
add_sum:while true do
set i=i+1;
if(i=101) then
leave add_sum;
end if;
if(i%2!=0) then
iterate add_sum;
end if;
set sum=sum+i;
end while add_sum;
select sum;
END
call p01();