一、課程介紹
《數據庫的原理和應用》是一個前導課程,也是一個基礎課程。是《應用程序開發》類的課程的基礎課程。
二、數據庫產品介紹
目前主流的數據庫有:
Oracle(美國甲骨文公司),大中型應用程序。(java+Oracle)
SQL Server(美國微軟公司),.NET應用程序。(C#+SQL Server)
MySQL(美國甲骨文公司),中小型網站。(Java+MySQL,PHP+MySQL)
三、MySQL基礎
1、創建數據庫
數據庫是一個容器,里面有表、視圖、存儲過程等。
格式:create database <數據庫名>;
查看數據庫:show databases;
使用數據庫:use <數據庫名>;
2、創建表
表是用來存儲數據,表是數據庫中最重要的一個對象。
格式:create table <表名>(
<字段名> <字段類型>(寬度) ,
...
);
auto_increment:
auto_increment表示自增,即自動編號,只有整型字段才可以設置,一個表只能有一個自增字段。
示例:
create table product(
id int auto_increment primary key, --auto_increment表示自增,primary key表示主鍵。
name varchar(50),
price float,
image varchar(255)
);
查看表結構:
desc <表名>
查看表數據(查詢):
select * from <表名>
插入數據:
insert into <表名>(<字段名1>,<字段名2>,...) values(<值1>,<值2>,...)
一、查詢語句(select)
1、基本格式:select <字段列表> from <表名>
說明:
*表示所有字段。
如果查部分字段,需要指定,字段間用逗號隔開。
指定標題使用as,如:select id as '編號', name as '名稱' from product;
去重的關鍵字:distinct
例如:select distinct teamid from player where chinesename like '%傑克遜%'
2、條件子句where
格式:where <條件>
說明:條件是一個邏輯表達式。
(1)比較運算符:> < >= <= !=
(2)邏輯運算符:not and or
(3)范圍運算符:<字段> between <值1> and <值2>
(4)in運算符:<字段> in (<值1>,<值2>,...)
(5)like運算符:like '含通配符的字符串',主要作模糊查詢
mysql的通配符:
%表示任意個字符(0~n)
_表示任意1個字符(0~1)
[]表示范圍
(6)is null運算符:<字段> is [not] null
3、排序子句
格式:order by <字段> [desc | asc]
說明: desc表示降序(值由大到小),asc表示升序(值由小到大),默認為升序。
4、limit子句
格式:limit([偏移量],<記錄個數>)
說明:如果省略偏移量,則表示從第1條開始取,
如:limit 10 --從開始取前10條。
如:limit 20,10 --則表示從第20+1條開始取10條,即(21~30)。
5、分組子句
格式:group by <字段> [having <條件>]
說明:having <條件>表示限定分組,即對分組后的結果進行篩選。
聚合函數(統計函數):
count(<字段>):記錄個數
sum(<數值字段>):求和
avg(<數值字段>):求平均值
max(<數值字段>):求最大值
min(<數值字段>):求最小值
6、多表的連接查詢
(1)全連接查詢
格式:select <字段列表> from <表1>,<表2> where <表1>.<連接字段>=<表2>.<連接字段>
功能:從多張表查詢數據
(2)join連接
a、內連接
格式:select <字段列表> from <表1> t1 inner join <表2> t2 on <表1>.<連接字段>=<表2>.<連接字段>
說明:格式中t1和t2分別表示表1和表2的別名;inner join也簡寫為join。
b、外連接
左外連接
格式:select <字段列表> from <表1>left join <表2> on <表1>.<連接字段>=<表2>.<連接字段>
說明:左表中所有的記錄都顯示
右外連接
格式:select <字段列表> from <表1>right join <表2> on <表1>.<連接字段>=<表2>.<連接字段>
說明:右表中所有的記錄都顯示
c、交叉連接
格式:select <字段列表> from <表1>cross join <表2>
7、子查詢
概念:子查詢就是一個SQL語句中嵌套的一個select語句。
(1)比較子查詢
格式:select <字段列表> from <表名> where <字段> <比較運算符> <子查詢>
說明:此時子查詢的結果必須是單值。
舉例:查詢身高最高的球員的中文名和身高。
查詢超過平均身高的球員的中文名和身高。
(2)in子查詢
格式:select <字段列表> from <表名> where <字段> in <子查詢>
說明:該子查詢結果應是一個單列的結果集。
(3)exists子查詢
格式:select <字段列表> from <表名> where exists <子查詢>
二、數據庫的基本操作:增、刪、改
1、增(insert)
格式:insert | replace into <表名>[(<字段列表>)] values(<值列表>)
說明:
replace into :表示如果有該主鍵的記錄,則進行替換;沒有的話,則和insert into相同,插入新的一條。
如果一次要插入多行,則數據行之間用","分隔。
2、刪(delete)
格式:delete from <表名> where <條件>
說明:還可以加上order by 子句和limit子句
舉例:delete from score order by maths limit 3; --刪除成績表中數學成績最低的3行記錄。
3、改(update)
格式:update <表名> set <字段1>=<值1>,...where <條件>
說明:可以加上order by 子句和limit子句
三、約束(constraint)
1、主鍵約束(Primary Key)
主鍵是用來唯一地表示一個實體,為了防止出現重復的記錄。
一個表只能有一個主鍵。
例如:學生(學號,姓名,……)
(1)在創建表時候創建主鍵約束
create table <表名>(
<字段1> <類型1> primary key, --列的完整性約束
<字段2> <類型2> ,
...
)
create table <表名>(
<字段1> <類型1>
<字段2> <類型2> ,
primay key(<字段1>) --表的完整性約束
)
(2)在表創建后添加主鍵約束
alter table <表名> add primary key(<字段名>)
2、唯一約束(unique)
限制某個字段不要出現重復值
(1)在創建表時候創建唯一約束
create table <表名>(
<字段1> <類型1> unique, --列的完整性約束
<字段2> <類型2> ,
...
)
create table <表名>(
<字段1> <類型1>
<字段2> <類型2> ,
unique(<字段1>) --表的完整性約束
)
(2)在表創建后添加唯一約束
alter table <表名> add unique(<字段名>)
3、檢查約束(check)
設置某個字段取值范圍。
(1)在創建表時候創建檢查約束
create table <表名>(
<字段1> <類型1> check(<條件>), --列的完整性約束
<字段2> <類型2> ,
...
)
(2)在表創建后添加檢查約束
alter table <表名> add check(<條件>)
MySQL的存儲引擎均能對check子句進行分析,但會忽略check子句,即check子句約束還不起作用。
4、外鍵約束(參照完整性約束Foreign key)
外鍵不是當前表的主鍵,是別的表的主鍵。
外鍵一定要取自於父表的主鍵。
(1)在創建表的時候定義外鍵約束
create table <表名>(
<字段1> <類型1> ,
<字段2> <類型2> ,
foreign key(<外鍵字段>) references <父表>(<主鍵字段>) --表的完整性約束
)
說明:外鍵的定義應放在所有字段定義的后面,不能放在某列的定義里面
(2)在表創建后添加外鍵約束
alter table <表名> add foreign key(<外鍵字段>) references <父表>(<主鍵字段>)
說明:
在外鍵的定義的最后可加上以下幾種選項:
on update cascade --級聯更新,即更新了父表的主鍵值,子表中對應的外鍵值也會隨之更新。
on delete cascade --級聯刪除,即刪除了父表中某主鍵對應的記錄,那么子表中外鍵值和主鍵相同的記錄也會隨之刪除。
on update ristrict --禁止更新,即如果父表中有和外鍵值相同的主鍵值,則禁止修改此外鍵值
on delete ristrict --禁止刪除,即如果父表中有和外鍵值相同的主鍵值,則禁止刪除該記錄
5、默認值
default <值>
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
作業:
(一)導入數據
(1)下載study.sql文件。
鏈接: https://pan.baidu.com/s/1aAYSHZ-C32DsaLG3PeSJNw
提取碼: wj5x
(2)將study.sql腳本文件復制到p盤。
(3)登錄mysql服務器,進入mysql提示符狀態。
提示:
(a)通過navicat修改root密碼為123456
(b)找到mysql命令所在位置,如:C:\Program Files\MySQL\MySQL Server 5.7\bin,在此窗口空白處按下shift鍵的同時右鍵,選擇“在此處打開命令窗口”,進入windows命令行。
(c)在windows命令行狀態,輸入:mysql -h localhost -P 3308 -u root -p123456
說明:因為機房修改了mysql的端口號為3308,如果采用默認端口3306,登錄本機的話,只需要指定用戶名和密碼即可登錄 ,即:mysql -u root -p123456
(4)mysql>create database study;
(5)mysql>use study;
(6)mysql>source p:/study.sql;
(7)mysql>show tables;
(8)mysql>select * from player;
(二)完成以下查詢並截圖
(1)查詢身高(height)220以上的球員的編號(id),姓名(chinesename),身高(height)信息。
(2)使用between..and..運算符查詢球齡(playAge)10~15之間(含10和15)的球員的編號(id),姓名(chinesename),球齡(playAge)信息。
(3)查詢位置(position)是'中鋒'的球員的編號(id),姓名(chinesename),位置(position)信息。
(4)使用in運算符查詢球隊編號(teamid)為13或15或17的球隊的球員的編號(id),姓名(chinesename),球隊編號(teamid)信息。
(5)從player表中查詢中文姓名以"傑克遜"結尾的所有球員的編號(id),姓名(chinesename),英文名(englishname)。
(6)從player表查詢英文名為"Chris Paul"的球員的編號(id),姓名(chinesename),英文名(englishname)。
(7)從player表中查詢中文姓名含"詹姆斯"的所有球員的編號(id),姓名(chinesename),英文名(englishname)。
(8)如果以20條記錄為1頁對所有球員的記錄進行分頁,請查詢第11頁的球員的編號(id),姓名(chinesename),英文名(englishname)。
-------分組查詢--------
(9)查詢身高(height)由高到低的前10位球員的編號(id),姓名(chinesename),身高(height)信息。
(10)從球員表player中查詢全聯盟現役球員的年齡age最大值和最小的值。
(11)從球員表player中查詢全聯盟現役球員的平均身高。
(12)分別統計每個球隊的球員數,結果字段有球隊編號teamid和球員數。
(13)統計球員數大於或等於20的球隊編號teamid和球員數。
------多表的連接查詢-----
數據准備:
提示:先使用use study;切換數據庫
(a)向球隊表team中添加一支球隊
insert into team(id,name) values(31,'啦啦隊');
(b)向球員表player中添加一名球員
insert into player(id,chinesename) values(540,'周琦');
(c)分別對兩表進行全連接、內連接、左外連接、右外連接和交叉連接查詢,只查球員編號id,球員中文名chinesename和球隊名name,並提交相應的結果截圖(共5張)。
--------子查詢---------
(1)查詢球員中文名chinesename含“傑克遜”的球隊的隊名name。
(2)查詢身高height最高的球員所在的球隊的球隊編號id和球隊名稱name。
(3)查詢身高height高於全聯盟平均身高的球員的球員編號id,球員中文名chinesename和身高height。
--------增、刪、改-------
創建數據庫和表:
(a)數據庫sanguo
(b)國家表country
(c)武將表person
(d)添加記錄
(e)刪除姓名為空的記錄
(f)將“關雲長”的姓名改成“關羽”。
-----------約束-------------
(1)創建數據庫:school
(2)創建班級表bj,班級編號cid作主鍵約束且自動編號, 班級名cname作唯一約束
(3)創建學生表xs,學生編號sid作主鍵約束且自動編號,學生姓名sname字符串,學生的年齡sage整型作檢查約束,取值范圍(10-99),班級編號cid作外鍵約束參照班級表的班級編號
(4)輸入記錄
班級表bj
學生表xs