數據庫學習


SQL常用語句學習

1 創建數據庫

create database+數據庫名;

更改數據庫名字
ALTER DATABASE test
modify name= test_1

2 使用數據庫

use+數據庫名;

3 查看數據庫

查看mySQL中有哪些數據庫:
show databases;

4 刪除數據庫

drop database + 數據庫名;

5 創建表格

create table if not exists + 表名(列名+類型,
primary key(列名(,列名)),
constraint fk foreign key (sno,cno)
references student(sno)
references c(cno));


//為表添加約束
1 添加主鍵
alter table table_name
add constraint pk_yg primary key(列名);

2 添加外碼
alter table table_name
add constraint fk_xinji foreign key(薪級編號) references 薪資表(薪級編號);

3 添加列
alter table table_name
add cat_categoryNo varchar(20);

6 查看表

show tables;

7 查看表創建

show create table +表名;

8 添加數據

insert into + 表名 (列名,列名,…,列名) values(列名對應值);或
Insert into student values(直接按照建表時列名的順序寫);

9 查詢表的內容

select * from + 表名;

//按年份
YEAR(列名)='年份'

//按月份
month(date)='9'

//按日期
DAY(happentime)='01'



//集合查詢

在兩個查詢語句之間加上連接詞
union//並
intersect//交
except//差
//查詢mis專業,出生晚於1991年的學生信息
select * from student where major='MIS'
intersect
select * from student where birthyear>1991
  • 主鍵約束(primary key)
    • 被標記為主鍵的列,數據不能重復
    • 原則上一個表只能有一列被標記為主鍵
  • 自增約束(auto_increment)
    • 將該列設置為自增字段(相對於上一行+1),一般和主鍵放在一起設置
  • 非空約束(not null)
    • 被標記的列不能為空
  • 唯一約束(unique)
    • 被標記的列值不能重復 可以標記多行

10 更新數據

update teacher
set address = '北京'
where name = '趙六';

11 刪除

delete from teacher
where name = '趙六';

--啟用/禁用指定表所有外鍵約束   
alter table tbname  NOCHECK constraint all  
alter table tbname  CHECK constraint all
  
--禁用/恢復某個表的某個觸發器
ALTER TABLE tbname DISABLE TRIGGER trigname
ALTER TABLE tbname ENABLE TRIGGER trigname
  
--禁用恢復某個表上的所有觸發器
ALTER TABLE tbname DISABLE TRIGGER all
ALTER TABLE tbname ENABLE TRIGGER all
(**Mysql中**)
//關閉外鍵檢測
SET FOREIGN_KEY_CHECKS=0;
//開啟外鍵檢測
SET FOREIGN_KEY_CHECKS=1;

//刪除表
drop table 表名

12 查詢

select *
from teacher;

結果只顯示個別幾列
select name,address
from teacher;

后面可以跟where子句
select name,gender
from teacher where tid > 2;

select * from teacher
where tid > 1 and gender = '女';

select *
from teacher
where tid > 2 or gender = '男';

where后面可以加order by排序
order by 列名 [排序方式]
select *
from teacher
where tid > 2 or gender = '男'
order by tid desc ;

limit+要顯示的數量
limit 從第幾行開始,顯示多少行
select *
from teacher
where tid > 2 or gender = '男'
order by tid desc
limit 2,1;

//分組查詢
select *
from teacher
group by depart;

HAVING 子句
//在 SQL 中增加 HAVING 子句原因是,WHERE 關鍵字無法與聚合函數一起使用。
//HAVING 子句可以讓我們篩選分組后的各組數據。

//員工數超過3人的部門的最高薪資和最低薪資
select depart,max(salary),min(salary),count(*)
from employee1
group by depart
having count(*) > 3;



//范圍查詢
between...and....:在...之間
select *
from Employee1
where salary between 6000 and 12000;


//集合查詢in/not in:是否存在
select *
from Employee1
where depart in ('市場部','人事部');

//like:模糊查詢
select *
from Employee1
where name like '張%'; //%后面只是占位 不算位數 代表一串字符

select *
from Employee1
where name like '張_'; //_代表一個字符


//TOP查詢(my sql 中為limit查詢)(此方法用於sql中)
top n [percent] [with ties]
SELECT TOP number|percent column_name(s)
FROM table_name



去重
distinct


//交查詢
select sno from salebill
where sno in (
select sno from salebill where goodsno='gn001'
intersect
select sno from salebill where goodsno='gn002'
)group by sno


//並查詢
select distinct sno from salebill
where sno in (
select sno from salebill where goodsno='gn001'
union
select sno from salebill where goodsno='gn002'
)

//差查詢
select distinct sno from salebill
where sno in (
select sno from salebill where goodsno='gn001'
except
select sno from salebill where goodsno='gn002'
)

13 數據類型

數據類型 含義
CHAR(n) ,CHARACTER(n) 長度為n的定長字符串
VARCHAR(n),CHARACTERVARYING(n) 最大長度為n的變長字符串
INT,INTEGER 長整數(4字節)
SMALLINT 短整數(2字節)
BIGINT 大整數(8字節)
NUMERIC(p,d) 定點數,由p位數字(不包括符號、小數點)組成,小數后面有d位數字
DECIMAL(p, d), DEC(p,d) 同NUMERIC
DATE 日期,包含年、月、日,格式為YYYY-MM-DD
TIME 時間,包含一日的時、分、秒,格式為HH:MM:SS

14 聚合函數

聚合函數名及參數 功能
COUNT(*|<列名>) 統計元組個數
COUNT([DISTINCT|ALL]<列名>) 統計一列中值的個數
SUM([DISTINCT|ALL]<列名>) 計算一列值的總和(此列必須為數值型)
AVG([DISTINCT|ALL]<列名>) 計算一列值的平均值(此列必須為數值型)
MAX([DISTINCT|ALL]<列名>) 求一列中的最大值
MIN([DISTINCT|ALL]<列名>) 求一列中的最小值

15 邏輯運算符

邏輯運算符 描述
and &&
or
not !
xor 異或
& 位與
| 位或
^ 位異或
<< 位左移
>> 位右移

16 常用函數

函數 描述
CONCAT() 字符串拼接
LOWER/UPPER() 大小寫改變
REPLACE() 字符串替換
SUBSTRING(): 截取子字符串
CEIL() 向上取整
FLOOR() 向下取整
rand() 生成隨機數
select CONCAT('我是',name,depart)
from Employee1;

select LOWER('ASERDFTY');
select UPPER('qwertyyu');

select SUBSTRING('這是一個字符串',3,5);

select CEIL(3.3);

select FLOOR(3.3);

select rand();

17 列操作

增加列:
alter table tableName add columnName varchar(30);

修改列類型:
alter table tableName alter column columnName varchar(4000)  

修改列的名稱:
EXEC  sp_rename   'tableName.column1' , 'column2'  (把表名為tableName的column1列名修改為column2)

刪除列: 
alter table tableName drop column columnName

創建唯一值索引
ALTER TABLE `supplier` ADD UNIQUE (`supplierno`);//默認升序

添加降序唯一值索引
CREATE UNIQUE INDEX categoryname ON category (categoryname DESC);

刪除列唯一值約束
ALTER TABLE student DROP CONSTRAINT weixin


mysql
查看表的字段信息:desc 表名;
查看表的所有信息:show create table 表名;
添加主鍵約束:alter table 表名 add constraint 主鍵 (形如:PK_表名) primary key 表名(主鍵字段);
添加外鍵約束:alter table 從表 add constraint 外鍵(形如:FK_從表_主表) foreign key 從表(外鍵字段) references 主表(主鍵字段);
刪除主鍵約束:alter table 表名 drop primary key;
刪除外鍵約束:alter table 表名 drop foreign key 外鍵(區分大小寫);
修改表名:alter table t_book rename to bbb;
添加列:alter table 表名 add column 列名 varchar(30);
刪除列:alter table 表名 drop column 列名;
修改列名MySQL: alter table bbb change nnnnn hh int;
修改列名SQLServer:exec sp_rename't_student.name','nn','column';
修改列名Oracle:alter table bbb rename column nnnnn to hh int;
修改列屬性:alter table t_book modify name varchar(22);

視圖

1 創建視圖

create view v1 as
select * from A;

2 修改視圖

alter view 視圖名 as 新的查詢語句
create or replace view 視圖名 as 新的查詢語句  //創建新的或者替換新的 

3 刪除

drop view v1

4 修改

alter view v1 as select *  from A where A.id > 23;

5 查詢視圖

select * from v1;

6 數據操作

視圖數據操作:直接對視圖進行寫操作(增刪改)然后實現基表數據的變化

視圖所有的數據操作都是最終對基表的數據操作
視圖操作條件

​ 多基表視圖:不允許操作(增刪改都不行)。

​ 單基表視圖:允許增刪改

​ 新增條件:視圖的字段必須包含基表中所有不允許為空的字段

with check option:操作檢查規則
默認不需要這個規則(創建視圖時指定)︰視圖操作只要滿足前面上述條件即可
增加此規則:視圖的數據操作后,必須要保證該視圖還能把通過視圖操作的數據查出來(否則失敗)

7 視圖作用

1、簡化數據查詢

2、使用戶多角度看待同一數據

3、提供一定程度的邏輯獨立性

4、提供數據庫安全性

游標

1 自定義

自定義數據類型

//創建自定義類型create type type_name from system_type [null | not null]

2 定義游標

declare coursor_name [insensitive] [scroll] cursor
for select_statement//(mysql只能在存儲過程中使用)
DELIMITER//
CREATE PROCEDURE gsy()
as
BEGIN
DECLARE gs CURSOR
FOR
SELECT saleprice FROM goods
WHERE goods.categoryno=(SELECT categoryno FROM category WHERE categoryname='咖啡');
END//


declare @gname varchar(20),@gsalep float//定義數據變量
declare gs scroll cursor//定義游標   scroll可以自由移動游標insensitive表明會對選取的數據存放在臨時表里,游標數據不隨基本表改變而變
for select goodsname,saleprice//游標選取數據
from goods join categoryon category.categoryno=goods.categorynowhere category.categoryname='咖啡'
for update//可以更新數據   read only不允許更新數據
open gs//打開游標
fetch next from gs into @gname,@gsalep//通過游標取值while @@fetch_status=0//遍歷條件
begin
update goods set saleprice=saleprice-saleprice*0.1
where current of gs
fetch next from gs//游標移動
end
close gs//關閉游標
deallocate gs//釋放游標


游標遍歷
while @@fetch_status=0

觸發器

create trigger inst//定義觸發器
on salebill//綁定對象
after insert//指明觸發類型和操作 觸發類型:(for和after)|instead of(替換) 操作類型:delete,update,insert
as  declare @numbe int//定義變量
declare @good varchar(10)
select @numbe=number from inserted//給變量賦值,可以用set語句
select @good=goodsno from inserted
if(select number from goods where goodsno=@good)<@numbe
begin
print '數量不足'
end  else
begin
update goods set number=number-@numbe where goodsno=@good
if(select number from goods where goodsno=@good)<10
begin
print '該商品數量小於10,低於安全庫存量,請及時進貨'
end
end
go
insert into salebill values('gn006','s04','2021-10-02 00:00:00.000',4)
drop trigger inst

存儲過程

go
create procedure search//創建存儲過程
@cate varchar(20) output//指定傳入參數類型,是否有輸出
as
if @cate in (select categoryname from category)//編寫語句
begin
select * from goods
join category
on goods.categoryno=category.categoryno
where category.categoryname=@cate
end
else
print '沒有此類商品' 

execute search '咖啡'//執行存儲過程
drop procedure search//刪除存儲過程

函數

create function find(@start date,@end date)
returns table//返回類型as//后跟sql語句
return	select goodsno,sum(number)as salenumber from salebill
where happentime between @start and @end
group by goodsno

select * from dbo.find('2020-01-01','2020-12-30')//dbo可以操作方法

關系數據理論

屬於(元素與集合之間),包含(集合與集合之間)

關系模式的形式化定義

R(U,D,DOM,F)R:關系名U:屬性名集合D:屬性組U中屬性所來自的域DOM:屬性向域的映像集合F:屬性間數據的依賴關系集合

關系模型常見問題

1、數據冗余

2、更新異常

  • 插入異常
  • 更新異常
  • 刪除異常

侯選碼

  • 候選碼可以唯一地識別關系的元組。
  • 包含在任何一個候選碼中的屬性,叫做主屬性。不包含在任何候選碼中的屬性稱為非主屬性或非碼屬性。
  • 最簡單的情況下,候選碼只包含一個屬性。
  • 最復雜的情況下,候選碼包含關系模式的所有屬性,稱為全碼。

外碼的定義

關系模式R中屬性或屬性組X並非R的碼,但X是另一個關系模式的碼,則稱X是R的外部碼,簡稱外碼。

范式

第一范式

如果一個關系模式R的所有屬性都是不可分的基本數據項(所有數據項不能再分),則R是第一范式,簡稱1NF

第一范式是對關系模式的最起碼的要求。滿足第一范式的關系稱為規范化關系。不滿足第一范式的數據庫模式不能稱為關系數據庫。

第二范式

若關系模式R屬於1NF,且每一個非主屬性都完全函數依賴於碼,則稱R為第二范式,簡稱2NF

第二范式不存在部分函數依賴,可存在傳遞依賴

第三范式

如果關系R為2NF,並且R中每一個非主屬性都不傳遞依賴於R的候選碼,則稱R為第三范式

第三范式不存在部分函數依賴,傳遞函數依賴

BC范式

關系模式是1NF,如果對於R的每個函數依賴X→Y,若Y不屬於X時X必含有候選碼,則稱R為BC范式,簡稱BCNF

BCNF的定義可以這樣理解:如果關系R為1NF,並且R中不存在任何屬性對碼的部分依賴或傳遞依賴,那么稱R為BCNF。

第四范式

BCFN消除非平凡且非函數依賴的多值依賴

數據庫管理

create login login1 with password ='stu1';//創建登錄用戶
create user stu1 for login login1;
create login login2 with password ='stu2';
create user stu2 for login login2;
create login login3 with password ='stu3';
create user stu3 for login login3;

grant select,insert on salebill to stu1;//賦予用戶權限
grant select,update,insert,delete on student to stu1;
grant select,update,insert,delete on goods to stu1;

revoke select on salebill to stu1//移除用戶權限
revoke update,insert on student to stu1
revoke delete on goods to stu1

drop login login1;//刪除用戶,登錄用戶
drop login login2;
drop login login3;
drop user stu1;
drop user stu2;
drop user stu3;


//查看登錄賬號
execute sp_helplogins['login']//login指登錄賬號名
select * from sys.syslogins

//查看數據庫用戶
execute sp_helpuser['user_name']
select * from sys.sysusers


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM