前言:
數(shù)據(jù)庫(kù)是自己的一項(xiàng)短板,花了兩天的時(shí)間補(bǔ)充了一下基礎(chǔ)知識(shí)。。。
SQL
DDL 數(shù)據(jù)庫(kù)定義語(yǔ)言 Data Definition Language || create alter drop
DCL 數(shù)據(jù)庫(kù)控制語(yǔ)言 Data Control Language || grant rollback commit.
DML 數(shù)據(jù)庫(kù)操縱語(yǔ)言 Data Manipulation Language || insert update delete select
DQL 數(shù)據(jù)庫(kù)查詢語(yǔ)言 Data Query Language || select
//------------------------------------------------------------------------------------------
連接數(shù)據(jù)庫(kù)服務(wù)的命令
mysql -u root -p
根據(jù)提示輸入密碼 ,即可建立連接.
//----------------------------------------------------------------------------------------
數(shù)據(jù)庫(kù)定義語(yǔ)言(庫(kù)的操作) DDL
1.創(chuàng)建一個(gè)庫(kù)
create database 庫(kù)名稱 [character set 碼表名稱 collate 字符校對(duì)集名稱]
2.顯示mysql中都有哪些庫(kù)了.
show databases;
3.刪除一個(gè)數(shù)據(jù)
drop database 數(shù)據(jù)庫(kù)名稱;
drop database day15;
4.修改數(shù)據(jù)庫(kù)碼表和字符校對(duì)(不常用)
alter database 數(shù)據(jù)庫(kù)名稱 character set 數(shù)據(jù)庫(kù)碼表 [collate 校對(duì)集名稱];
alter database day15 character set utf8 collate utf8_bin;
5.當(dāng)前要使用的庫(kù)(重要)
use 庫(kù)名
use day15;
6.查看當(dāng)前選擇的數(shù)據(jù)庫(kù)
select database();
7.顯示創(chuàng)建庫(kù)的語(yǔ)句.
show create database 數(shù)據(jù)庫(kù)名稱;
show create database day15;
//--------------------------------------------------------------------------------------------------------------------
創(chuàng)建庫(kù) create database 庫(kù)名 [character set 碼表 collate 字符校對(duì)集]
顯示所有庫(kù) show databases;
刪除庫(kù) drop database 庫(kù)名;
修改數(shù)據(jù)庫(kù)碼表 alter database 庫(kù)名 character set 碼表 collate 字符校對(duì)集
使用數(shù)據(jù)庫(kù) use 庫(kù)名
查看當(dāng)前使用的庫(kù) select database();
顯示創(chuàng)建庫(kù)語(yǔ)句 show create database 庫(kù)名
一.數(shù)字型
整型
TINYINT 1字節(jié) byte
SMALLINT 2字節(jié) short
MEDIUMINT 3字節(jié)
(常用)INT 4字節(jié) int
BIGINT 8字節(jié) long
浮點(diǎn)型
FLOAT 單精度4字節(jié) float
**DOUBLE 8字節(jié) double
*DECIMAL 沒有精度損失
============================================
DOUBLE 和 DECIMAL 區(qū)別?
DOUBLE類型在運(yùn)算時(shí)會(huì)有精度的缺失。
DECIMAL 就是解決精度缺失問題的。(底層使用字符串來保存數(shù)字)
單純想表示小數(shù)屬性時(shí),使用double。
需要頻繁參與運(yùn)算的小數(shù),使用decimal。
二。字符串類型
注意: 字符串類型要使用單引號(hào)包裹.
短字符串類型
CHAR/VARCHAR (最大長(zhǎng)度255字節(jié))
====================================================
問題:char和varchar有什么區(qū)別?
char定長(zhǎng)字符串.varchar表示變長(zhǎng)字符串.
同時(shí)指定長(zhǎng)度為10。當(dāng)存儲(chǔ) abc
char =》 'abc '
varchar => 'abc'
結(jié)論: 開發(fā)中varchar用的最多。 char只在表示固定長(zhǎng)度的枚舉中使用。例如 :性別(用01,02表示)
====================================================
長(zhǎng)字符串類型(流類型)
*TEXT/CLOB 保存文本(字符流) --> 當(dāng)要保存的內(nèi)容超過255字節(jié)時(shí)使用. java中的writer 字符
BLOB 保存字節(jié)(字節(jié)流) --> 開發(fā)中用不到 java中的stream 字節(jié)
Character Large Object
binary Large Object
區(qū)別:
text:只能存儲(chǔ)字符數(shù)據(jù).
BLOB:可以存儲(chǔ)字符和多媒體信息(圖片 聲音 圖像)
三。日期和時(shí)間類型
date 只記錄日期 2015-01-14
time 只記錄時(shí)間 11:36:25
year 只記錄年 2015
datatime 又記錄日期 又記錄 時(shí)間 2015-01-14 11:36:25
**timestamp 同上 2015-01-14 11:36:25
問題: datatime 和 timestamp 區(qū)別?
這兩種類型記錄的數(shù)據(jù)是一模一樣.
區(qū)別在于插入的時(shí)候,如果插入datatime類型時(shí),沒有 傳值,那么該類型默認(rèn)值就是null;
如果插入timestamp類型時(shí),沒有 傳值,那么該類型默認(rèn)值就是當(dāng)前時(shí)間;
//--------------------------------------------------------------------------;------------------
與創(chuàng)建表相關(guān)的語(yǔ)句(DDL)
CREATE TABLE table_name
(
field1 datatype 約束/主鍵約束 auto_increment,
field2 datatype 約束,
field3 datatype 約束
)[character set 字符集 collate 校對(duì)規(guī)則]
1.創(chuàng)建表
create table t_user(
id int,
name varchar(20),
sal double(4,3),
birthday datetime,
hiredate timestamp
);
varchar最好指定長(zhǎng)度
整型一般不指定.
2.查看當(dāng)前庫(kù)中有哪些表
show tables;
3.查看表的結(jié)構(gòu)
desc 表名; description
desc t_user;
4.刪除表
drop table 表名;
drop table t_user;
5.添加一列
alter table 表名 add 列名 類型;
alter table t_user add photo blob;
6.修改列的類型
alter table 表名 modify 列名 類型;
alter table t_user modify photo varchar(20);
7.修改列的名稱
alter table 表名 change 舊列名 新列名 數(shù)據(jù)類型;
將 photo這一列 改名為 image
alter table t_user change photo image varchar(20);
8.刪除某列
alter table 表名 drop 列名;
alter table t_user drop image;
9.修改表的名稱
rename table 舊表名 to 新名;
rename table t_user to user;
10(用的極少)修改表的字符集. (如果創(chuàng)建表時(shí)不指定,默認(rèn)使用數(shù)據(jù)庫(kù)的字符集)
alter table 表名 character set 字符集 collate 校對(duì)集;
alter table t_user character set utf8 collate utf8_bin;
//-----------------------------------------------------------------------------------------------
列的約束 (掌握)
保證數(shù)據(jù)的完整性的.
1.非空約束(not null) 指定非空約束的列, 在插入記錄時(shí) 必須包含值.
2.唯一約束(unique) 該列的內(nèi)容在表中. 值是唯一的.
3.主鍵約束(primary key) 當(dāng)想要把某一列的值,作為該列的唯一標(biāo)示符時(shí),可以指定主鍵約束(包含 非空約束和唯一約束). 一個(gè)表中只能指定一個(gè)主鍵約束列.
主鍵約束 , 可以理解為 非空+唯一.
注意: 并且一張表中只能有一個(gè)主鍵約束.
約束體現(xiàn)數(shù)據(jù)庫(kù)的完整性.
例如:創(chuàng)建帶有約束的表
create table t_user2(
id int primary key auto_increament, -- 員工編號(hào)
name varchar(10) not null, -- 員工姓名
loginname varchar(10) not null unique, -- 登陸名稱
password varchar(20) not null, -- 密碼
age int(3) not null, -- 年齡
birthday datetime not null, -- 生日
hiredate timestamp not null -- 入職日期
);
主鍵自動(dòng)增長(zhǎng) (掌握)
注意:
1.前提某個(gè)表的主鍵是數(shù)字. 我們可以將該主鍵設(shè)置為自增.
2.使用主鍵自增可能會(huì)造成主鍵的斷層。
3.mysql,sqlserver,sqllite這三個(gè)數(shù)據(jù)庫(kù)具有該功能.
4.主鍵自增只能給主鍵約束的列加。
自增就是 每次插入記錄時(shí)不需要指定值. 該字段自己維護(hù)自己的值.
維護(hù)方式就是每次加1;
語(yǔ)法:
create table t_user(
id int primary key auto_increment,
password varchar(30) not null,
age int not null,
birthday datetime not null,
hiredate timestamp not null,
number int unique
);
對(duì)表中數(shù)據(jù)的增刪改(DML)
為表添加記錄 (必須掌握)
insert into 表名[(列名1,列名2...)] values (值1,值2...);
1.插入一條數(shù)據(jù)
1>指定要插入那些列
insert into t_user(name,email) values('tom','tom@itcast.cn');
****注意: 數(shù)據(jù)類型為字符串類型的.需要使用單引號(hào)包裹.
2>不指定插入哪些列, 需要指定每一列的值
insert into t_user values(null,'jerry','jerry@itcast.cn');
insert into t_user(name,email) values('湯姆','tom2@itcast.cn');
修改一條記錄 (必須掌握)
update 表名 set 列名1 = 值 , 列名2 = 值 ....[where 條件1,條件2...]
create table t_user(
id int primary key auto_increment,
name varchar(20) not null,
email varchar(20) unique
)
1.修改表中id為3 的記錄, 將name修改為rose;
update t_user set name='rose' where id=3;
update t_user set name='rose';
刪除表記錄相關(guān)
DELETE FROM 表名 [WHERE 條件];
1. 刪除表中名稱為’rose’的記錄。
DELETE FROM employee WHERE NAME='rose';
2. 刪除表中所有記錄。
DELETE FROM employee ;
3.使用truncate刪除表中記錄。
TRUNCATE TABLE employee;
DELETE 刪除 和 TRUNCATE刪除(了解) 兩者有什么區(qū)別?
首先,這兩種都是刪除表中的記錄.
不同的是:
1. delete 是逐行標(biāo)記刪除. TRUNCATE 是將整張表包括表結(jié)構(gòu)都移除,然后將表重新創(chuàng)建.
2. delete DML語(yǔ)句。 TRUNCATE DDL語(yǔ)句。
3。delete 刪除的記錄可以被恢復(fù),TRUNCATE 不能回復(fù)。
4. delete 不釋放空間,TRUNCATE 釋放空間.
5. TRUNCATE 會(huì)提交事務(wù). (還沒學(xué))
以上就是 增加 修改 刪除 表記錄 相關(guān)語(yǔ)句 ,(DML)
DQL語(yǔ)句(DML) 查詢語(yǔ)句. (必須掌握)
語(yǔ)法:
SELECT selection_list /要查詢的列名稱/
FROM table_list /要查詢的表名稱/
WHERE condition /行條件/
GROUP BY grouping_columns /對(duì)結(jié)果分組/
HAVING condition /分組后的行條件/
ORDER BY sorting_columns /對(duì)結(jié)果排序/
LIMIT offset_start, row_count /結(jié)果限定/
CREATE TABLE emp( -- 員工表
empno INT, -- 員工編號(hào)
ename VARCHAR(50), -- 員工姓名
job VARCHAR(50), -- 工作
mgr INT, -- 員工上司的編號(hào)
hiredate DATE, -- 入職日期
sal DECIMAL(7,2), -- 工資
comm DECIMAL(7,2), -- 獎(jiǎng)金
deptno INT -- 部門編號(hào)
);
1.1 查詢所有行所有列
select * from stu;
*號(hào) 是通配符.通配所有列. 上面語(yǔ)句與下面是一模一樣的
select sid,sname,age,gender from stu;
誰(shuí)的效率更高?
下面的效率更高. *需要運(yùn)算.
1.2 查詢所有行指定列
select sname from stu;
2.1 條件查詢介紹
條件查詢就是在查詢時(shí)給出WHERE子句,在WHERE子句中可以使用如下運(yùn)算符及關(guān)鍵字:
? =、!=、<>、<、<=、>、>=;
? BETWEEN…AND;
? IN(SET)/NOT IN(SET)
? IS NULL/IS NOT NULL
//---條件連接符
? AND; &&
? OR; ||
? NOT; !
2.2 查詢性別為女,并且年齡小于50的記錄
select * from stu where gender='female' and age<50;
2.3 查詢學(xué)號(hào)為S_1001,或者姓名為liSi的記錄
select * from stu where sid='S_1001' or sname='liSi';
數(shù)據(jù)庫(kù)中,sql語(yǔ)句不區(qū)分大小寫 ,但是 數(shù)據(jù)區(qū)分大小寫.
2.4 查詢學(xué)號(hào)為S_1001,S_1002,S_1003的記錄
select * from stu where sid='S_1001' or sid='S_1002' or sid='S_1003';
select * from stu where sid in('S_1001','S_1002','S_1003');
2.5 查詢學(xué)號(hào)不是S_1001,S_1002,S_1003的記錄
select * from stu where not (sid='S_1001' or sid='S_1002' or sid='S_1003');
select * from stu where sid not in('S_1001','S_1002','S_1003');
2.6 查詢年齡為null的記錄
select * from stu where age=null;
null的特性: null不等于null 所以判斷時(shí)應(yīng)如下寫法:
select * from stu where age is null;
2.7 查詢年齡在20到40之間的學(xué)生記錄
select * from stu where age >= 20 and age <= 40;
select * from stu where age between 20 and 40;
2.8查詢性別非男的學(xué)生記錄
select * from stu where gender!= 'male';
select * from stu where not gender='male';
select * from stu where gender not in ('male');
2.9 查詢姓名不為null的學(xué)生記錄
select * from stu where sname is not null;
select * from stu where not sname is null;
where 字段 like '表達(dá)式';
% => 通配 通配任意個(gè)字符.
_ => 通配 通配單個(gè)字符.
說明: LIKE 條件后 根模糊查詢表達(dá)式, "_"==> 代表一個(gè)任意字符
3.1查詢姓名由5個(gè)字母構(gòu)成的學(xué)生記錄
select * from stu where sname like '_____';
3.2查詢姓名由5個(gè)字母構(gòu)成,并且第5個(gè)字母為“i”的學(xué)生記錄
select * from stu where sname like '____i';
3.3 查詢姓名以“z”開頭的學(xué)生記錄
說明: "%"該通配符匹配任意長(zhǎng)度的字符.
select * from stu where sname like 'z%';
3.4查詢姓名中第2個(gè)字母為“i”的學(xué)生記錄
select * from stu where sname like '_i%';
3.5 查詢姓名中包含“a”字母的學(xué)生記錄
select * from stu where sname like '%a%';
4.1 去除重復(fù)記錄
關(guān)鍵詞: distinct => 去除重復(fù)查詢結(jié)果記錄.
select gender from stu; ==> 出現(xiàn)大量重復(fù)的記錄
select distinct gender from stu; =>去除重復(fù)的記錄
4.2查看雇員的月薪與傭金之和
select sal*12+comm from emp;
null與任何數(shù)字計(jì)算結(jié)果都是null.上面的寫法是錯(cuò)誤的.
使用IFNULL(參數(shù)1,參數(shù)2) 函數(shù)解決. 判斷參數(shù)1的值是否為null,如果為null返回參數(shù)2的值.
select sal*12 + IFNULL(comm,0) from emp;
*這個(gè)函數(shù)在所有數(shù)據(jù)庫(kù)通用嗎?
不通用.
4.3 給列名添加別名
select sal*12 + IFNULL(comm,0) as '年收入' from emp;
** select sal*12 + IFNULL(comm,0) '年收入' from emp;
select sal*12 + IFNULL(comm,0) 年收入 from emp;
5.1 查詢所有學(xué)生記錄,按年齡升序排序
asc: 升序
desc:降序
select * from stu order by age asc;
默認(rèn)就是升序
select * from stu order by age;
5.2 查詢所有學(xué)生記錄,按年齡降序排序
select * from stu order by age desc;
5.3 查詢所有雇員,按月薪降序排序,如果月薪相同時(shí),按編號(hào)升序排序
select * from emp order by sal desc , empno asc;
聚合函數(shù)
聚合函數(shù)是用來做縱向運(yùn)算的函數(shù):
? COUNT():統(tǒng)計(jì)指定列不為NULL的記錄行數(shù);
? MAX():計(jì)算指定列的最大值,如果指定列是字符串類型,那么使用字符串排序運(yùn)算;
? MIN():計(jì)算指定列的最小值,如果指定列是字符串類型,那么使用字符串排序運(yùn)算;
? SUM():計(jì)算指定列的數(shù)值和,如果指定列類型不是數(shù)值類型,那么計(jì)算結(jié)果為0;
? AVG():計(jì)算指定列的平均值,如果指定列類型不是數(shù)值類型,那么計(jì)算結(jié)果為0;
6.1 COUNT
當(dāng)需要縱向統(tǒng)計(jì)時(shí)可以使用COUNT()
1>查詢emp表中記錄數(shù):
select count(*) from emp;
2>查詢emp表中有傭金的人數(shù):
select count(*) from emp where comm is not null and comm >0;
3>查詢emp表中月薪大于2500的人數(shù):
select count(*) from emp where sal > 2500;
4>統(tǒng)計(jì)月薪與傭金之和大于2500元的人數(shù):
select count(*) from emp where sal+IFNULL(comm,0) > 2500;
5>查詢有傭金的人數(shù)并且有領(lǐng)導(dǎo)的人數(shù):
select count(*) from emp where comm > 0 and mgr is not null;
6.2 SUM(計(jì)算總和)和AVG(計(jì)算平均值)
當(dāng)需要縱向求和時(shí)使用sum()函數(shù)。
1>查詢所有雇員月薪和:
select sum(sal) from emp;
2>查詢所有雇員月薪和,以及所有雇員傭金和:
select sum(sal),sum(comm) from emp;
3>查詢所有雇員月薪+傭金和:
select sum(sal+IFNULL(comm,0)) from emp;
4>統(tǒng)計(jì)所有員工平均工資:
select avg(sal) from emp;
6.3 MAX和MIN
查詢最高工資和最低工資:
select max(sal),min(sal) from emp;
分組查詢
當(dāng)需要分組查詢時(shí)需要使用GROUP BY子句,例如查詢每個(gè)部門的工資和,這說明要使用部分來分組。
? 1>查詢每個(gè)部門的部門編號(hào)和每個(gè)部門的工資和:
select deptno,sum(sal) from emp group by deptno;
2>查詢每個(gè)部門的部門編號(hào)以及每個(gè)部門的人數(shù):
select deptno,count(ename) from emp group by deptno;
3>查詢每個(gè)部門的部門編號(hào)以及每個(gè)部門工資大于1500的人數(shù):
select deptno,count(ename) from emp where sal>1500 group by deptno ;
HAVING子句
4>查詢工資總和大于9000的部門編號(hào)以及工資和:
select deptno,sum(sal) from emp group by deptno having sum(sal)>9000;
使用having在分組之后加條件.
where和having都可以加條件?
1.where在分組之前加條件.
2.having在分組之后加條件.
where的效率要遠(yuǎn)遠(yuǎn)高于having. 分組本身消耗資源非常大.
LIMIT(MySQL方言) (必須掌握)
LIMIT用來限定查詢結(jié)果的起始行,以及總行數(shù)。
1>查詢5行記錄,起始行從0開始
select * from emp limit 0,5;
2> 查詢10行記錄,起始行從3開始
select * from emp limit 3,10;
3>如果一頁(yè)記錄為5條,希望查看第3頁(yè)記錄應(yīng)該怎么查呢?
? 第一頁(yè)記錄起始行為0,一共查詢5行;
select * from emp limit 0,5;
? 第二頁(yè)記錄起始行為5,一共查詢5行;
select * from emp limit 5,5;
? 第三頁(yè)記錄起始行為10,一共查詢5行;
select * from emp limit 10,5;