創(chuàng)建新的用戶
用戶的信息都保存在數(shù)據(jù)庫(kù)的庫(kù)名為mysql的user表中.而root和123456是默認(rèn)創(chuàng)建的用戶.
如果我們要?jiǎng)?chuàng)建新的用戶,也會(huì)保存到當(dāng)前的user表中.
數(shù)據(jù)庫(kù)常見(jiàn)操作
數(shù)據(jù)庫(kù)中常見(jiàn)的數(shù)據(jù)類(lèi)型
bit[(M)]
二進(jìn)制位(101001),m表示二進(jìn)制位的長(zhǎng)度(1-64),默認(rèn)m=1
tinyint[(m)] [unsigned] [zerofill]
小整數(shù),數(shù)據(jù)類(lèi)型用于保存一些范圍的整數(shù)數(shù)值范圍:
有符號(hào):
-128 ~ 127.
無(wú)符號(hào):
~ 255
特別的: MySQL中無(wú)布爾值,使用tinyint(1)構(gòu)造。
int[(m)][unsigned][zerofill]
整數(shù),數(shù)據(jù)類(lèi)型用于保存一些范圍的整數(shù)數(shù)值范圍:
有符號(hào):
-2147483648 ~ 2147483647
無(wú)符號(hào):
~ 4294967295
特別的:整數(shù)類(lèi)型中的m僅用于顯示,對(duì)存儲(chǔ)范圍無(wú)限制。例如: int(5),當(dāng)插入數(shù)據(jù)2時(shí),select 時(shí)數(shù)據(jù)顯示為: 00002
bigint[(m)][unsigned][zerofill]
大整數(shù),數(shù)據(jù)類(lèi)型用于保存一些范圍的整數(shù)數(shù)值范圍:
有符號(hào):
-9223372036854775808 ~ 9223372036854775807
無(wú)符號(hào):
~ 18446744073709551615
decimal[(m[,d])] [unsigned] [zerofill]
準(zhǔn)確的小數(shù)值,m是數(shù)字總個(gè)數(shù)(負(fù)號(hào)不算),d是小數(shù)點(diǎn)后個(gè)數(shù)。 m最大值為65,d最大值為30。
特別的:對(duì)于精確數(shù)值計(jì)算時(shí)需要用此類(lèi)型
decaimal能夠存儲(chǔ)精確值的原因在于其內(nèi)部按照字符串存儲(chǔ)。
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
單精度浮點(diǎn)數(shù)(非準(zhǔn)確小數(shù)值),m是數(shù)字總個(gè)數(shù),d是小數(shù)點(diǎn)后個(gè)數(shù)。
無(wú)符號(hào):
-3.402823466E+38 to -1.175494351E-38,
1.175494351E-38 to 3.402823466E+38
有符號(hào):
1.175494351E-38 to 3.402823466E+38
**** 數(shù)值越大,越不準(zhǔn)確 ****
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
雙精度浮點(diǎn)數(shù)(非準(zhǔn)確小數(shù)值),m是數(shù)字總個(gè)數(shù),d是小數(shù)點(diǎn)后個(gè)數(shù)。
無(wú)符號(hào):
-1.7976931348623157E+308 to -2.2250738585072014E-308
2.2250738585072014E-308 to 1.7976931348623157E+308
有符號(hào):
2.2250738585072014E-308 to 1.7976931348623157E+308
**** 數(shù)值越大,越不準(zhǔn)確 ****
char (m)
char數(shù)據(jù)類(lèi)型用于表示固定長(zhǎng)度的字符串,可以包含最多達(dá)255個(gè)字符。其中m代表字符串的長(zhǎng)度。
PS: 即使數(shù)據(jù)小于m長(zhǎng)度,也會(huì)占用m長(zhǎng)度
varchar(m)
varchars數(shù)據(jù)類(lèi)型用于變長(zhǎng)的字符串,可以包含最多達(dá)255個(gè)字符。其中m代表該數(shù)據(jù)類(lèi)型所允許保存的
字符串的最大長(zhǎng)度,只要長(zhǎng)度小于該最大值的字符串都可以被保存在該數(shù)據(jù)類(lèi)型中。
注:雖然varchar使用起來(lái)較為靈活,但是從整個(gè)系統(tǒng)的性能角度來(lái)說(shuō),char數(shù)據(jù)類(lèi)型的處理速度更快,
有時(shí)甚至可以超出varchar處理速度的50%。因此,用戶在設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí)應(yīng)當(dāng)綜合考慮各方面的因素,
以求達(dá)到最佳的平衡
text
text數(shù)據(jù)類(lèi)型用于保存變長(zhǎng)的大字符串,可以組多到65535 (2**16 ? 1)個(gè)字符。
mediumtext
A TEXT column with a maximum length of 16,777,215 (2**24 ? 1) characters.
longtext
A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 ? 1) characters.
enum
枚舉類(lèi)型,
An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.)
示例:
CREATE TABLE shirts (
name VARCHAR(40),
size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
);
INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');
set
集合類(lèi)型
A SET column can have a maximum of 64 distinct members.
示例:
CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
DATE
YYYY-MM-DD(1000-01-01/9999-12-31)
TIME
HH:MM:SS('-838:59:59'/'838:59:59')
YEAR
YYYY(1901/2155)
DATETIME
YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y)
TIMESTAMP
YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某時(shí))
修改表的列(字段)
修改表(修改列,以及列的類(lèi)型和約束):
1. 添加列:
alter(不是alert) table 表名 add 列名 類(lèi)型;
alter(不是alert) table t1 add age int default 0;(默認(rèn)添加到最后一列)
alter(不是alert) table t1 add address char(12) first; (添加到第一列)
alter(不是alert) table t1 add phone after id; (在某個(gè)列的后面添加一列)
2. 刪除列
alter table 表名 drop 列名;
alter table t1 drop phone;
3. 修改列
alter table 表名 modify column 列名 類(lèi)型; # 只修改類(lèi)型,使用modify'
alter table 表名 change column 原來(lái)的列名 新列名 類(lèi)型; # 列名和類(lèi)型同時(shí)修改使用change
alter table t1 change column name my_name varchar(20);
4. 添加主鍵
alter table 表名 add primary key(列名)
alter table t1 add primary key(id);
5.刪除主鍵
alter table 表名 drop primary key(id);
alter table 表名 modify 列名 int ,drop primary key;
alter table t1 drop primary key ;
alter table t1 modify id int ,drop primary key;
6.添加外鍵
alter table 從表 add constraint 從鍵名稱 foreign_key 從表(外鍵字段) references 主表(主鍵字段);
刪除外鍵:
alter table 表名 drop foreign_key 外鍵名稱
7.修改默認(rèn)值:
alter table t1 alter age set default 1000;
刪除默認(rèn)值
alter table t1 alter age drop default;
表內(nèi)容操作
1. 插入數(shù)據(jù)(insert into 表名(字段,字段) values(值,值))
insert into tb1(nid,name) values(1,'fioman');
2. 查詢操作(select 字段,字段 表名(字段,字段) values(值,值))
select * from tb1;
3. 增
insert into 表名(列名,列名) values(值,值)
insert into 表名(列名,列名) values(值,值),(值,值)
insert into 表名(列名,列名) select (列名,列名) from 表
4. 刪
delete from 表
delete from 表 where id = 1 and name = 'alex'
5. 改
update 表 set name = 'jingjing' where id > 1;
6. 條件
select * from 表 where id > 1 and name != 'alex' and age = 18;
select * from 表 where id between 5 and 16;
select * from 表 where id not in (11,22,33)
select * from 表 where id in (select nid from 表2)
7.通配符
select * from 表 where name like 'ale%' ale開(kāi)頭的所有的字符串(%表示任意多個(gè)字符)
select * from 表 where name like 'ale_' ale開(kāi)頭的后面加一個(gè)字符(一個(gè)字符)
8.限制
select * from 表 limit 5; 前5行
select * from 表 limit 4,5; 從第四行開(kāi)始(不包括) 5行到9行的數(shù)據(jù)
select * from 表 limit 5 offset 4 - 從第四行開(kāi)始的5行
9.排序
select * from 表 order by 列 asc 升序
select * from 表 order by 列 desc 降序
select * from 表 order by 列1 desc,列2 asc
10.分組
select num from 表 group by num;
select num ,nid from 表 group by num,nid;
select num nid from 表 where nid > 10 group by num,nid order nid desc;
select num nid,count(*),sum(score),max(score),min(score) from 表 group by num,nid;
select num from 表 group by num having max(id) > 10
特別的group by 必須在where之后,order by 之前
11.連表
無(wú)對(duì)應(yīng)關(guān)系則不顯示
select A.num ,A.name B.name from A,B where A.nid=B.nid
無(wú)對(duì)應(yīng)關(guān)系則不顯示
select A.num,A.name,B.name from A inner join B on A.nid=B.nid
A表所有顯示,如果B中午對(duì)應(yīng)關(guān)系,則值為null
select A.num,A.name,B.name from A left join B on A.nid = B.nid
B表所有顯示,如果B中午對(duì)應(yīng)關(guān)系,則值為null
select A.num,A.name,B.name from A right join B on A.nid = B.nid
12.組合
組合,自動(dòng)處理重合
select nickname from A union select name from B
組合,不處理重合
select nickname from A union all select name from B
理解MySql的內(nèi)連接,左外連接,右外連接,全連接
首先創(chuàng)建兩張表a_table
和b_table
,關(guān)聯(lián)字段a_talbe.a_id和b_table.b_id
CREATE TABLE `a_table` (
`a_id` int(11) DEFAULT NULL,
`a_name` varchar(10) DEFAULT NULL,
`a_part` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `b_table` (
`b_id` int(11) DEFAULT NULL,
`b_name` varchar(10) DEFAULT NULL,
`b_part` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
表測(cè)試數(shù)據(jù)
內(nèi)連接
關(guān)鍵字: inner join on 是顯示的內(nèi)連接,同時(shí)用where子句的隱私的內(nèi)連接.它的重點(diǎn)是只查找匹配的行.
語(yǔ)句
select * from a_table a inner join b_table b where a.a_id=b.b_id
左連接(左外連接)
關(guān)鍵字: left join 表 on 條件/ left outer join on
語(yǔ)句
select * from a_table a left join b_table on a.a_id=b.b_id
說(shuō)明: 左外連接左表中的內(nèi)容會(huì)全部顯示出來(lái),而右表中的內(nèi)容只顯示匹配的內(nèi)容,而至于沒(méi)有匹配的內(nèi)容一律用null來(lái)填充
右連接(右外連接)
關(guān)鍵字:right join 表 on 條件/rigth outer join 表 on
語(yǔ)句:
select * from a_table a right join b_table b on a.a_id=b.b_id;
right join是right outer join的簡(jiǎn)寫(xiě),它的全稱是右外連接,是外連接中的一種。
與左(外)連接相反,右(外)連接,左表(a_table)只會(huì)顯示符合搜索條件的記錄,而右表(b_table)的記錄將會(huì)全部表示出來(lái)。左表記錄不足的地方均為NULL。
交叉連接
SQL語(yǔ)句查詢的基本原理
單表查詢
根據(jù)where條件過(guò)濾掉表中的記錄,形成中間表(這個(gè)中間表用戶是不可見(jiàn)的).然后根據(jù)select的選擇列進(jìn)行返回最終結(jié)果.
兩表連接查詢
對(duì)兩表求積(笛卡爾積)并用ON條件和連接連接類(lèi)型進(jìn)行過(guò)濾形成中間表;然后根據(jù)WHERE條件過(guò)濾中間表的記錄,并根據(jù)SELECT指定的列返回查詢結(jié)果。
多表連接查詢
先對(duì)第一個(gè)和第二個(gè)表按照兩表連接做查詢,然后用查詢結(jié)果和第三個(gè)表做連接查詢,以此類(lèi)推,直到所有的表都連接上為止,最終形成一個(gè)中間的結(jié)果表,然后根據(jù)WHERE條件過(guò)濾中間表的記錄,并根據(jù)SELECT指定的列返回查詢結(jié)果。
理解SQL查詢的過(guò)程是進(jìn)行SQL優(yōu)化的理論依據(jù)。
on后面的條件和where條件的區(qū)別
ON條件:是過(guò)濾兩個(gè)鏈接表笛卡爾積形成中間表的約束條件。
WHERE條件:在有ON條件的SELECT語(yǔ)句中是過(guò)濾中間表的約束條件。在沒(méi)有ON的單表查詢中,是限制物理表或者中間查詢結(jié)果返回記錄的約束。在兩表或多表連接中是限制連接形成最終中間表的返回結(jié)果的約束。
從這里可以看出,將WHERE條件移入ON后面是不恰當(dāng)?shù)?。推薦的做法是:
ON只進(jìn)行連接操作,WHERE只過(guò)濾中間表的記錄。
數(shù)據(jù)庫(kù)常用的操作:
1.創(chuàng)建數(shù)據(jù)庫(kù):
create database
db_name;
2.創(chuàng)建并設(shè)置字符編碼
create database
db_name character set utf8;
3.查看數(shù)據(jù)庫(kù)的字符集編碼:
show variables like 'character_set_database'
4.修改字符集編碼
alter db_name character set utf8
數(shù)據(jù)表常見(jiàn)的操作:
1.創(chuàng)建一個(gè)表
create table tb_name(id int,name varchar(20)) ;
注意在創(chuàng)建表的時(shí)候,不要添加記錄,添加記錄用insert into
2.刪除表
drop table tb_name;
3插入數(shù)據(jù)到表中
insert into tb_name(id,name) values(1,'a'),(2,'b')
查詢表
select * from tb_name where 查詢條件
添加一個(gè)字段(列)
alter table tb_name add age int not null default 10;
刪除列
alter table tb_name drop column age;
修改某一列的字段類(lèi)型
alter table tb_name modify age varchar(50)
更新某一列的數(shù)據(jù)
update table tb_name set age = 100 where id =1;
約束
1) 約束的種類(lèi)
primary key(主鍵約束 唯一且不為null)
default(默認(rèn)值約束)
not null (非空約束)
unique(唯一約束,可以為null值)
foreign key(外鍵約束)
check(檢查約束)
2) 添加約束
alter table tb_name add primary key(id)
alter table tb_name add unique(test_student)
alter table tb_name add foreign key(id)
3)刪除約束
alter table tb_name drop primary key
常用的查詢語(yǔ)句
1.簡(jiǎn)單查詢
無(wú)條件查詢
select * from tb_name; select col1,col2,... from tb_name
條件查詢
select * from tb_name where 查詢條件;
排序查詢
select * from tb_name where 條件 order by 字段 asc/desc desc降序, asc升序.默認(rèn)是升序asc
例如:查詢出及格的學(xué)生,并按照從高到低進(jìn)行排序:
select * from students where score >= 60 order_by score desc;
模糊查詢
使用關(guān)鍵字like主要使用%,下劃線,[]三個(gè)字符. % 表示匹配0個(gè)或多個(gè)字符(通配符),下劃線表示匹配一個(gè)字符.[]匹配它里面的一個(gè),類(lèi)似正則.
例一: 查詢名字中姓張的
select * from person where name like '張%';
例二:查詢姓張的且只有兩個(gè)字的
select * from person where name like '張_';
例三:查詢姓氏為張,王,李的人
select * from person where name like '[張王李]%'
分組查詢:
select * from tb_name group by 列名.關(guān)鍵字group by將統(tǒng)計(jì)列中相同的數(shù)據(jù)進(jìn)行分組.
例一:查詢學(xué)生中的每個(gè)分?jǐn)?shù)有多少人,就是按分?jǐn)?shù)進(jìn)行分組.有相同的分?jǐn)?shù)將進(jìn)行合并
select score,count(*) from student group by score;
分組常用的函數(shù)
1)max:求最大值 例: select s_name,max(math_score) from student group by s_name 查詢數(shù)學(xué)成績(jī)最高的學(xué)生姓名
select s_name,max(math_score) from student group by s_name
(2)min:求最小值 例: select s_name,min(math_score) from student group by s_name 查詢數(shù)學(xué)成績(jī)最低的學(xué)生姓名
select s_name,min(math_score) from student group by s_name
(3)avg:求平均值 例: select class_id,avg(math_score) from student group by class_id 查詢每個(gè)班的平均數(shù)學(xué)成績(jī)
select class_id,avg(math_score) from student group by class_id
(4)sum:求總數(shù)和 例: select sum(s_id) from student 查詢表中一共有多少學(xué)生
select sum(s_id) from student
(5)count:求總行數(shù)
having的用法:篩選成組后的各種數(shù)據(jù),它可以篩選出表中沒(méi)有的數(shù)據(jù)作為查詢條件
比如:
select s_name,sum(s_socre) from student group_by s_name having sum(s_socre) > 600
查詢總成績(jī)大于600分的學(xué)生,當(dāng)我們表沒(méi)有總分這個(gè)記錄.
只有每科的成績(jī),這時(shí)就可以使用having了,where就不能來(lái)篩選總成績(jī)大于600的學(xué)生了.
having和where的區(qū)別?
having: 是對(duì)查詢的結(jié)果中的列發(fā)揮作用,一般配合group by來(lái)使用,并且這個(gè)列可以不是表中的字段.
where: 是針對(duì)表中的列進(jìn)行查詢,直接在原表上進(jìn)行操作.而having是對(duì)查詢的結(jié)果進(jìn)行判斷,篩選出滿足條件的數(shù)據(jù)記錄.
limit:
主要用來(lái)分頁(yè),limit n,m表示從n+1開(kāi)始取m條數(shù)據(jù)
比如:從去結(jié)果中第三條到低5條數(shù)據(jù)
select * from tb_name limit 2,5
簡(jiǎn)單的多表查詢
select table1.* ,table2.* from table1,table2 where 查詢條件.
子查詢和連接查詢
1.where子查詢:
select s_name,s_score from student where s_score in (select s_score from student where s_score >= 60)
查詢成績(jī)及格的學(xué)生,后面括號(hào)里可以放子查詢,也可以放已知的數(shù)據(jù).