单表操作
表介紹
表相當于文件,表中的一條記錄就相當于文件的一行內容,不同的是,表中的一條記錄有對應的標題,稱為表的字段
id,name,qq,age稱為字段,其余的,一行內容稱為一條記錄
對數據庫的表的操作就是數據庫內的文件(table)的操作
?創建表
#語法: create table 表名( 字段名1 類型[(寬度) 約束條件], 字段名2 類型[(寬度) 約束條件], 字段名3 類型[(寬度) 約束條件] );#注意: 1. 在同一張表中,字段名是不能相同 2. 寬度和約束條件可選 3. 字段名和類型是必須的
這個是沒有加上默認的編碼的但是最好加上默認的編碼
?
創建表:
| 1 2 3 4 | create table 表名( ????列名? 類型? 是否可以為空, ????列名? 類型? 是否可以為空 )ENGINE=InnoDB DEFAULT CHARSET=utf8 |
在最后加上指定的編碼utf8 或者gbk并且指定的引擎
?
是否可空,null表示空,非字符串not null - 不可空null - 可空 是否可以為空 默認值,創建列時可以指定默認值,當插入數據時如果未主動設置,則自動添加默認值create table tb1(nid int not null defalut 2,num int not null)這個是對nid列設置一個默認的值2 如果沒有添加值就默認為2 默認值 default 自增,如果為某列設置自增列,插入數據時無需設置此列,默認將自增(表中只能有一個自增列)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、對于自增列,必須是索引(含主鍵)。2、對于自增可以設置步長和起始值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; 自增 主鍵,一種特殊的唯一索引,不允許有空值,如果主鍵使用單個列,則它的值必須唯一,如果是多列,則其組合必須唯一。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)) 主鍵 外鍵,一個特殊的索引,只能是指定內容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 +要刪除表名 ;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 外鍵名稱 ?? 修改默認值:ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000; 刪除默認值:ALTER TABLE testalter_tbl ALTER i DROP DEFAULT; |
?
?
修改表: ALTER TABLE
語法: 1. 修改表名ALTER TABLE 表名 RENAME 新表名;2. 增加字段ALTER TABLE 表名ADD 字段名 數據類型 [完整性約束條件…],ADD 字段名 數據類型 [完整性約束條件…];ALTER TABLE 表名ADD 字段名 數據類型 [完整性約束條件…] FIRST;ALTER TABLE 表名ADD 字段名 數據類型 [完整性約束條件…] AFTER 字段名;3. 刪除字段ALTER TABLE 表名 DROP 字段名;4. 修改字段ALTER TABLE 表名 MODIFY 字段名 數據類型 [完整性約束條件…];ALTER TABLE 表名 CHANGE 舊字段名 新字段名 舊數據類型 [完整性約束條件…];ALTER TABLE 表名 CHANGE 舊字段名 新字段名 新數據類型 [完整性約束條件…];示例:
alter table t5 rename nihao; 這個是將你的t5列名字修改為nihaoalter table t5 add new_id int ;這是在你的 t5列中增加一個int類型的new_id列;alter table t5 drop new_id; 刪除你的 t5列中的new_id 列
alter table t5 modify new_id char(30); 這是把你的t5列中的new_id 列的數據類型改為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 列
?
查看表結構: desc+查看的表
MariaDB [db1]> describe t1; #查看表結構,可簡寫為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; #查看表詳細結構,可加\G \G不適用連接工具比如navicat此類工具 desc t1; 查看t1表中的信息效果:
?
?
查看表的詳細結構
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界的增刪改查:
?
對表中的內容進行操作增:INSERT INTO表名(增加內容的列)VALUES(增加的內容);刪:delete 要刪除的內容 from 表名 where 條件;改:update 表名 set 改的內容 where 條件;查: SELECT 內容 from 列明?
我們以后大部分的‘ 搬磚工作者’ 幾乎都是和這些增刪改查一直打交道的
?
?
?
?
?
?
八 復制表
?
復制表結構+記錄 (key不會復制: 主鍵、外鍵和索引) mysql> create table new_service select * from service;只復制表結構 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;?
?
?
即復制表結構和數據create table t6 select * from t5創建t6表并且復制t5表中的所有的結構和信息只復制表結構 where后面必須是falsecreate table t7 select * from t5 where 1 > 3;只復制表結構(2)create table t8 like t5;創建t8表并且把t5表的結構復制到t8中不復制它的值?
復制表的信息到另外一個表
?????? Insert into 表名(自己的信息列)+ select +被復制的表的信息列+from+被復制的表名
insert into t2(id,name) select id,name from t1; 把t1中的id和name列復制到t2的id和name列?
?
?
?
?
表內容操作
1、增
增有好幾個方式:insert into 表 (列名,列名...) values (值,值,值...) insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...) insert into 表values(值,值,值);這種方法增加的時候需要把每個不為空不自增的值都加上復制: insert into 表 (列名,列名...) select (列名,列名...) from 表注意這種查詢別的語句來插入自己語句中不需要values
?
在MySQL管理軟件中,可以通過SQL語句中的DML語言來實現數據的操作,包括1.使用INSERT實現數據的插入 2.UPDATE實現數據的更新 3.使用DELETE實現數據的刪除 4.使用SELECT查詢數據以及。1. 插入完整數據(順序插入)語法一:INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n);語法二:INSERT INTO 表名 VALUES (值1,值2,值3…值n);2. 指定字段插入數據語法:INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…);3. 插入多條記錄語法:INSERT INTO 表名 VALUES(值1,值2,值3…值n),(值1,值2,值3…值n),(值1,值2,值3…值n);4. 插入查詢結果語法:INSERT INTO 表名(字段1,字段2,字段3…字段n) SELECT (字段1,字段2,字段3…字段n) FROM 表2WHERE …;
?
?
插入查詢結果:INSERT INTO t1 ( NAME ) ( SELECT NAME FROM userinfo WHERE id = 1 ); 這是找到你userinfo表中的id等于1的name的值 然后插入t1表中的name中
如果要加入values 的話必須要在結果的外面再加入一個括號() 也就是兩個括號()
INSERT INTO t1 ( NAME ) VALUES (( SELECT NAME FROM userinfo WHERE id = 1 ));
這個就是在values的后面加上兩個括號
?
?
?
?
改:
update
語法: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判讀條件一起使用的
?
語法:DELETE FROM 表名 WHERE CONITION;示例:DELETE FROM mysql.user WHERE password=’’;練習:更新MySQL root用戶密碼為mysql123刪除除從本地登錄的root用戶以外的所有用戶?
示例:
刪除可以根據很多判讀條件來刪除
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的?
?
?
?
查:
查可謂是重中之重? 此乃以后孩兒們的操作重心,細細品味
單表查詢的語法:
單表查詢的語法 SELECT 字段1,字段2... FROM 表名WHERE 條件GROUP BY fieldHAVING 篩選ORDER BY fieldLIMIT 限制條數?
?
查
| 1 2 3 | select?*?from?表 select?*?from?表?where?id > 1 select?nid,name,gender?as?gg?from?表?where?id > 1 |
關鍵字的執行優先級(重點)
重點中的重點:關鍵字的執行優先級 from where group by having select distinct order by limit?
?
單條件查詢SELECT name FROM employeeWHERE post='sale'; 這個是對employee表中的name查找 當你的post等于sale的時候多條件查詢SELECT name,salary FROM employeeWHERE post='teacher' AND salary>10000;
?
關鍵字BETWEEN AND區間查詢:between要和and連用
SELECT * FROM T2 WHERE ID BETWEEN 1 AND 6;
查找你的t2表中的id從1到6的name的值
關鍵字IS NULL(判斷某個字段是否為NULL不能用等號,需要用IS)select * from t2 where id? is not? null;
查找你的t2表內的所有的id不為空的name的值 關鍵字IN集合查詢
select name from t2 where id in(3,5,7);
這個是查找id是3,5,7的name的值
NOT IN 查找:
select name from t2 where id not in (3,5);
查找你的t2表中的id不是3和5的name的值
關鍵字LIKE模糊查詢
模糊匹配有兩個% 和_%是可以匹配任意字符
_只能匹配一個字符
他們兩個都要和like一起使用
%可以放在后面就是以什么什么開頭,放在信息前面面含有什么什么
select * from t2 where name like '飯%';
這個就是尋找 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開頭的僅有兩個英文字母的信息
避免重復DISTINCT
不能有重復的
select distinct name from t2;?
茶查找t2中不重復的name信息
嵌套查找:
select name from t2 where id = (select id? from t1 where name like'%劉') ;
這個
判斷條件是當你的id等于他表中的naem的后面是劉的id然后求出這個id對應的t2的name
分頁操作:limit:
當你的limit后面只有一個數字的時候就代表你要顯示多少 如果后面是兩個數字第一個是代表你要從第幾位開始查找第二代代表你查找的數量
select * from t2 where id limit 3;
這個是指定只查找前3頁
select * from t2 where id limit 3,3;
從id等于3開始查找 往后查找3頁
排序:order by
排序的desc 是從大到小 asc是從小到大
select * from t2? order by? id desc ;
查詢id從大到小的t2表中的信息 一般這個是倒序查找
select * from t2 order by id asc;
根據id從小到大查找t2表中的信息 正序查找
select * from t2 order by id desc limit 3;
求這個是取后3條數據
?
?
?
分組操作:group? by?
什么是分組?為什么要分組?
#1、首先明確一點:分組發生在where之后,即分組是基于where之后得到的記錄而進行的#2、分組指的是:將所有記錄按照某個相同字段進行歸類,比如針對員工信息表的職位分組,或者按照性別進行分組等#3、為何要分組呢?取每個部門的最高工資取每個部門的員工數取男人數和女人數小竅門:‘每’這個字后面的字段,就是我們分組的依據#4、大前提:可以按照任意字段分組,但是分組完畢后,比如group by post,只能查看post字段,如果想查看組內信息,需要借助于聚合函數分組的管理函數:
max()求最大值 min()求最小值 avg()求平均值 sum() 求和 count() 求總個數?
**** 如果對于聚合函數結果進行二次篩選時?必須使用having ****
select count(id),name from t2 where id > 1 group by name having count(id) > 1;這個就是二次篩選需要使用having第一個是求出id大于1 第二次是求出總數大于1的再顯示?
group? by
根據什么什么來分組
select count(id),name from t2 group by name; 這個是根據name來分組運用count來求出id的和?
?
HAVING過濾
HAVING與WHERE不一樣的地方在于#!!!執行優先級從高到低:where > group by > having #1. Where 發生在分組group by之前,因而Where中可以有任意字段,但是絕對不能使用聚合函數。#2. Having發生在分組group by之后,因而Having中可以使用分組的字段,無法直接取到其他字段,可以使用聚合函數
?
?
?
?
匯總:
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開頭的所有(多個字符串)select * from 表 where name like 'ale_' - ale開頭的所有(一個字符)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 - 根據 “列” 從小到大排列select * from 表 order by 列 desc - 根據 “列” 從大到小排列select * from 表 order by 列1 desc,列2 asc - 根據 “列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、連表無對應關系則不顯示select A.num, A.name, B.namefrom A,BWhere A.nid = B.nid無對應關系則不顯示select A.num, A.name, B.namefrom A inner join Bon A.nid = B.nidA表所有顯示,如果B中無對應關系,則值為nullselect A.num, A.name, B.namefrom A left join Bon A.nid = B.nidB表所有顯示,如果B中無對應關系,則值為nullselect A.num, A.name, B.namefrom A right join Bon A.nid = B.nidg、組合組合,自動處理重合select nicknamefrom Aunionselect namefrom B組合,不處理重合select nicknamefrom Aunion allselect namefrom B View Code?
轉載于:https://www.cnblogs.com/zhaoyunlong/p/9169226.html
總結
- 上一篇: 给当兵朋友的祝福语163个
- 下一篇: linux/unix编程手册-16_20