Sql知識點

#Sql操作

數據庫操作(增,刪,查)

show databases;                          //查看所有數據庫
create database 數據庫名稱;               //增加數據庫
drop database 數據庫名稱;                 //刪除數據庫
use 數據庫名稱                            //無分號, 選擇要操作的數據庫

數據庫表操作(增、刪、查)

在要操作某個數據庫中的表時,一定要先使用數據庫

use 數據庫名稱  //無分號

表操作

show tables;                                              //查看所有的表
select * from 表名;                                        //查看錶中的數據
create table 表名(字段名稱 字段類型);                       //添加一張數據庫中的表
create table 表名(字段名稱 字段類型,字段名稱 字段類型,...);  //添加一張數據庫中的表

舉例:

create table student(
       id int,
       name varchar(4),//varchar類型不能爲空
       sex varchar(2),
       age int,
       schooldate date,//date是時間類型
)

刪除一張表

drop table 表名;

數據庫表結構操作(增、刪、改、查)

查看錶結構

desc 表名;

對錶的結構進行修改

alter table 表名 add 字段名 字段類型;                   //增加字段
alter table 表名 add (字段名 字段類型,字段名 字段類型); //增加多個字段
alter table 表名 drop 字段名;                         //刪除字段
alter table 表名 modify 字段名 要修改之後的字段類型      //修改字段類型

舉例:

create table book(
    id int,
    name varchar(10),
    pressdate date,
    price double(5,2)//5位數,小數點後佔兩位,整數佔三位
)

數據庫表的數據操作(增、刪、改)

insert into 表名(字段名稱,字段名稱) values(對應的字段值,對應的字段值);//增加表中數據
insert into 表名 values(表中所有對應字段名稱的字段值);
delete from 表名;                                                 //清空表中數據
detete from 表名 where 判斷條件;                                   //刪除符合條件的數據
update 表名 set 字段名=新的字段值;                                  //修改表中對應字段名的所有的值
update 表名 set 字段名=新的字段值 where 判斷條件;                    //修改表中滿足判斷條件的對應字段名的值
update 表名 set 字段名=新的字段值,字段名=新的字段值 where 判斷條件;

Sql約束

約束在創建表時建立
唯一約束
unique

create table stu(number int unique ,name varchar(10));//number不可重複

可以創建兩個標號爲空的數據,因爲任何一個null都不等於另一個null

insert into stu(number, name) values(null,'tom');
insert into stu(number, name) values(null,'jim'); 

非空約束
not null

reate table stu(number int not null ,name varchar(10));//number不可爲空

同一個字段加多個約束
不需要逗號

create table stu(num int unique not null,name varchar(10));

主鍵約束
非空約束和唯一約束的組合稱爲主鍵約束
primary key

create table stu(num int primary key,name varchar);

一般數字類型主鍵配合主鍵自動增長策略
插入數據時只需要插入除主鍵之外的數據就行
auto_increment

create table stu(num int primary key auto_increment,name varchar(10));

外鍵約束
外鍵必須是另一張表中的主鍵
**foreign key(要設爲外鍵的字段名) refernces 另一張表名(另一張表中設爲主鍵的值)
**

create table class(num int primary key auto_increment,name varchar(10));
create table student(num int primary key auto_increment,name varchar(10),classnum int,foreign key(classnum) references class(num));

sql查詢

Sql基本查詢操作

查詢語句的格式

select [字段列表,表達式,函數] from 表名

改掉查詢之後的表名

select [字段列表,表達式,函數] '要改的名字' from 表名
select ename '姓名',sal '工資' from emp;

select 字段列表[字段1,字段2,字段n] from 表名

select ename,sal from emp;

select 表達式[算數表達式] from 表名

select ename,sal*12 from emp;

數據庫去重,distinct關鍵字

select distinct dept from emp;

Sql條件查詢

單條件查詢

where sal = 1600;
where sal = '1978/03/15';
where sal [>,<,<>] 1600;//工資大於,小於,不等於1600

多條件查詢
1.並且 and

select * from emp where sal > 1600 and ename = 'zzz';

2.或者 or

select * from emp where sal = 1600 or sal = 800 or sal = 950;//查找工資等於1600,800,950的記錄
select * from emp where sal in(1600,800,950);//等同上條
select * from emp where sal not in(1600,800,950)//查找工資不等於1600,800,950,的記錄

3.在哪個範圍內between and

select * from emp between 1600 and 3000;//查找工資水平在1600到3000之間的記錄 

4.空永遠不等於空
null和null做判斷,永遠爲false

//查找沒有福利的記錄
select * from emp where comm = null;//這是錯誤的寫法
select * from emp where comm is null;//這是正確的寫法
//查找有福利的記錄
select * from emp where comm is not null;

sql函數

1.數學函數

pi()           //返回pi的值(圓周率)
floor(x)       //去掉小數部分取整,sal爲23.56
   select floor(sal) from emp where ename = 'Tom';//查詢值爲23
ceiling(x)     //進一取整
   select ceiling(sal) from emp where ename = 'Tom';//查詢值爲24
round(x,y)    //以小數點後y位四捨五入,y爲負,則倒數y位變爲0,倒數y+1位四捨五入
truncate(x,y)  //保留小數點後y位,捨去y位往後的數值,y爲負,則倒數y位變爲0

2.聚合函數(分組函數)

avg(col)       //返回指定列的平均值
count(col)     //返回指定列中非null 值/列的個數(函數參數爲*時不忽略)
min(col)       //返回列中的最小值
max(col)       //返回列中的最大值
sum(col)       //返回列中的所有值之和

2.字符串函數

concat(s1,s2..sn)   //將s1,s2..sn連接成字符串
     select concat(ename,'的工資是:',sal) from emp;
ltrim(str)          //去掉字符串開頭空格
rtrim(str)           //去掉字符串末尾空格
trim(str)           //去掉字符串首尾空格
length(str)         //查詢字符串的長度
substring(x,y)      //截取字符串,從x開始的y個字符

3.日期和時間函數
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-tPqERUkP-1577413226857)(https://i.imgur.com/UmFHMVp.png)]
4.條件判斷函數
5.系統信息函數
6.加密函數
7.格式化函數

sql分組函數

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-cS0WJE5Y-1577413226859)(https://i.imgur.com/XFsjoBc.png)]
別名
可以給字段,表達式,函數,表起別名

//查看每個班級成績的平均值1.給每個成績分組2.計算每個組的平均值
select avg(achievement) '成績',classnum from student group by classnum;

不在分組函數中的字段 必須在group by的後面
當要在已命名分組函數中寫判斷條件時,不用where 用 having。

//查看平均值大於80的 班級成績的平均值1.給每個成績分組2.計算每個組的平均值3.計算平均值大於80的
select avg(achievement) '成績',classnum from student group by classnum having 成績 > 80;

sql子查詢

就是一個查詢的結果可以作爲另一個查詢的數據源或者條件

1.將查詢結果作爲另一個查詢的條件
查看成績最高的人的名字
將成績最高作爲篩選條件(一層組函數)

select name,achievement from student where achievement = (select max(achievement) from student);

2.將查詢結果作爲另一個查詢的數據源
查詢結果做表時,必須起別名
emp表
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-sUbWwry1-1577413226860)(https://i.imgur.com/PvVq8kH.png)]
查詢平均工資最大的部門是哪個(兩層組函數)
組函數不能嵌套

select max(avg(sal)) deptno from emp group by deptno;//這是錯誤的

(1).查詢每個部門的平均工資,(2).查看最大平均工資的部門

//查詢最大的平均工資
select max(平均工資) from (select avg(sal) '平均工資',deptno from emp group by deptno) avg_table;
//查詢最大的平均工資的部門
select 平均工資 from (select avg(sal) '平均工資',deptno from emp group by deptno) avg_table 
where 平均工資 = (select max(平均工資) from (select avg(sal) '平均工資',deptno from emp group by deptno) avg_table);

sql多表查詢

連接 代碼
左連接 left join
右連接 right join
內連接 inner join
全連接 full join

a表

id name
1 張3
2 李四
3 王武

b表

id name parent_id
1 23 1
2 34 2
3 34 4

左連接

select a.*,b.* from a left join b on a.id=b.parent_id
結果
張3   1     23    1
李四  2     34    2
王武  null  null  null

右連接

select a.*,b.* from a right join b on a.id=b.parent_id
結果
張3   1  23  1
李四  2  34  2
null  3  34  4

內連接

select a.*,b.* from a inner join b on a.id=b.parent_id
結果
張3  1  23  1
李四 2  34  2

全連接

select a.*,b.* from a full join b on a.id=b.parent_id
結果
張3     1     23    1
李四    2     34    2
null    3     34    4
王武    null  null  null

dept表
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-5amdeQef-1577413226861)(https://i.imgur.com/B4IpBlP.png)]
1.查詢員工的姓名和員工所在部門的名稱

select ename,dname from emp,dept where emp.deptno = dept.deptno;
selece ename,dname from emp join dept on emp.deptno = dept.deptno;

salgrade表
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-IcKrRs0y-1577413226863)(https://i.imgur.com/OQ2fK9u.png)]
2.查詢員工的姓名和員工所在部門的名稱及工資等級

select ename,dname,grade from emp join dept join salgrade on
emp.deptno = dept.deptno and emp.sal beween losal and hisal;

3.查詢員工的姓名和員工經理人的姓名
做單表的多表查詢

select e.ename,m.ename from emp e join emp m on e.empto = m.mar;

左外聯合:
join前加left:左邊表中如果存在記錄沒有匹配到還想顯示出來
右外聯合:
join前加right:右邊表中如果存在記錄沒有匹配到還想顯示出來

作業:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-a3sZKnhl-1577413226864)(https://i.imgur.com/zGn0GFx.png)]

Sqlserve操作

sql讀取系統日期和時間的方法如下:
–獲取當前日期(如:yyyymmdd)

select CONVERT (nvarchar(12),GETDATE(),112)

–獲取當前日期(如:yyyymmdd hh:MM:ss)
select GETDATE()

–獲取當前日期(如:yyyy-mm-dd)
Select Datename(year,GetDate())+’-’+Datename(month,GetDate())+’-’+Datename(day,GetDate())

–獲取當前日期(如:yyyy/mm/dd)
select DATENAME(YEAR,GETDATE())+’/’+DATENAME(MONTH,GETDATE())+’/’+DATENAME(DAY,GETDATE())

–獲取幾種日期
select DATENAME(YEAR,GETDATE()) --年份(YYYY)
select DATENAME(YY,GETDATE())

select DATENAME(MM,GETDATE()) --月份
select DATENAME(DD,GETDATE()) --日期
select dateName(hh,getdate()) --獲取小時
select DATENAME(MI,GETDATE()) --獲取分鐘
select DATENAME(SECOND,GETDATE()) --獲取秒
select DATENAME(WEEK,GETDATE()) --獲取當前星期(周)是這一年中的第幾個星期(周)
select DATENAME(WEEKDAY,GETDATE()) --星期幾

*select convert(char(8),getdate(),108) as yourtime–獲取當前時間
SELECT convert(char(10),getdate(),120) as yourdate–獲取當前日期
SELECT left(convert(char(10),getdate(),120),4) as youryear–獲取當前年份

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