#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–獲取當前年份