单表操作
表介紹
表相當(dāng)于文件,表中的一條記錄就相當(dāng)于文件的一行內(nèi)容,不同的是,表中的一條記錄有對(duì)應(yīng)的標(biāo)題,稱為表的字段
id,name,qq,age稱為字段,其余的,一行內(nèi)容稱為一條記錄
對(duì)數(shù)據(jù)庫(kù)的表的操作就是數(shù)據(jù)庫(kù)內(nèi)的文件(table)的操作
?創(chuàng)建表
#語(yǔ)法: create table 表名( 字段名1 類型[(寬度) 約束條件], 字段名2 類型[(寬度) 約束條件], 字段名3 類型[(寬度) 約束條件] );#注意: 1. 在同一張表中,字段名是不能相同 2. 寬度和約束條件可選 3. 字段名和類型是必須的
這個(gè)是沒(méi)有加上默認(rèn)的編碼的但是最好加上默認(rèn)的編碼
?
創(chuàng)建表:
| 1 2 3 4 | create table 表名( ????列名? 類型? 是否可以為空, ????列名? 類型? 是否可以為空 )ENGINE=InnoDB DEFAULT CHARSET=utf8 |
在最后加上指定的編碼utf8 或者gbk并且指定的引擎
?
是否可空,null表示空,非字符串not null - 不可空null - 可空 是否可以為空 默認(rèn)值,創(chuàng)建列時(shí)可以指定默認(rèn)值,當(dāng)插入數(shù)據(jù)時(shí)如果未主動(dòng)設(shè)置,則自動(dòng)添加默認(rèn)值create table tb1(nid int not null defalut 2,num int not null)這個(gè)是對(duì)nid列設(shè)置一個(gè)默認(rèn)的值2 如果沒(méi)有添加值就默認(rèn)為2 默認(rèn)值 default 自增,如果為某列設(shè)置自增列,插入數(shù)據(jù)時(shí)無(wú)需設(shè)置此列,默認(rèn)將自增(表中只能有一個(gè)自增列)create table tb1(nid int not null auto_increment primary key,num int null)或create table tb1(nid int not null auto_increment,num int null,index(nid))注意:1、對(duì)于自增列,必須是索引(含主鍵)。2、對(duì)于自增可以設(shè)置步長(zhǎng)和起始值show session variables like 'auto_inc%';set session auto_increment_increment=2;set session auto_increment_offset=10;shwo global variables like 'auto_inc%';set global auto_increment_increment=2;set global auto_increment_offset=10; 自增 主鍵,一種特殊的唯一索引,不允許有空值,如果主鍵使用單個(gè)列,則它的值必須唯一,如果是多列,則其組合必須唯一。create table tb1(nid int not null auto_increment primary key,num int null)或create table tb1(nid int not null,num int not null,primary key(nid,num)) 主鍵 外鍵,一個(gè)特殊的索引,只能是指定內(nèi)容creat table color(nid int not null primary key,name char(16) not null)create table fruit(nid int not null primary key,smt char(32) null ,color_id int not null,constraint fk_cc foreign key (color_id) references color(nid)) 外鍵?
刪除表?
DROP TABLE +要?jiǎng)h除表名 ;drop table test; # 刪除test表?
?
?
?
表的操作:
?
修改表
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 添加列:alter table 表名 add 列名 類型 刪除列:alter table 表名 drop column 列名 修改列: ????????alter table 表名 modify column 列名 類型;? -- 類型 ????????alter table 表名 change 原列名 新列名 類型; -- 列名,類型 ?? 添加主鍵: ????????alter table 表名 add primary key(列名); 刪除主鍵: ????????alter table 表名 drop primary key; ????????alter table 表名? modify? 列名 int, drop primary key; ?? 添加外鍵:alter table 從表 add constraint 外鍵名稱(形如:FK_從表_主表) foreign key 從表(外鍵字段) references 主表(主鍵字段); 刪除外鍵:alter table 表名 drop foreign key 外鍵名稱 ?? 修改默認(rèn)值:ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000; 刪除默認(rèn)值:ALTER TABLE testalter_tbl ALTER i DROP DEFAULT; |
?
?
修改表: ALTER TABLE
語(yǔ)法: 1. 修改表名ALTER TABLE 表名 RENAME 新表名;2. 增加字段ALTER TABLE 表名ADD 字段名 數(shù)據(jù)類型 [完整性約束條件…],ADD 字段名 數(shù)據(jù)類型 [完整性約束條件…];ALTER TABLE 表名ADD 字段名 數(shù)據(jù)類型 [完整性約束條件…] FIRST;ALTER TABLE 表名ADD 字段名 數(shù)據(jù)類型 [完整性約束條件…] AFTER 字段名;3. 刪除字段ALTER TABLE 表名 DROP 字段名;4. 修改字段ALTER TABLE 表名 MODIFY 字段名 數(shù)據(jù)類型 [完整性約束條件…];ALTER TABLE 表名 CHANGE 舊字段名 新字段名 舊數(shù)據(jù)類型 [完整性約束條件…];ALTER TABLE 表名 CHANGE 舊字段名 新字段名 新數(shù)據(jù)類型 [完整性約束條件…];示例:
alter table t5 rename nihao; 這個(gè)是將你的t5列名字修改為nihaoalter table t5 add new_id int ;這是在你的 t5列中增加一個(gè)int類型的new_id列;alter table t5 drop new_id; 刪除你的 t5列中的new_id 列
alter table t5 modify new_id char(30); 這是把你的t5列中的new_id 列的數(shù)據(jù)類型改為charalter table t5 change new_id old char; 把你的t5列中的原有的char類型的new_id 列改為old列alter table t5 CHANGE old new_id int; 把你的t5列中的old列改為 int類型的new_id 列
?
查看表結(jié)構(gòu): desc+查看的表
MariaDB [db1]> describe t1; #查看表結(jié)構(gòu),可簡(jiǎn)寫為desc 表名 +-------+-----------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-----------------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(50) | YES | | NULL | | | sex | enum('male','female') | YES | | NULL | | | age | int(3) | YES | | NULL | | +-------+-----------------------+------+-----+---------+-------+ MariaDB [db1]> show create table t1\G; #查看表詳細(xì)結(jié)構(gòu),可加\G \G不適用連接工具比如navicat此類工具 desc t1; 查看t1表中的信息效果:
?
?
查看表的詳細(xì)結(jié)構(gòu)
mysql> show create table a1\G; *************************** 1. row ***************************Table: a1 Create Table: CREATE TABLE `a1` (`id` int(11) DEFAULT NULL,`name` varchar(50) DEFAULT NULL,`age` int(3) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)震驚IT界的增刪改查:
?
對(duì)表中的內(nèi)容進(jìn)行操作增:INSERT INTO表名(增加內(nèi)容的列)VALUES(增加的內(nèi)容);刪:delete 要?jiǎng)h除的內(nèi)容 from 表名 where 條件;改:update 表名 set 改的內(nèi)容 where 條件;查: SELECT 內(nèi)容 from 列明?
我們以后大部分的‘ 搬磚工作者’ 幾乎都是和這些增刪改查一直打交道的
?
?
?
?
?
?
八 復(fù)制表
?
復(fù)制表結(jié)構(gòu)+記錄 (key不會(huì)復(fù)制: 主鍵、外鍵和索引) mysql> create table new_service select * from service;只復(fù)制表結(jié)構(gòu) mysql> select * from service where 1=2; //條件為假,查不到任何記錄 Empty set (0.00 sec) mysql> create table new1_service select * from service where 1=2; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0mysql> create table t4 like employees;?
?
?
即復(fù)制表結(jié)構(gòu)和數(shù)據(jù)create table t6 select * from t5創(chuàng)建t6表并且復(fù)制t5表中的所有的結(jié)構(gòu)和信息只復(fù)制表結(jié)構(gòu) where后面必須是falsecreate table t7 select * from t5 where 1 > 3;只復(fù)制表結(jié)構(gòu)(2)create table t8 like t5;創(chuàng)建t8表并且把t5表的結(jié)構(gòu)復(fù)制到t8中不復(fù)制它的值?
復(fù)制表的信息到另外一個(gè)表
?????? Insert into 表名(自己的信息列)+ select +被復(fù)制的表的信息列+from+被復(fù)制的表名
insert into t2(id,name) select id,name from t1; 把t1中的id和name列復(fù)制到t2的id和name列?
?
?
?
?
表內(nèi)容操作
1、增
增有好幾個(gè)方式:insert into 表 (列名,列名...) values (值,值,值...) insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...) insert into 表values(值,值,值);這種方法增加的時(shí)候需要把每個(gè)不為空不自增的值都加上復(fù)制: insert into 表 (列名,列名...) select (列名,列名...) from 表注意這種查詢別的語(yǔ)句來(lái)插入自己語(yǔ)句中不需要values
?
在MySQL管理軟件中,可以通過(guò)SQL語(yǔ)句中的DML語(yǔ)言來(lái)實(shí)現(xiàn)數(shù)據(jù)的操作,包括1.使用INSERT實(shí)現(xiàn)數(shù)據(jù)的插入 2.UPDATE實(shí)現(xiàn)數(shù)據(jù)的更新 3.使用DELETE實(shí)現(xiàn)數(shù)據(jù)的刪除 4.使用SELECT查詢數(shù)據(jù)以及。1. 插入完整數(shù)據(jù)(順序插入)語(yǔ)法一:INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n);語(yǔ)法二:INSERT INTO 表名 VALUES (值1,值2,值3…值n);2. 指定字段插入數(shù)據(jù)語(yǔ)法:INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…);3. 插入多條記錄語(yǔ)法:INSERT INTO 表名 VALUES(值1,值2,值3…值n),(值1,值2,值3…值n),(值1,值2,值3…值n);4. 插入查詢結(jié)果語(yǔ)法:INSERT INTO 表名(字段1,字段2,字段3…字段n) SELECT (字段1,字段2,字段3…字段n) FROM 表2WHERE …;
?
?
插入查詢結(jié)果:INSERT INTO t1 ( NAME ) ( SELECT NAME FROM userinfo WHERE id = 1 ); 這是找到你userinfo表中的id等于1的name的值 然后插入t1表中的name中
如果要加入values 的話必須要在結(jié)果的外面再加入一個(gè)括號(hào)() 也就是兩個(gè)括號(hào)()
INSERT INTO t1 ( NAME ) VALUES (( SELECT NAME FROM userinfo WHERE id = 1 ));
這個(gè)就是在values的后面加上兩個(gè)括號(hào)
?
?
?
?
改:
update
語(yǔ)法:UPDATE 表名 SET字段1=值1,字段2=值2,WHERE CONDITION;示例:UPDATE mysql.user SET password=password(‘123’) where user=’root’ and host=’localhost’;?
update tb12 set name='laoliu' where id>12 and name='xx' 把id大于12 和姓名是xx的 name改為老劉 update tb12 set name='laoliu',age=19 where id>12 and name='xx' 把id 大于12 和name是xx的name 改為laoliu age 改為19?
?
?
?
刪:delete
delete? 一般都是和where判讀條件一起使用的
?
語(yǔ)法:DELETE FROM 表名 WHERE CONITION;示例:DELETE FROM mysql.user WHERE password=’’;練習(xí):更新MySQL root用戶密碼為mysql123刪除除從本地登錄的root用戶以外的所有用戶?
示例:
刪除可以根據(jù)很多判讀條件來(lái)刪除
delete from tb12;delete from tb12 where id !=2 刪除id不等于2的delete from tb12 where id =2 刪除id等于2的delete from tb12 where id > 2 刪除大于2的 delete from tb12 where id >=2 刪除大于等于2的delete from tb12 where id >=2 or name='zhaoyun' 刪除大于等于2 或者name是zhaoyun的?
?
?
?
查:
查可謂是重中之重? 此乃以后孩兒們的操作重心,細(xì)細(xì)品味
單表查詢的語(yǔ)法:
單表查詢的語(yǔ)法 SELECT 字段1,字段2... FROM 表名WHERE 條件GROUP BY fieldHAVING 篩選ORDER BY fieldLIMIT 限制條數(shù)?
?
查
| 1 2 3 | select?*?from?表 select?*?from?表?where?id > 1 select?nid,name,gender?as?gg?from?表?where?id > 1 |
關(guān)鍵字的執(zhí)行優(yōu)先級(jí)(重點(diǎn))
重點(diǎn)中的重點(diǎn):關(guān)鍵字的執(zhí)行優(yōu)先級(jí) from where group by having select distinct order by limit?
?
單條件查詢SELECT name FROM employeeWHERE post='sale'; 這個(gè)是對(duì)employee表中的name查找 當(dāng)你的post等于sale的時(shí)候多條件查詢SELECT name,salary FROM employeeWHERE post='teacher' AND salary>10000;
?
關(guān)鍵字BETWEEN AND區(qū)間查詢:between要和and連用
SELECT * FROM T2 WHERE ID BETWEEN 1 AND 6;
查找你的t2表中的id從1到6的name的值
關(guān)鍵字IS NULL(判斷某個(gè)字段是否為NULL不能用等號(hào),需要用IS)select * from t2 where id? is not? null;
查找你的t2表內(nèi)的所有的id不為空的name的值 關(guān)鍵字IN集合查詢
select name from t2 where id in(3,5,7);
這個(gè)是查找id是3,5,7的name的值
NOT IN 查找:
select name from t2 where id not in (3,5);
查找你的t2表中的id不是3和5的name的值
關(guān)鍵字LIKE模糊查詢
模糊匹配有兩個(gè)% 和_%是可以匹配任意字符
_只能匹配一個(gè)字符
他們兩個(gè)都要和like一起使用
%可以放在后面就是以什么什么開頭,放在信息前面面含有什么什么
select * from t2 where name like '飯%';
這個(gè)就是尋找 t2表中的name 是以飯開頭的信息
SELECT NAME FROM T2 WHERE NAME LIKE '%井';
查找你t2表中的 name是的信息中后面含有井的
select * from t2 where name like '%云%';
查找你的name的信息中只要含有云的信息
下劃線_ 只能匹配英文 不能匹配漢字 并且只能匹配到一位 不能多匹配
select * from t2 where name like 'z_';
查找你的t2表中的name中以z開頭的僅有兩個(gè)英文字母的信息
避免重復(fù)DISTINCT
不能有重復(fù)的
select distinct name from t2;?
茶查找t2中不重復(fù)的name信息
嵌套查找:
select name from t2 where id = (select id? from t1 where name like'%劉') ;
這個(gè)
判斷條件是當(dāng)你的id等于他表中的naem的后面是劉的id然后求出這個(gè)id對(duì)應(yīng)的t2的name
分頁(yè)操作:limit:
當(dāng)你的limit后面只有一個(gè)數(shù)字的時(shí)候就代表你要顯示多少 如果后面是兩個(gè)數(shù)字第一個(gè)是代表你要從第幾位開始查找第二代代表你查找的數(shù)量
select * from t2 where id limit 3;
這個(gè)是指定只查找前3頁(yè)
select * from t2 where id limit 3,3;
從id等于3開始查找 往后查找3頁(yè)
排序:order by
排序的desc 是從大到小 asc是從小到大
select * from t2? order by? id desc ;
查詢id從大到小的t2表中的信息 一般這個(gè)是倒序查找
select * from t2 order by id asc;
根據(jù)id從小到大查找t2表中的信息 正序查找
select * from t2 order by id desc limit 3;
求這個(gè)是取后3條數(shù)據(jù)
?
?
?
分組操作:group? by?
什么是分組?為什么要分組?
#1、首先明確一點(diǎn):分組發(fā)生在where之后,即分組是基于where之后得到的記錄而進(jìn)行的#2、分組指的是:將所有記錄按照某個(gè)相同字段進(jìn)行歸類,比如針對(duì)員工信息表的職位分組,或者按照性別進(jìn)行分組等#3、為何要分組呢?取每個(gè)部門的最高工資取每個(gè)部門的員工數(shù)取男人數(shù)和女人數(shù)小竅門:‘每’這個(gè)字后面的字段,就是我們分組的依據(jù)#4、大前提:可以按照任意字段分組,但是分組完畢后,比如group by post,只能查看post字段,如果想查看組內(nèi)信息,需要借助于聚合函數(shù)分組的管理函數(shù):
max()求最大值 min()求最小值 avg()求平均值 sum() 求和 count() 求總個(gè)數(shù)?
**** 如果對(duì)于聚合函數(shù)結(jié)果進(jìn)行二次篩選時(shí)?必須使用having ****
select count(id),name from t2 where id > 1 group by name having count(id) > 1;這個(gè)就是二次篩選需要使用having第一個(gè)是求出id大于1 第二次是求出總數(shù)大于1的再顯示?
group? by
根據(jù)什么什么來(lái)分組
select count(id),name from t2 group by name; 這個(gè)是根據(jù)name來(lái)分組運(yùn)用count來(lái)求出id的和?
?
HAVING過(guò)濾
HAVING與WHERE不一樣的地方在于#!!!執(zhí)行優(yōu)先級(jí)從高到低:where > group by > having #1. Where 發(fā)生在分組group by之前,因而Where中可以有任意字段,但是絕對(duì)不能使用聚合函數(shù)。#2. Having發(fā)生在分組group by之后,因而Having中可以使用分組的字段,無(wú)法直接取到其他字段,可以使用聚合函數(shù)
?
?
?
?
匯總:
a、條件select * from 表 where id > 1 and name != 'alex' and num = 12;select * from 表 where id between 5 and 16;select * from 表 where id in (11,22,33)select * from 表 where id not in (11,22,33)select * from 表 where id in (select nid from 表)b、通配符select * from 表 where name like 'ale%' - ale開頭的所有(多個(gè)字符串)select * from 表 where name like 'ale_' - ale開頭的所有(一個(gè)字符)c、限制select * from 表 limit 5; - 前5行select * from 表 limit 4,5; - 從第4行開始的5行select * from 表 limit 5 offset 4 - 從第4行開始的5行d、排序select * from 表 order by 列 asc - 根據(jù) “列” 從小到大排列select * from 表 order by 列 desc - 根據(jù) “列” 從大到小排列select * from 表 order by 列1 desc,列2 asc - 根據(jù) “列1” 從大到小排列,如果相同則按列2從小到大排序e、分組select num from 表 group by numselect num,nid from 表 group by num,nidselect num,nid from 表 where nid > 10 group by num,nid order nid descselect num,nid,count(*),sum(score),max(score),min(score) from 表 group by num,nidselect num from 表 group by num having max(id) > 10特別的:group by 必須在where之后,order by之前f、連表無(wú)對(duì)應(yīng)關(guān)系則不顯示select A.num, A.name, B.namefrom A,BWhere A.nid = B.nid無(wú)對(duì)應(yīng)關(guān)系則不顯示select A.num, A.name, B.namefrom A inner join Bon A.nid = B.nidA表所有顯示,如果B中無(wú)對(duì)應(yīng)關(guān)系,則值為nullselect A.num, A.name, B.namefrom A left join Bon A.nid = B.nidB表所有顯示,如果B中無(wú)對(duì)應(yīng)關(guān)系,則值為nullselect A.num, A.name, B.namefrom A right join Bon A.nid = B.nidg、組合組合,自動(dòng)處理重合select nicknamefrom Aunionselect namefrom B組合,不處理重合select nicknamefrom Aunion allselect namefrom B View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/zhaoyunlong/p/9169226.html
總結(jié)
- 上一篇: 给当兵朋友的祝福语163个
- 下一篇: Django模板语言