目錄
數(shù)據(jù)定義語(yǔ)言DDL(Data Definition Language)
一.對(duì)數(shù)據(jù)庫(kù)的操作
二.對(duì)數(shù)據(jù)表的操作
數(shù)據(jù)操作語(yǔ)言DML(Data Manipulation Language)
一.添加 insert into
二.刪除? delete
三.修改? update
數(shù)據(jù)查詢(xún)語(yǔ)言DQL(Data Query Language)
一.查詢(xún) select
二.關(guān)鍵字
1.between ... and ...(在....之間)
2.in, exists
3.check
4.primary key(主鍵)
5.foreign key(外鍵)
6.null ,not null
7.distinct
8.having
?9.as
?10.alter命令
11.unique 唯一鍵(索引一種)
三.排序查詢(xún) order by
四.分組查詢(xún) group by
五.聚合函數(shù)?
六.模糊查詢(xún) like
? ? ? ? 七.分頁(yè)查詢(xún) limit
?創(chuàng)作不易,如果本篇博客對(duì)您有一定的幫助,大家記得留言+點(diǎn)贊哦。??
通過(guò)很長(zhǎng)一段時(shí)間的學(xué)習(xí),今天特此總結(jié)一下SQL語(yǔ)句,重點(diǎn)是對(duì)要用SQL語(yǔ)句實(shí)現(xiàn)的句子提供多種不同的語(yǔ)句,以及SQL語(yǔ)句中的一些語(yǔ)法規(guī)則,希望對(duì)你有幫助??!
數(shù)據(jù)定義語(yǔ)言DDL(Data Definition Language)
一.對(duì)數(shù)據(jù)庫(kù)的操作
--1.1創(chuàng)建數(shù)據(jù)庫(kù)
create database MyDatabase;
--1.2判斷數(shù)據(jù)庫(kù)是否已經(jīng)存在,若存在則不創(chuàng)建,不存在創(chuàng)建,語(yǔ)句更為嚴(yán)謹(jǐn)
create database if not exists MyDatabase ;
--2.查看所有創(chuàng)建的數(shù)據(jù)庫(kù)
show databases;
--3.查看指定數(shù)據(jù)庫(kù)的定義信息
show create database MyDatabase;
--4刪除數(shù)據(jù)庫(kù)
drop database MyDatabase;
二.對(duì)數(shù)據(jù)表的操作
由于在創(chuàng)建表時(shí),會(huì)用到數(shù)據(jù)類(lèi)型,恰當(dāng)?shù)氖褂脭?shù)據(jù)類(lèi)型,可以節(jié)省內(nèi)存,加快運(yùn)行速度。最大程度利用內(nèi)存空間。
而在SQL中,也定義了許多數(shù)據(jù)類(lèi)型。下面是我整理的經(jīng)常會(huì)用到的數(shù)據(jù)類(lèi)型,供大家參考。
? ? 數(shù)據(jù)類(lèi)型 | ? ?數(shù)據(jù)內(nèi)容 | ? ? ? ? ?范圍 | ? ? 占用字節(jié) | ? ? ? ? ? ? ? ? ? ? ? ?適用場(chǎng)景 |
? ? ? ? ?int | ? 精確數(shù)值型 | -2^31-- 2^31-1 | ? ? ? ? ? 4 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? 略 |
? ? ? tinyint | ? 精確數(shù)值型 |
? ? ?0-255 | ? ? ? ? ? 1 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? 略 |
? ? ???date |
? 日期時(shí)間型 | 1000/1/1~ 9999/12/31 |
? ? ? ? ? 3 | 適用于只顯示日期,不顯示時(shí)間的需求。如出生時(shí)期等顯然date更適合。 |
? ? datetime | ? 日期時(shí)間型 | 1753/1/1~9999/12/31 | ? ? ? ? ? 8 | 可以精確到秒,與下面的smalldatetime的范圍比較,顯然datetime更適合用 |
smalldatetime | ? 日期時(shí)間型 | 1900/1/1~2079/6/6 | ? ? ? ? ? 4 | ? ? ? ? ? ? ? ? ?可以精確到秒 |
? ? ? ?char |
? ? ?字符型 | 1-8000個(gè)字符 | 定長(zhǎng)。1個(gè)字符占1個(gè)字節(jié) |
如定長(zhǎng)的數(shù)字或英文如學(xué)號(hào),身份證號(hào) |
? ? ?varchar | ? ? ?字符型 | 1-8000個(gè)字符 | 不定長(zhǎng)。1個(gè)字節(jié)占1個(gè)字符 | 如不定長(zhǎng)的數(shù)字或英文數(shù)據(jù) |
? ? ? nchar | ?Unicode字符型 | 1-4000個(gè)字符 | 定長(zhǎng)。1個(gè)字符占2個(gè)字節(jié) | 如漢字長(zhǎng)短一樣的性別只有男和女 |
? ? nvarchar | ?Unicode字符型 | 1-4000個(gè)字符 | 不定長(zhǎng)。1個(gè)字符占2個(gè)字節(jié) | 如漢字長(zhǎng)短不一的姓名,專(zhuān)業(yè)等 |
--1.創(chuàng)建數(shù)據(jù)表
create table Student(
SNO char(10) not null primary key, --[primary key] 為設(shè)置主鍵
[Name] nvarchar(20) not null, -- [not null] 為屬性列的值不能為空
Sex int, --年齡
gender nchar(1) check(gender = '男' or gender = '女'),--[check] 起限制,約束作用,例如性
--or gender char(2) --別男和女,分?jǐn)?shù)0到100分
birthday date, --出生年月日
Major nvarchar(20), --專(zhuān)業(yè)
Dept nvarchar(20), --院系
Number char(10)) --電話(huà)
--2.查看表的結(jié)構(gòu)
desc 表名;
desc Student; --例子
--3.修改表名
alter table 表名 rename to 新的表名;
alter table Student rename to S; --例子
--4.添加一列
alter table 表名 add 列名 數(shù)據(jù)的類(lèi)型; --(注意,此處所添加的列屬性是默認(rèn)可以為空值的null)
alter table Student add address nvarchar(50); --例子 添加住址
--5.添加多列
alter table 表名 add 列名 數(shù)據(jù)的類(lèi)型,
列名 數(shù)據(jù)的類(lèi)型,
列名 數(shù)據(jù)的類(lèi)型;
--6.刪除一列
alter table 表名 drop 列名;
alter table Student drop Dpet; --例子
--7.刪除多列
alter table 表名 drop 列名,
列名,
列名,
列名;
----8.刪除表
drop table 表名;
drop table Student; --例子
--9.判斷表是否已經(jīng)存在,若存在才刪除,語(yǔ)句更為嚴(yán)謹(jǐn)
drop table if exists 表名;
drop table if exists Student; --例子
數(shù)據(jù)操作語(yǔ)言DML(Data Manipulation Language)
一.添加 insert into
--例子
insert into(SNO,Name,Sex,gender,birthday,Major,Dept,Number)
values('2020041235','張璇',20,'男','2000-1-20','自動(dòng)化','電信院','7777445222'),
('2020041236','田慧',21,'女','2001-32-10','計(jì)算機(jī)科學(xué)與技術(shù)','計(jì)科院','7777445223'),
('2020041237','田琪',20,'男','2002-5-10','通信工程','電信院','7777445224');
--1.規(guī)范書(shū)寫(xiě)
insert into 表名(列名1,列名2,...) values(值1,值2,,...);
--2.省略列名時(shí),默認(rèn)所有列都添加,下面兩個(gè)句子表達(dá)意思相同
insert into 表名 values(值1,值2,,...,值n);--省略列名
insert into 表名(列名1,列名2,...,列名n) values(值1,值2,,...,值n);--此為寫(xiě)全了所有列名
--3.插入部分?jǐn)?shù)據(jù)時(shí)
insert into 表名(列名2,列名3,,列明5) values(值2,值3,值5);
--4.插入多行數(shù)據(jù)時(shí) 兩種寫(xiě)法 注意標(biāo)點(diǎn)符號(hào) 明顯第二種較為簡(jiǎn)單
insert into 表名()values();
values();
values();
insert into 表名()values(),
(),
(),
();
二.刪除? delete
--1.規(guī)范書(shū)寫(xiě)
--delete 作用僅是刪除表中的數(shù)據(jù),對(duì)表體,列屬性名無(wú)任何影響
delete from 表名 where 列名 = 值;
delete from Student where SNO = '2020041599'; --刪除一行或多行數(shù)據(jù)
--2.刪除表中所有數(shù)據(jù) 這里表體仍存在,是空表,表仍能查詢(xún)到
delete from 表名 ; --如果不是想刪除所有數(shù)據(jù),切記加where,不然表中數(shù)據(jù)全刪除完了,小編就吃過(guò)虧,慎用
--3.先刪除表,再創(chuàng)建一張一樣的表
truncate table 表名;
三.修改? update
--規(guī)范書(shū)寫(xiě)
update 表名 set 列名 = 值 where 列名 = 值;
--代碼中第一個(gè)【列名 = 值】 為想要修改的所在列的值
--代碼中第二個(gè)【列名 = 值】 的列名為具有標(biāo)識(shí)的作用如主鍵,其值唯一。非主鍵也行,看具體修改的目的
--例子
update Student set Major = '軟件工程' where SNO = '2020041158';
--即更改學(xué)號(hào)為2020041158的學(xué)生的專(zhuān)業(yè)名稱(chēng)。
數(shù)據(jù)查詢(xún)語(yǔ)言DQL(Data Query Language)
一.查詢(xún) select
--查詢(xún)表中所有數(shù)據(jù) (行列無(wú)限制,全部輸出)
select * from 表名;
select * from Student; --例子
--查詢(xún)表中某幾列數(shù)據(jù)(行全部輸出)
select 列名1,列名3 from 表名;
select SNO,Name,Major from Student; --例子
--查詢(xún)特定列名的幾行數(shù)據(jù) (列全部輸出)
select * from 表名 where 列名 = 值;
select * from Student where SNO = '2020041599';
--即查詢(xún)學(xué)號(hào)為2020041599的學(xué)生的全部信息
--查詢(xún)特定列名的幾行數(shù)據(jù) (行列都有限制)
select 列名2,列名4 from 表名 where 列名 = 值;
二.關(guān)鍵字
1.between ... and ...(在....之間)
between 值 and 值:尋找在…之間的值。
not between 值and值:尋找不再…之間的值。這些值可以是數(shù)值、文本或者日期。
--查詢(xún)年齡大于等于18,小于等于20的學(xué)生(三種寫(xiě)法,結(jié)果一樣)
SELECT * FROM student WHERE Age>=20 AND Age<=30;
SELECT * FROM student WHERE Age<=20 && Age<=30;
SELECT * FROM student WHERE BETWEEN 20 AND 30;
--查詢(xún)年齡不在18到20的學(xué)生(三種寫(xiě)法)
SELECT * FROM student WHERE Age<20 AND Age>30;
SELECT * FROM student WHERE Age<20 && Age>30;
SELECT * FROM student WHERE NOT BETWEEN 20 AND 30;
2.in, exists
1.in在查詢(xún)的時(shí)候,首先查詢(xún)子查詢(xún)的表,然后將內(nèi)表和外表做一個(gè)笛卡爾積,
然后按照條件進(jìn)行篩選。in(集合)。2.exists在查詢(xún)的時(shí)候,首先會(huì)執(zhí)行外循環(huán),外循環(huán)返回的結(jié)果每一行都會(huì)拿著去內(nèi)層循環(huán)執(zhí)行(此時(shí)注意,內(nèi)層也是循環(huán)查詢(xún)的)。
-查詢(xún)選修了課程的學(xué)生全部信息 S(學(xué)生表) SC(學(xué)生選課表)
SELECT *
FROM S
WHERE SNO IN(SELECT SNO
FROM SC)
SELECT *
FROM S
WHERE EXISTS(SELECT SNO
FROM SC
WHERE S.SNO = SC.SNO)
--查詢(xún)沒(méi)有選修任何課程的學(xué)生全部信息 S(學(xué)生表) SC(學(xué)生選課表)
SELECT *
FROM S
WHERE SNO NOT IN(SELECT SNO
FROM SC
WHERE S.SNO = SC.SNO)
SELECT *
FROM S
WHERE NOT EXISTS(SELECT SNO
FROM SC
WHERE S.SNO = SC.SNO)
-- 查詢(xún)年齡40歲,35歲,44歲的信息
SELECT * FROM Student WHERE age = 40 OR age = 35 OR age = 44
SELECT * FROM Student WHERE age IN (40,35,44);
3.check
CHECK 約束:用于限制列中的值的范圍。
在一些情況下,我們需要字段在指定范圍的輸入,
例如:性別只能輸入 '男'或者'女',余額只能大于0,分?jǐn)?shù)在0到100分之間。
這時(shí)候就可以用 CHECK 約束 來(lái)規(guī)范數(shù)據(jù)。
接下來(lái)我們來(lái)看看它都可以在哪用。?
1.創(chuàng)建表的時(shí)候
2.表已經(jīng)存在的時(shí)候,還想修改時(shí)。
4.primary key(主鍵)
primary key(主鍵),
用于唯一標(biāo)識(shí)表中的每一條數(shù)據(jù)。
不能重復(fù), 不能為空。
一個(gè)表只能有一個(gè)主鍵。
接下來(lái)我們來(lái)看看它都可以在哪用。
1.創(chuàng)建表的時(shí)候
第一種
第二種
2.表已經(jīng)存在且無(wú)主鍵,想要添加主鍵時(shí)
3.表已經(jīng)存在且有主鍵,想要刪除主鍵時(shí)
上面代碼中的約束名在這里,右鍵點(diǎn)擊復(fù)制即可
5.foreign key(外鍵)
外鍵: 外面的鍵, 一張表的一個(gè)字段(非主鍵)指向另外一個(gè)表的主鍵, 那么該字段就稱(chēng)之為外鍵.
外鍵所在的表稱(chēng)之為子表(附表); 外鍵所指向的主鍵所在的表稱(chēng)之為父表(主表)。
1.創(chuàng)建表的時(shí)候
?
2.表已經(jīng)存在,想要添加外鍵時(shí)
注意:主從表的字段要具備??相同的數(shù)據(jù)類(lèi)型,字符長(zhǎng)度和約束??哦?。?!
3.表已經(jīng)存在,想要刪除外鍵時(shí)
刪除外鍵和前面的刪除主鍵是一樣的
6.null ,not null
? null 和 not null?可以稱(chēng)為數(shù)據(jù)類(lèi)型的屬性,可以修飾限制列屬性,null值也不等同于空值,空值是不占用存儲(chǔ)空間的,null占用存儲(chǔ)空間。
is null?和 is not null?是運(yùn)算符,(注意不能寫(xiě)成 =null 或 !=null)查詢(xún)某字段為空時(shí)用 is null,
不為空時(shí)用 is not? null。
接下來(lái)我們來(lái)看看它都可以在哪用。
1.創(chuàng)建表時(shí)修飾限制列屬性。
create table Student(
SNO char(10) not null primary key,
[Name] nvarchar(20) not null,
Sex int null,
gender nchar(1) check(gender = '男' or gender = '女'),
birthday date null,
Major nvarchar(20) null,
Dept nvarchar(20) null,
Number char(10) null)
2.查詢(xún)某字段為不為空時(shí)。
-- 查詢(xún)高數(shù)成績(jī)不為null
SELECT * FROM Student WHERE Math IS NOT NULL;
--查詢(xún)沒(méi)有選高數(shù)課的學(xué)生信息
SELECT * FROM Student WHERE Math IS NULL;
7.distinct
distinct 去重,distinct關(guān)鍵字的主要作用就是對(duì)數(shù)據(jù)庫(kù)表中一個(gè)或者多個(gè)字段重復(fù)的數(shù)據(jù)進(jìn)行過(guò)濾,只返回其中的一條數(shù)據(jù)給用戶(hù),distinct只可以在select中使用。
舉例說(shuō)明。當(dāng)查詢(xún)?nèi)M瑢W(xué)的姓名時(shí)。
--不加
select Name from Student;
--加distinct
select distinct Name from Student;
查詢(xún)結(jié)果。
8.having
having的作用是過(guò)濾數(shù)據(jù),where也是過(guò)濾數(shù)據(jù)。那么他們有什么區(qū)別呢?
1.having與?where的區(qū)別。
(1).執(zhí)行時(shí)機(jī)不同。where是分組之前進(jìn)行過(guò)濾,不滿(mǎn)足where條件,不參與分組;而having是分組之后對(duì)結(jié)果進(jìn)行過(guò)濾。
(2).判斷條件不同。where不能對(duì)聚合函數(shù)進(jìn)行判斷,而having可以。
即where并不參與分組后的過(guò)濾數(shù)據(jù)。而是在分組前執(zhí)行,且必須在分組前執(zhí)行。?
2.使用要求
? ? ? ? (1) 如果過(guò)濾條件中使用了聚合函數(shù),則必須使用having來(lái)替換where,否則會(huì)報(bào)錯(cuò)。
? ? ? ? (2) having必須使用在group by的后面。
? ? ? ? (3) having不能單獨(dú)使用,要和group by一起使用。
3.執(zhí)行順序
? ?where > 聚合函數(shù)? > having?
? ?分組之后,查詢(xún)的字段一般為聚合函數(shù)和分組字段,查詢(xún)其他字段無(wú)任何意義。
?9.as
作用:起別名。
select 字段 as 別名 from 表名
select SNO as 學(xué)號(hào) from Student
?10.alter命令
當(dāng)需要修改數(shù)據(jù)表名或者數(shù)據(jù)表字段時(shí),就需要用到ALTER命令。
--1. 刪除列
alter table 表名 drop 列名;
--2.增加列
alter table 表名 add 列名 + 列名數(shù)據(jù)類(lèi)型 + 約束;
--3.修改列的類(lèi)型信息
alter table 表名 change 列名 + 新列名(這里可以用和原來(lái)列同名即可) + 列名數(shù)據(jù)類(lèi)型 + 約束;
--4.重命名列
alter table 表名 change 列名 新列名 + 列名數(shù)據(jù)類(lèi)型 + 約束;
--5.重命名表
alter table 表名 rename 表新名;
--6.刪除表中主鍵
alter table 表名 drop primary key;
--7.添加主鍵
alter table sj_resource_charges ADD CONSTRAINT PK_SJ_RESOURCE_CHARGES PRIMARY KEY (resid,resfromid)
--8.添加索引
alter table sj_resource_charges add index INDEX_NAME (name);
--9.添加唯一限制條件索引
alter table sj_resource_charges add unique emp_name2(cardnumber);
--10.刪除索引
alter table tablename drop index emp_name;
11.unique 唯一鍵(索引一種)
唯一鍵:unique?key,是用來(lái)保證對(duì)應(yīng)的字段中的數(shù)據(jù)是唯一的。
雖然主鍵也可以用來(lái)保證字段數(shù)據(jù)唯一性,但是一張表只有一個(gè)主鍵。
1、 唯一鍵在一張表中可以有多個(gè)。
2、 唯一鍵允許字段數(shù)據(jù)為NULL,NULL可以有多個(gè)(NULL不參與比較)
創(chuàng)建唯一鍵的幾種方式
1、 直接在表字段之后增加唯一鍵標(biāo)識(shí)符:unique?
2、 在所有的字段之后使用unique key(字段列表);
3、 在創(chuàng)建完表之后也可以增加唯一鍵
alter table 表名 add unique key(字段列表);
這里不再做過(guò)多演示,可以去上機(jī)敲一下。
三.排序查詢(xún) order by
order by 用于排序,默認(rèn)是按照升序排序。
注意:? ? 如果有多個(gè)排序條件,則當(dāng)前邊的條件值一樣時(shí),才會(huì)判斷第二條件。
order by 列名 desc --[desc] 表示降序
order by 列名 asc --[asc] 表示升序
order by 列名1 asc 列名2 desc
--查找所有學(xué)生的全部信息,按年齡降序排列
select *
from S
order by Age desc
四.分組查詢(xún) group by
用法:用于分組,一般用于與聚合函數(shù)進(jìn)行分組聚合(求和、統(tǒng)計(jì)等)。
--按照年齡分組并計(jì)算每個(gè)年齡段的平均成績(jī)
SELECT Age, AVG(Score)
FROM students
GROUP BY Age;
--按照性別和年齡分組并計(jì)算每個(gè)年齡段不同性別的平均成績(jī)
SELECT Gender, Age, AVG(Score)
FROM students
GROUP BY Gender, Age;
--按照性別分組。分別查詢(xún)男、女同學(xué)的平均分,人數(shù) 要求:分?jǐn)?shù)低于70分的人,不參與分組
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex;
--按照性別分組。分別查詢(xún)男、女同學(xué)的平均分,人數(shù) 要求:分?jǐn)?shù)低于70分的人,不參與分組,分組之后。人數(shù)要大于2個(gè)人
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;
SELECT sex , AVG(math),COUNT(id) 人數(shù) FROM student WHERE math > 70 GROUP BY sex HAVING 人數(shù) > 2;
五.聚合函數(shù)?
將一列數(shù)據(jù)作為一個(gè)整體進(jìn)行計(jì)算,通常和分組查詢(xún)函數(shù)group by組合使用。
1.count() 計(jì)算列數(shù)
2.max() ?計(jì)算列最大值
3.min() ?計(jì)算列最小值
4.sum() ?對(duì)列進(jìn)行求和
5.avg() ?對(duì)列計(jì)算平均數(shù)
六.模糊查詢(xún) like
like模糊查詢(xún),使用 % 和下劃線(xiàn) _ 匹配,
%可表示多個(gè)字符;
下劃線(xiàn)_:一個(gè)下劃線(xiàn)表示一個(gè)字符。
示例:
--1、查詢(xún)名字中含有思的學(xué)生信息
select * from student where sname like ‘%思%’;
--2、查詢(xún)名字以劉開(kāi)頭的學(xué)生信息
select * from student where sname like ‘劉%’;
--3、查詢(xún)名字以瑋結(jié)尾的學(xué)生信息
select * from student where sname like ‘%瑋’;
--4、查詢(xún)名字中第二個(gè)字為雨的學(xué)生信息
select * from student where sname like ‘_雨%’;
--5、查詢(xún)名字中第三個(gè)字為思的學(xué)生信息
select * from student where sname like ‘__思%’;
七.分頁(yè)查詢(xún) limit
?1.?語(yǔ)法:SELECT * FROM 表名 LIMIT 起始索引,查詢(xún)記錄數(shù);
?2. 注意:起始索引從0開(kāi)始,起始索引=(查詢(xún)頁(yè)碼-1)*每頁(yè)顯示記錄數(shù)。? ? ? ? ? ? ? ?分頁(yè)查詢(xún)是數(shù)據(jù)庫(kù)的方言,不通風(fēng)的數(shù)據(jù)庫(kù)有不同的實(shí)現(xiàn),Mysql中是limit。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-519231.html
? ? ? ? ? ? ? ?如果查詢(xún)的是第一頁(yè)數(shù)據(jù),起始索引可以省略,直接簡(jiǎn)寫(xiě)為limit 10。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-519231.html
--規(guī)范書(shū)寫(xiě)
SELECT * FROM 表名 LIMIT 起始索引,查詢(xún)記錄數(shù);
-- 每頁(yè)顯示3條記錄
SELECT * FROM student LIMIT 0,3; -- 第1頁(yè)
SELECT * FROM student LIMIT 3,3; -- 第2頁(yè)
SELECT * FROM student LIMIT 6,3; -- 第3頁(yè)
?創(chuàng)作不易,如果本篇博客對(duì)您有一定的幫助,大家記得留言+點(diǎn)贊哦。??
到了這里,關(guān)于【Mysql】一篇帶你了解數(shù)據(jù)定義,操作和查詢(xún)語(yǔ)言的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!