理論
關係型數據庫:
概念:一列數據表示實體的一個屬性,屬性在數據庫也稱爲字段。一行數據表示一個實體
主鍵:用於表示兩個實體不同的列
外鍵:表示兩個表之間的關係的那一個列
主表:被引用的表;
從表:引用別人的表
關係型數據庫中的三種關係:
1.一對一建表(主鍵對外鍵)
2.一對多建表(外鍵建對方)
3.多對多建表了(需要衍生出第三張表)
判斷關係:看兩邊並根據業務需求而定
由四個部分:
1.數據定義語言:DDL(用於定義數據庫、定義數據表、定義視圖與索引等)
2.數據操作語言:DML(對數據進行增刪改)
3.數據庫查詢語言:DQL(查詢數據)
4.數據控制語言:DCL(對數據庫進行設置權限);
drop和delete的區別:
drop用於刪除數據庫(表單),delete用於刪除表單中的數據
CHAR(n)和VARCHAR(n)的區別:
CHAR是定長,VARCHAR是變長,定長無論多少個數都會以n數計算,變長是在n以內的數,定長比變長效率高但不節約內存
代碼操作
示例代碼(用於解說):
CREATE TABLE t_stu (
s_id INT PRIMARY KEY auto_increment,
s_name VARCHAR (10) UNIQUE,
s_sex CHAR (2) DEFAULT '男',
s_age INT,
s_class_id INT
);
insert into t_stu (s_id,s_name,s_sex,s_age,s_class_id) values(null,'劉基','男',20,1);
insert into t_stu (s_id,s_name,s_sex,s_age,s_class_id) values(null,'劉伯','男',15,2);
insert into t_stu (s_id,s_name,s_sex,s_age,s_class_id) values(null,'六三','女',22,3);
insert into t_stu (s_id,s_name,s_sex,s_age,s_class_id) values(null,'長官','男',13,4);
insert into t_stu (s_id,s_name,s_sex,s_age,s_class_id) values(null,'王博','女',13,5);
insert into t_stu (s_id,s_name,s_sex,s_age,s_class_id) values(null,'力來','男',18,6);
insert into t_stu (s_id,s_name,s_sex,s_age,s_class_id) values(null,'天伯','女',19,7);
insert into t_stu (s_id,s_name,s_sex,s_age,s_class_id) values(null,'黃劍鋒','男',16,8);
insert into t_stu (s_id,s_name,s_sex,s_age,s_class_id) values(null,'建築','女',17,9);
insert into t_stu (s_id,s_name,s_sex,s_age,s_class_id) values(null,'指定','女',24,10);
數據庫、
show datebases; 顯示數據庫
create database name; 創建數據庫
drop database name; 刪除數據庫
管理表、
use name; 使用xxx數據庫
create table (列名 類型) ; 創建一個表
show tables; 展示所有表
drop table name; 刪除xxx表
alter table t_student add age int; 添加一個列
數據完整性
一個列可以添加多個約束
添加主鍵約束:
1.表內在列後添加primary key關鍵字
例: create table t_test(
stuId int primary key
);
2.表外在最後加一個primary key(約束名);
例:alter table t_test add primary key(stuId);
一個表只能包含一個主鍵約束並且此列必須是唯一不能爲空的;
在primary key後加上auto_increment關鍵字可以讓主鍵值自動增長(默認從1開始,並且只能用在主鍵上)
修改自動增長的初始值:
使用:alter table name auto_increment=值;
添加唯一約束(去重,唯一的):
在列後添加一個unique關鍵字;
主鍵約束和唯一約束的區別:
主鍵約束不能爲空,唯一約束可以爲空。一張表只能有一個主鍵約束,一張表可以有多個唯一約束;
設置非空約束:
在列後添加一個not null關鍵字;
設置默認約束:
在列後添加一個default ‘值’;
引用完整性
添加外鍵約束:
constraint foreign key(外鍵名) referencse 引用表名(主鍵名)
外鍵和外鍵約束的區別:
外鍵是用來表示表與表之間的聯繫,是表中的一個列。外鍵約束是指在外鍵列上加一個約束,強制外鍵列引用數據是正確的;
DOL語句
運算符:
(1)and 和
(2)or 或者
(3)in 在某個集合內
例:in(1,3,5) 表示1或3或5
(4)not in 不在某個集合內
通配符:一般需使用like
(1)_ 表示任何一個字符
例:select s_name from t_stu where s_name like '_伯';
(2)% 表示包含0個或多個字符
處理空值數據:
判斷某列的值是否爲空: 使用 is null
判斷某列的值是否不爲空: 使用 is not null
1.插入值(設置值,添加列表值)
使用insert語句
格式:(推薦使用) insert into 表名 ( 列表列名… ) values ( 列表值 ); 注:列表名與列表值要一致
可讀性高,效率快一點
例:insert into t_stu (s_id,s_name,s_sex,s_age,s_class_id) values(null,'劉基','男',20,1);
2.inset into 表名 values ( 列表值); 注:列表值須與建表時的字段順序一致
例:insert into t_stu values(null,'劉基','男',20,1);
2.查詢值
表前綴(當多張表一起查詢時,列名相同,用於區分): select 表名.列表名… from 表名;
例:select t_stu.s_name from t_stu where s_name like '_伯';
列別名和表別名:
使用as關鍵字(注:as可省略加空格)
列
格式:select 列名 as 新名字 from 表名;
例:select s_name as'學生姓名' from t_stu where s_name like '_伯';
表
格式:select 列名 from 表名 as 新名字;
查詢使用select語句
格式:
1.select 列表名… from 表名; ( 查詢列表名中的(常用,效率高) ) select * form 表名 (查詢所有)
2.select distinct 列名 from 表名 (去重查詢數據,注當查詢多個列時是查詢多個列加起來是否唯一)
3.select 列表名… from 表名 limit 開始行數,返回幾行數據 (限定行數的查詢,注開始行數默認爲0不可爲負數但可不寫);
select 列表名… from 表名 limit (當前頁數-1)*每頁顯示條數,每頁顯示條數(分頁查詢數據)
select 列表名… from 表名 where 條件 (單條件選擇查詢)
4.select 列表名… from 表名 order by 排序數據列名 asc/desc (單列排序查詢 注:asc爲升序(默認,可不寫),desc爲降序)
select 列表名… from 表名 條件 order by 排序數據列名 asc/desc
select 列表名… from 表名 order by 排序數據列名1 asc/desc , 排序數據列名2 asc/desc (多列排序查詢,先按排序數據列名1進行排序若有相同的值時再按排序數據列名2進行排序)
聚合函數
定義:用於對數據進行統計和分析
分類:
1.count 統計
格式:select count (計算規範) from 表名 (注:計算規範可選值:(1). * : 統計所有函數包含null的行數, (2). all 列名 :計數指定列的所有非空值的行數(默認,可不寫all),(3).distinct 列名:計數指定列的所有唯一不重複非空值的行數)
2.sum 記和
格式:select sum (計算規範) from 表名
3.avg 求平均值
格式:select avg(計算規範) from 表名
注:計算規範可選值: (1). all 列名 :計數指定列的所有非空值的行數(默認,可不寫all),(2).distinct 列名:計數指定列的所有唯一不重複非空值的行數
一般用:ROUND(AVG(IFNULL(score,0)),2) ,取平均值
4.ifnull(參數1,參數2) 函數:用於判斷空值,若參數1爲空值則按參數2顯示返回,若參數1不爲空值則按參數1顯示返回(注參數可寫列名)
5。round(數值,保留小數位數)函數:用於把數值舍入爲指定小數位數
6.max 獲取最大值
格式:select max(列名) from 表名
7.min 獲取最小值
格式:select min(列名) from 表名
數據分組
投影要求:1.group by 後的列名可以投影
或
2.必須是聚合函數
使用group by語句:
格式:select 列名 from 表名 group by 列名;(注前一個列名須與後一個一樣或者爲聚合函數,否則可能會數據錯誤)
select 列名 聚合函數 from 表名 where 條件 group by 列名;
select 列名1,列名2 from 表名 group by 列名1,列名2; (多列分組,將列一值相同並且列二值相同的分到同一組)
having子句
定義:用於對分組後的數據進行過濾
格式:select 列名 from 表名 group by 列名 having 聚合條件;
having和where的區別:
二者都是過濾條件,
where運行在分組前,因此不能執行任何聚合函數。
having是運行在分組後,只能用做聚合函數的過濾。
sql的執行順序:
執行FROM ----> WHERE條件過濾 ----> GROUP BY分組 ----> 執行SELECT投影列 ----> HAVING條件過濾 ----> 執行ORDER BY排序
3.更改(修改)值
使用update語句:
格式: update 表名 set 列名 where 條件
4.刪除:
使用delete語句
格式: 1.delete form 表名 where 條件(注:此語句中會刪除一行或多行)
2.truncate table 表名(注:刪除表中所有數據,一般用於測試)
注:delete語句和truncate語句的區別:
delete(會有記錄日誌)刪除後可恢復,但效率低。刪除數據後自動增長的值不會恢復到默認值
truncate(不會記錄日誌)刪除後不可恢復,但效率高且不能用於有外鍵約束引用的表,刪除數據後自動增長的值會恢復到默認值
5.備份數據
格式: create table 賦值到的表名 select *from 原表名;(備份全部數據)
create table 賦值到的表名 select *from 原表名 where 1=0(假條件);(只複製表結構,不復制數據)
create table 賦值到的表名 select *from 原表名 where 條件;(按條件複製數據)
create table 賦值到的表名 select 列名 原表名 ;(複製指定列數據)
代碼練習示例:
一張表數據如下:
要求
1.統計每個班的學員的數量
2.統計每個班的總分
3.統計每個班的平均分
4.統計每個班的最高分
5.統計每個班的最低分
6.統計每個班學員的數量,總分,平均分,最高分,最低分
8.統計班級ID爲T01的學員的數量,總分,平均分,最高分,最低分
9.查詢平均分上85的班級有哪些?
10.查詢有女生的班級是哪些?
實現代碼:
--創建表
CREATE TABLE t_class (
name VARCHAR (20),
age INT,
gender CHAR (2),
stuNum VARCHAR (10),
score INT,
classNum VARCHAR (5)
);
--向表中添加數據
insert into t_class(name,age,gender,stuNum,score,classNum)values('Jacky',20,'男','xh1001',90,'T01');
insert into t_class(name,age,gender,stuNum,score,classNum)values('Simth',30,'男','xh1002',75,'T02');
insert into t_class(name,age,gender,stuNum,score,classNum)values('Jay',18,'男','xh1003',80,'T01');
insert into t_class(name,age,gender,stuNum,score,classNum)values('Helen',19,'女','xh1004',75,'T02');
insert into t_class(name,age,gender,stuNum,score,classNum)values('Liiy',22,'女','xh1005',90,'T03');
insert into t_class(name,age,gender,stuNum,score,classNum)values('Green',23,'男','xh1006',85,'T02');
insert into t_class(name,age,gender,stuNum,score,classNum)values('RedChar',18,'男','xh1007',60,'T01');
insert into t_class(name,age,gender,stuNum,score,classNum)values('Kevin',17,'女','xh1008',45,'T03');
-- 牢記SQL執行順序:執行FROM ==> WHERE條件過濾 ==>GROUP BY分組 ==>執行SELECT投影列 ==>HAVING條件過濾 ==>執行ORDER BY排序
--解答
-- 1.統計每個班的學員的數量
select classNum as'班級', COUNT(*) from t_class GROUP BY classNum;
-- 2.統計每個班的總分
select classNum, sum(score) from t_class GROUP BY classNum ;
-- 3.統計每個班的平均分
select classNum,ROUND(AVG(IFNULL(score,0)),2) from t_class GROUP BY classNum;
-- 4.統計每個班的最高分
select classNum,MAX(score) from t_class GROUP BY classNum;
-- 5.統計每個班的最低分
select classNum,MIN(score) from t_class GROUP BY classNum;
-- 6.統計每個班學員的數量,總分,平均分,最高分,最低分
select classNum as'班級',COUNT(*) as'人數',SUM(score) as'總分',ROUND(AVG(IFNULL(score,0)),2) as'平均值',MAX(score) as'最高分',MIN(score) as'最低分' from t_class GROUP BY classNum;
-- 8.統計班級ID爲T01的學員的數量,總分,平均分,最高分,最低分
select count(*) as'總人數',sum(score) as'總分',round(avg(IFNULL(score,0)),2) as'平均分',max(score) as'最高分',min(score) as'最低分' from t_class where classNum='T01';
-- 9.查詢平均分上75的班級有哪些?
select classNum,round(avg(ifnull(score,0)),2) from t_class GROUP BY classNum having round(avg(ifnull(score,0)),2)>=75;
-- 10.查詢有女生的班級是哪些?
select classNum,COUNT(*) from t_class where gender='女' group by classNum;
select * from t_class;