數據庫入門

理論

關係型數據庫:

概念:一列數據表示實體的一個屬性,屬性在數據庫也稱爲字段。一行數據表示一個實體
在這裏插入圖片描述
主鍵:用於表示兩個實體不同的列
外鍵:表示兩個表之間的關係的那一個列
主表:被引用的表;
從表:引用別人的表
在這裏插入圖片描述
關係型數據庫中的三種關係:
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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章