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
