select distinct [字段名] from [表名]旧找;
用于查詢該列不重復(fù)的所有值剖膳。?
where子句中可以加between...and...
模糊查詢:like
%代表多個字符魏颓,_代表一個字符
like 'M%'代表查詢以M開頭的字符串;
like '%M%'代表查詢包含M的字符串吱晒;
like '%M'代表查詢以M結(jié)尾的字符串甸饱;
like '%M_'代表查詢M為倒數(shù)第二個字符的字符串
like 'M_'代表兩位,第一位是M的字符串
like關(guān)鍵字前還可以加上not關(guān)鍵字仑濒,表示不是....
in保留字:指定針對某個列可能的多個值
select * from product where market_price in (1999,2999,3999);
order by...
是可以指定多列進(jìn)行排序的
insert into...語句使用方法:
兩種方式:
(1)insert into category values (‘7‘’叹话,‘生活用品’);
(2)insert into category (cid, cname) values ('7', ‘生活用品')墩瞳;
update語句:
例如:
? ? ?update category set cname = ‘書籍’ where cid = '18';
注意:
? ? update語句后面如果不接where子句驼壶,就會使表內(nèi)所有行的值都會更新,一定要慎重喉酌!
在MySQL中热凹,可以通過設(shè)置 set sql_safe_updates = 1; 這樣箩溃,update后沒有where子句就會報錯。
delete語句
limit語句
select * from product limit A;
表示從第一條開始查詢碌嘀,一共查詢A條涣旨;
select * from product limit A ,B;
表示從第A條開始查詢,一共查詢B條股冗;
as為列霹陡、表添加別名,作用有:
(1)列名稱很長或者可讀性很差
select name as n, price as p from product;
(2)在查詢中設(shè)計到了不止一個表
select o.uid, oi.pid from orders as o, orderitems as oi where o.oid = oi.oid;
通過oid將兩個表連接到了一起止状,并輸出兩個表中各一列烹棉;
(3)需要把兩個列或多格列合到一起,為新列去一個別名
select pname,?CONCAT(market_price, ',' ,shop_price) as price from product;
join連接:將兩個或多個表的行通過一定關(guān)系連接到一起
分為內(nèi)連接怯疤、外連接
內(nèi)連接:
select product.pid, product.pname, orderitem.itemid from product (inner) join orderitem on product.pid = orderitem.pid;
只有兩個表格滿足了?product.pid = orderitem.pid? 這個條件之后浆洗,才會將符合條件的行輸出出來;
外連接:分為左連接和右連接
select?product.pid, product.pname, orderitem.itemid?from?product?left join?orderitem?on?product.pid = orderitem.pid;
這句是左連接集峦,不管product.pid = orderitem.pid 條件是不是滿足伏社,左邊的表product 所有行全部輸出出來,但是右邊的表格orderitem是否輸出需要依靠這個條件塔淤,條件滿足的行則輸出摘昌,條件不滿足的行則輸出null;
右連接類似高蜂,只不過將left改為right聪黎,右表全部輸出,左表是否輸出看每一行的條件是否滿足备恤;
union語句
select columnName1... from table1?
union
select columnName2... from table2
用于將兩次select的所有值連接到一起顯示稿饰,需要保證兩次查詢的列的數(shù)量、類型相同露泊,而且union連接時喉镰,不會顯示重復(fù)值
如需要顯示重復(fù)值,請使用union all 關(guān)鍵字滤淳。
insert into? [目標(biāo)表名] ((目標(biāo)表的列))? select [選擇的列名] from [源表名] (where...)梧喷;
可以將源表中的一些數(shù)據(jù)插入到目標(biāo)表中,注意是插入脖咐,并不會影響目標(biāo)表已有的數(shù)據(jù)铺敌。
如果目標(biāo)表不存在,則該語句不會創(chuàng)建新的目標(biāo)表屁擅,而是報錯偿凭。
選取的列的數(shù)量、類型要與目標(biāo)表選取的列的數(shù)量派歌、類型保持一致弯囊,否則報錯痰哨。
可以加where子句,用法和select語句相同匾嘱。
例:
insert into category_new select product.pid, orderitem.itemid from product join orderitem on product.pid = orderitem.pid;?
create關(guān)鍵字的使用
創(chuàng)建數(shù)據(jù)庫:
create datebase db_1;
創(chuàng)建表格:
create table test_table (
id int,
tname varchar(50);
);
注意斤斧,varcahr類型后面需要跟上長度
如果想要復(fù)制一個表格的類型,可以使用如下語句:
create table test_table_1 as select * from test_table where 1=0;
where 1=0是為了在新表中不添加任何數(shù)據(jù)
創(chuàng)建索引
create index index_test on test_table (column_1 , column_1 );
約束 NOT NULL
NOT NULL指定一列不為空霎烙,不許存放null值撬讽;
約束UNIQUE
UNIQUE指定一列不許出現(xiàn)重復(fù)值,但是可以出現(xiàn)多個NULL
使用方法:
使用create來添加 UNIQUE
create table person (
pid int,
pname varchar(20) not null,
unique (pid)
);
如果為多個列添加unique越約束悬垃,使用如下語句:
create table person(
pid int not null,
pname varchar(20) not null,
constraint uc_person unique (pid, pname)
);
這樣一來游昼,pid或者pname本身可以出現(xiàn)重復(fù)值,但是pid+pname不允許出現(xiàn)重復(fù)值尝蠕。
使用ALTER來添加刪除UNIQUE
alter table person add unique (pid);
或者
alter table person add constraint uc_person unique (pid, pname);
alter table person drop index uc_person;
(刪除?UNIQUE 約束)
PRIMARY KEY約束(主鍵約束)
PRIMARY KEY 相當(dāng)于NOT NULL和UNIQUE放在一起烘豌,而且每一個表中只能有一個主鍵。
其使用方法與UNIQUE類似看彼。
只不過在刪除主鍵約束時廊佩,可以像下面這樣寫
alter table person drop primary key;
因為一個表中只有一個主鍵約束,不需要為其指定約束名稱
FOREIGN KEY約束(外鍵約束)
一個表中的 FOREIGN KEY 指向另一個表中的 UNIQUE KEY(唯一約束的鍵)闲昭。
FOREIGN KEY 約束用于預(yù)防破壞表之間連接的行為罐寨。
FOREIGN KEY 約束也能防止非法數(shù)據(jù)插入外鍵列,因為它必須是它指向的那個表中的值之一序矩。
其用法如下,以create為例:
create table orders (
oid int not null,
pid int not null,
constraint fc_pid foreign key (pid) references person (pid)
);
Check約束
Check約束用于限制列的取值范圍
例如:
create table person (
id int primary key,
pname varchar(20) not null,
age int,
constraint cc_age check (age>10)
);
Default約束
用于向列中插入默認(rèn)值
create table person (
id int primary key,
pname varchar(20) not null,
age int,
constraint dc_age default 15
);
drop語句
刪除數(shù)據(jù)庫
drop database db1;
刪除表
drop table table1;
刪除索引
drop index index1;
drop跋破、delete簸淀、truncate刪除表的區(qū)別
drop會清除表的內(nèi)容,結(jié)構(gòu)毒返,約束租幕,并釋放空間,后續(xù)想要向該表中添加數(shù)據(jù)是不允許的拧簸,除非建立一個新的表劲绪;
truncate保留表的結(jié)構(gòu),清空表的內(nèi)容盆赤,釋放空間贾富,后續(xù)可以繼續(xù)向表中添加內(nèi)容;
delete允許使用where子句一行一行刪除表的內(nèi)容牺六,而且刪除操作會作為事務(wù)記錄在日志中颤枪。當(dāng)不加where子句時,其作用效果與truncate類似淑际。
delete語句是數(shù)據(jù)庫操作語言(dml) 畏纲,drop和truncate是數(shù)據(jù)庫定義語言(ddl)扇住。
alter語句允許添加列,刪除列盗胀,修改列
alter table table1 add pid int;? //添加列
alter table table1 drop column pid;? //刪除列
alter table table1 modify column pid varchar(20);? //將pid列的類型從int改為varchar
關(guān)于MySQL null值的處理
null值是不可比較的艘蹋,要想判斷一個數(shù)據(jù)存的是不是null值,需要使用到is null關(guān)鍵字,或者是 is not null票灰。
select * from test_table2 where age is not null女阀;
如果我們要對某些列進(jìn)行運(yùn)算,里邊如果摻雜著null值米间,那么計算結(jié)果一定是null强品,不符合我們的要求,所以希望將null值改為一個可以計算的數(shù)值屈糊。在mysql中的榛,使用到了ifnull()函數(shù);
select product_price * count as total_price from product;
這里面逻锐,如果count中有null值夫晌,輸出結(jié)果total_price中將會出現(xiàn)null值,是我們不想看到的昧诱,
所以該SQL語句改為如下:
select product_price * ifnull(count, 0) as total_price from product;
該語句的意思是晓淀,如果count為空,那么就將其看做成0來計算盏档。
count()函數(shù)的使用
select count(*) from test_table;? ? //計算test_table一共有多少行
select count(age) from test_table;? ? //計算test_table中age列一共有多少數(shù)據(jù)凶掰,注意,null值不會計算在內(nèi)
select count(distinct age) from test_table;? ? //計算test_table中age列有多少不同的值蜈亩,注意懦窘,null值不會計算在內(nèi)
group by和having語句的使用
group by主要是將查詢的數(shù)據(jù)進(jìn)行分組,在單表查詢中稚配,其使用方式如下:
select oid, sum(subtotal) as total from orderitem group by oid;? ? //查詢每一個訂單中的總金額畅涂,最后顯示的是訂單號和總金額
對于多表分組查詢,比較復(fù)雜道川,
比如說我們想要查詢每一個訂單中的訂單號午衰,總金額,和所有的商品
可以寫下如下的SQL語句
select orderitem.oid, sum(orderitem.count * product.market_price) as totalPrice,?group_concat(product.pname) as product
from orderitem left join product on orderitem.pid = product.pid
group by oid;
having主要是解決了where子句中不能使用聚合函數(shù)的問題
比如說冒萄,我們想要從orderitem中查詢訂單總金額大于10000的訂單號和總金額臊岸,可以寫出如下的sql語句
select oid, sum(subtotal) from orderitem?group by oid having sum(subtotal) > 10000;
當(dāng)然,having也可用于多表分組查詢中
對于sql查詢語句的子句執(zhí)行順序如下:
(1)from子句: 先確定從哪個表格中獲取數(shù)據(jù)宦言,如果有join關(guān)鍵字扇单,則先進(jìn)行多表的連接
(2)where子句:從獲取的表中篩選出符合where子句條件的行;
(3)group by子句:篩選過后奠旺,對所有行進(jìn)行分組
(4)having子句:分組后蜘澜,通過having子句的篩選獲取符合條件的組施流;
(5)select子句:選取我們需要查詢的列或者列的組合運(yùn)算(聚合函數(shù));
(6)union子句:將選取出的數(shù)據(jù)放到一起鄙信;
(7)order by子句:將選好的列按照一定規(guī)則排列顯示瞪醋;