SQL Server零基礎學起你必會(三)九種簡單查詢【史上最全】

scottscott表介紹

  • deptdept部門表
    在這裏插入圖片描述
  • empemp員工表
    在這裏插入圖片描述
  • SALGRADESALGRADE工資薪級表
    在這裏插入圖片描述

查詢操作

查詢最重要的是順序

計算列

計算:=12年薪=表中數據的月薪*12
在這裏插入圖片描述

select *from emp
--*表示所有的
--from emp表示從emp表中查詢
select empno,ename from emp;
select ename,sal from emp;
select ename,sal*12 as "年薪",sal "月薪",job from emp;
--as可以省略,年薪要加雙引號
select 5 from emp
--輸出的表是emp表的行數,每行只有一個字段,值是5

OracleOracle中字段的別名不允許用單引號括起來,但是SqlServer2005SqlServer\,2005卻允許,因此爲了兼容性用雙引號

distinctdistinct[不允許重複的]

  • 普通selectselect表格多少條記錄搜索到多少個
    在這裏插入圖片描述
  • 如果不想重複
    在這裏插入圖片描述
select distinct deptno from emp;
select distinct comm from emp;
--distinct可以過濾掉重複的null
select distinct comm,deptno from emp;
--把comm和deptno的組合進行過濾
--select deptno distinct comm from emp;--邏輯上有衝突

betweenbetween[在某個範圍]

在這裏插入圖片描述

--查找工資在15003000之間的所有員工信息
select * from emp
where sal=5000
select * from emp
where sal>=1500 and sal<=3000
select * from emp
where sal between 1500 and 3000

inin[屬於若干個鼓勵的值]

在這裏插入圖片描述

select *from emp where sal in (1500,3000,5000)
select *from emp where sal not in (1500,3000,5000)
--等價於
select *from emp
where sal<>1500 and sal <>3000 and sal<>5000
--數據庫不等於有兩種表示:<> !=推薦使用第二種
--對或取反是並且 對並且取反是或

toptop[最前面的若干記錄]

在這裏插入圖片描述

select top 5*from emp
select top 15 percent *from emp--
--輸出的是三個不是兩個,輸出前百分之多少的數據,是小數的話向大取整

輸出工資在1500~3000的前四個人信息

在這裏插入圖片描述

--輸出工資在1500~3000的前四個人信息--ascending(默認)升序--descending降序
select top 4*
from emp
where sal between 1500 and 3000
order by sal desc--降序

nullnull[沒有值,空值]

在這裏插入圖片描述

select *from emp
--輸出獎金非空的員工信息
select *from emp where comm<>null--輸出爲空,error
select *from emp where comm!=null--輸出爲空,error
--總結:null不能參加<>!=運算
select *from emp where comm=null
  • 0null0和null是不一樣的,nullnull表示空值,沒有值,0表示一個確定的值
  • nullnull不能參加如下運算<>和!=和=
  • nullnull可以參加如下運算:is     notis\,is\,\,\,\,\,not \,is
  • 任何類型的數據都允許爲nullnull
    在這裏插入圖片描述
create table t1(name nvarchar(20),cnt int,riqi datetime);
insert into t1 values(null,null,null)
select *from t1

例題

輸出每個員工的姓名,年薪(包括獎金)    comm\,\,\,comm假設是一年的獎金
在這裏插入圖片描述

select empno,ename,sal*12+comm "年薪" from emp

本程序證明了:nullnull不能參與任何數據運算,否則結果永遠爲空

  • 改進:在這裏插入圖片描述
select empno,ename,sal*12+isnull(comm,0) "年薪" from emp
--isnull(common),如果comm是null返回0,否則返回comm的值

order  byorder\,\,by[以某個字段排序]

指令 作用
orderbya,border\, by\, a,b a,ba,b都是升序
orderbya,bdescorder\, by\, a,b\,desc aa升序,bb降序
orderbyadesc,border\,by\, a \,desc,b aa降序bb升序

文字描述:如果不指定排序的標準,則默認是升序,升序用ascasc表示,默認可以不寫,爲一個字段指定的排序標準並不會對另一個字段造成影響,強烈建議爲每一個字段都制定排序的標準

在這裏插入圖片描述

--asc升序排序,默認可以不寫--desc降序
select *from emp order by sal--默認按照升序排序
select *from emp order by deptno,sal
--先按照deptno升序排序,如果相同則按照sal升序排序
select *from emp order by deptno desc,sal
--order by a desc,b,c,d只對a產生影響

模糊查詢

格式 selectselect\,字段的集合 from\,from\, 表名 where\,where\, 某個字段的名字 like\,like\, 匹配的條件

匹配的條件通常具有通配符,通配符明細如下:

  • %:表示任意零個或多個字符 在這裏插入圖片描述
select *
from emp
where ename like '%A%'--ename只要含有字母A就輸出

select *
from emp
where ename like 'A%'--ename只要首字母是A就輸出

select *
from emp
where ename like '%A'--ename只要尾字母是A就輸出
  • _:表示任意單個字符
    在這裏插入圖片描述
select *from emp where ename like '_A%' --ename只要第二個字母是A就輸出
  • [af][a-f]’:aaff中的任意單個字符,只能是a,b,c,d,e,fa,b,c,d,e,f中的任意一個 在這裏插入圖片描述
select *from emp where ename like '_[A-F]%' 
--ename中第二個字母是ABCDEF中的任意一個記錄輸出
  • [a,f][a,f]’:aaff
  • ‘_[ac][\wedge a-c]’:把enameename中不是aa也不是bb也不是cc的任意單個字符記錄輸出在這裏插入圖片描述
select *from emp where ename like '_[^A-F]%' 
--ename中第二個字母是ABCDEF中的任意一個記錄輸出

注意

  • 匹配的條件必須用單引號括起來,不能省略,也不能改用雙引號
  • 通配符作爲不同字符使用的問題,如%已經作爲特殊字符,而要查%怎麼辦,解決方法如下:
    escapeescape\,'\setminus' 是將'\setminus'作爲轉義字符
    在這裏插入圖片描述
create table student
(
	name varchar(20) null
	,age int
);

insert into student values ('張三', 88);
insert into student values ('Tom', 66);
insert into student values ('a_b', 22);
insert into student values ('c%d', 44);
insert into student values ('abc_fe', 56);
insert into student values ('haobin', 25);
insert into student values ('HaoBin', 88);
insert into student values ('c%', 66)
insert into student values ('long''s', 100)
select * from student;

select * from student where name like '%\%%' escape '\'  --把name中包含有%的輸出 
select * from student where name like '%\_%' escape '\' --把name中包含有_的輸出

聚合函數

函數的分類

分類 作用
單行函數 每一行返回一個值
多行函數 多行返回一個值,聚合函數是多行函數

在這裏插入圖片描述

select LOWER(ename) from emp;--最終返回的是行lower
select max(sal) from emp;--返回max是多行函數

max(),min(),avg()max(),min(),avg()

countcount

分類 作用
count()count(*) 返回表中所有的記錄個數
count()count(字段名) 返回字段值非空的記錄個數,重複記錄的也爲有效記錄,空記錄無效記錄

在這裏插入圖片描述

select COUNT (*)from emp--返回emp所有記錄的個數
select COUNT (deptno)from emp--返回值是14,deptno中重複的記錄也被當爲有效的記錄
select COUNT (distinct deptno) from emp--返回值是3,統計deptno 中不重複的個數
select COUNT (comm) from emp--返回值是4,說明count不計空的記錄,爲空的記錄爲無效記錄

單行函數和多行函數不能混用

相關知識鏈接

利用SQL命令建表和約束

在這裏插入圖片描述

六大約束

約束:對一個表中屬性操作的限制

項目 Value
主鍵(PK)(PK)約束 不允許重複元素,避免數據冗餘
外鍵(FK)(FK)約束 從語法上保證了本事物所關聯的其他事物一定存在
checkcheck約束 保證事物的屬性在合法的範圍內
defaultdefault約束 保證事物的屬性一定會有一個值
uniqueunique唯一性約束 不允許重複,但允許爲空,SQLServerSQLServer不允許多列爲空
  • 事物和事物之間的關聯由外鍵體現
  • 外鍵不能來自另一個表的普通鍵,如果是普通鍵則可以一致,如果有重複的就無法判斷來自於哪一個。
  • 不要用業務邏輯當主鍵,比如用戶名,因爲用戶名可以改,加一些額外的操作,比如重新編個號。
  • 外鍵可以有多個,主鍵只可以有一個

實戰

下面建一個簡單的學生表,快跟着敲一遍:

指令合集

功能 操作 圖例
建表 create  table+create\,\, table+表名 在這裏插入圖片描述
主鍵 primary  keyprimary\,\,key 在這裏插入圖片描述
約束條件 check(...and...)check(... \,and\, ...) 在這裏插入圖片描述
not  nullnot \,\,null 非空 在這裏插入圖片描述
nvarchar(100)nvarchar(100) nn表示國際化支持漢字,varyvary變量,charchar表示字符,(100)(100)表示最大容量 在這裏插入圖片描述
default()default(默認值) 默認爲...... 在這裏插入圖片描述
insertinsert插入 insert  into+insert\,\, into+表名++(需添加的列) values+values+(添加的信息) 在這裏插入圖片描述

數據庫中單引號裏面是字符串,雙引號裏是數據的名字

實例流程

在這裏插入圖片描述
我們會遇到這樣的問題,老代碼運行完後新代碼加進去會報錯,顯示已存在
在這裏插入圖片描述

  • 如果是單獨的指令可以在這裏插入圖片描述
  • 如果是表內進行了新的修改,需添加:
IF OBJECT_ID('student') IS NOT NULL
DROP TABLE student

運行新表時帶着該代碼一起運行即可
在這裏插入圖片描述

  • not  nullnot\,\, null:默認nullnull,用戶不給該字段賦值,則字段默認值爲nullnull
create table dept2
(
dept2_id int primary key,
dept2_name nvarchar(100) not null,
dept2_address nvarchar(100)
)
create table emp2
(--不能寫成{
emp2_id int constraint pk_id_hahaha primary key,--定義主鍵同時定義了名字
emp2_name nvarchar(20) not null ,
--n表示國際化支持漢字,vary變量,char表示字符,(20)最大20個
emp2_sex nchar(1),
dept2_id int constraint fk_dept_id_heihei foreign key references dept2(dept2_id),--列名,類型,約束,約束的名字,外鍵約束,外鍵是哪個表的
)
IF OBJECT_ID('student') IS NOT NULL
DROP TABLE student
create table student
(
student_id int primary key,
student_sal int check (student_sal>1000 and student_sal<8000),
student_sex nvarchar(2) default('男'),
student_name nvarchar(200) unique 
)
insert into student(student_id,student_sal,student_name) values (1,2000,'王五');
insert into student values (2,4000,'女','張三')
insert into student values (3,6000,'男','李四');

和約束的關係
黃金三句:

  • 數據庫通過表來解決事物的存儲問題
  • 數據庫通過約束來解決事物取值的有效性和合法性問題
  • 建表的過程就是制定事物屬性及其事物屬性各種約束的過程

關係

  • 定義:表和表之間的聯繫
  • 實現方式:通過不同形式的外鍵來表示表和表的不同關係
  • 假設是表A和表B
分類 Value
一對一 可以把表A的主鍵充當B的外鍵,也可以把表B的主鍵充當表A的外鍵
一對多 把表A的主鍵添加到表B來充當外鍵,或者說在多的一方添加外鍵
多對多 必須通過單獨的一張表來表示

實戰

建立班級,學生,課程的具有多對多關係的表:
班級一張表,教師一張表,班級和教師的關係也是一張表。

指令合集

功能 操作 圖例
約束及約束的命名 constraint  +constraint\,\, +命名 在這裏插入圖片描述
外鍵及來源表格 foreign  key  referencesforeign\,\, key\,\, references 在這裏插入圖片描述

實例流程

6Ly9ibG9nLmNzZG4ubmV0L2xpdXlpbWluZzIwMTk=,size_16,color_FFFFFF,t_70)

--班級表
create table class
(
class_id int primary key,
class_num int not null,
class_name nvarchar(100)
)
--教師
create table teacher
(
teacher_id int primary key,
teacher_name nvarchar(200)
)
drop table class_teacher_mapping--沒寫完可以加這句話
--第三張表格,來模擬班級和教師的關係
create table class_teacher_mapping
(class_id int constraint fk_class_id foreign key references class(class_id),
teacher_id int foreign key references teacher(teacher_id),
course nvarchar(20),
constraint pk_class_id_teacher_id primary key (class_id,teacher_id,course)
)

查看數據關係的建立

在這裏插入圖片描述

關係圖

在這裏插入圖片描述

總結

  • 數據庫研究的是外存
  • 圖靈證明了用順序,選擇,循環可以解決一切問題,SQLServerSQLServer用的是純命令,沒有流程,把順序,選擇和循環給刪掉了,可以用可流程控制的TLSQL()TL\,SQL(無法跨平臺)解決或者用高級語言對數據進行處理,再寫入數據庫
  • 數據庫的所有操作都可以簡化成增刪改查的操作
  • (字段)表示一個特徵,一(記錄)表示這個事物,表示的是同一個事物的集合

主鍵

  • 主鍵:能唯一標識事物的一個字段,主鍵不允許修改,修改可能會出現重複。
  • 主鍵通常是整數,不建議用字符串(如果主鍵是用於集羣式服務,纔可以用字符串)
  • 主鍵通常 不允許修改,除非被本記錄刪除
  • 主鍵不要定義成idid,而要定義成表名IdId或者表名_id
  • 要用代理主鍵,不要用業務主鍵,通常都是單獨添加一個整型的編號充當主鍵字段

外鍵

  • 外鍵:如果一個表中若干字段來自另外若干表的主鍵或唯一鍵
  • 外鍵通常來 自另外表的主鍵 而不是唯一鍵,因爲唯一鍵可能爲nullnull
  • 外鍵不一定來自另外的表,也可能來自本表的主鍵,如下圖員工上司表,每個員工的上司也屬於員工
  • 含有外鍵的表叫外鍵表,外鍵字段來自的那一張表叫做主鍵表
    在這裏插入圖片描述

先刪主鍵表還是外鍵表

  • 先刪外鍵表,否則會報錯

相關知識鏈接

SQL Server零基礎學起你必會(一)圖形化界面建表
SQL Server零基礎學起你必會(二)表和約束概念詳解,用SQL命令建表和約束
SQL Server零基礎學起你必會(三)九種簡單查詢【史上最全】
數據庫入門(一)範式理解:1NF,2NF,3NF,BCNF,4NF詳析
數據庫 SQLServer 視頻教程全集(99P)| 22 小時從入門到精通
數據庫知識點
一個小時上手SQL
sql語句,你肯定會聽懂的
(重要順序從上到下)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章