日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL服务器学习笔记!(二) ——数据库各项操作

發布時間:2025/4/5 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL服务器学习笔记!(二) ——数据库各项操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://foreveryan.blog.51cto.com/3508502/657640


這是一步步從頭學習MySQL的筆記歷程,本人在學習之前只接觸過少量SQL Server。

第一天歷程:壓榨自己的學習能力極限,每天學習新內容之MySQL服務器!(一)

第三天歷程:壓榨自己的學習能力極限,每天學習新內容之MySQL服務器!(三)

接下來每天都將更新~相信你通過筆記,一定能從零學會MySQL~


廢話不多說,開始今天的學習壓榨~!





昨天學習了SQL的歷史,和MySQL的基本定義,今天繼續,開始學習相關的表的概念。在這之前,先補充一點昨天的東西。

數據庫對象(邏輯視角)

? ? ?表:二維關系 表其實就是由行和列組成的二維關系,(一個基表)

? ? ?索引,index:加速查詢的數據結構,他也需要用到存儲空間。快速找到某些具有特殊特點的指針。索引有索引類型的概念,不同的索引能適用于不同的查詢類型,常用的比如Btree索引……

? ? ?視圖:一個存儲下來的SELECT語句,檢索成表的形式,(一個虛表)

? ? ?觸發器:trigger,讓用戶對數據庫中的表發生數據修改的時候,同時觸發的額外的數據庫的操作。(比如用戶修改記錄的時候,系統會自動觸發將用戶的動作記錄到日志信息)。具體實現什么操作,要管理員去定義。它通常是一個代碼段,屬于SQL變成的范疇。觸發器在記錄日志的時候非常有用,而且是將日志記錄帶某個表中。

? ? ?存儲過程:Storage procedure:一個正常的執行的數據段,需要用CALL來定義,來執行,過程是沒有什么特定的返回值的。尤其是返回特定數據集。基于存儲過程開發的程序可能適用性比較差。

? ? ?存儲函數:Storage function:在select語句中進行使用,可以返回表。他們可以實現代碼重用,極大增加效率、以及增強數據庫的安全程度。他們兩個一般都是放在服務器端的,遠程傳輸的只是CALL或者其他的命令~。

? ? ?事件調度器:event sheduler:主要實現定期任務定期計劃的,相當于Linux的Crontab。它也是一段代碼,屬于開發范疇。包括存儲過程,存儲函數,事件調度器他們都嚴重依賴與RDB編程接口。

? ? ?用戶:屬于數據庫對象。驗證用戶賬號,權限分派。一個用戶登錄系統以后,主要是看你具有哪些訪問權限的。



然后我們開始今天學習的正題:



如何去創建表:

? ? ? 表其實是由行和列組成的,表其實就是數據文件,一個表可以對應在多個文件上。對于MyInnsa這種類型來說,一個表通常對應3個文件。表空間通常是比表大,比數據庫小的物理單位。

? ? ? 創建格式:

CREATE [TEMPORART] TABLE [IF NOT EXISTS] tbl_name (字段create_definition) [字段屬性] [表的選項] [分區選項]


創建表方式1:

? ? ? 最簡單的:CREATE TABLE table_name (…)

? ? ? 每一個表必須屬于一個數據庫,所以創建表的時候必須是在一個數據庫當中創建的。如果你沒有設定默認數據庫的話:必須使用db_name.tab_name來指定數據庫。


創建一個表的多行標準格式:

? ? ? CREATE TABLE employee (

? ? ? ? ? ? ?id INT NOT NULL,

? ? ? ? ? ? ?last_name CHAR(30) NOT NULL,

? ? ? ? ? ? ?first_name CHAR(30) NOT NULL,

? ? ? ? ? ? ?UNIQUE(id),

? ? ? ? ? ? ?INDEX (last_name,first_name)

? ? ? );


創建表的時候可以指定使用什么存儲引擎:

? ? ? ENGINE=engine_name

? ? ? CREATE TABEL users (id INT) ENGINE=InnoDB;

? ? ? ALTER TABLE users ENGINE=MYISAM;

? ? ? 查看當前數據庫使用引擎

? ? ? ? ? ? ?SHOW TABLE STATUS

? ? ? 查看當前表引擎

? ? ? ? ? ? ?SHOW TABLE STATUS LIKE ‘zones’\G


比如: ? ?CREATE TABLE tb1 (

? ? ? ?-> ? ?id tinyint not null auto_increment primary key,

? ? ? ?-> ? ?name varchar(30));

? ? ? ? ? ? ?查看引擎,SHOW TABLE STATUS LIKE ‘tb1’\G

? ? ? ? ? ? ?發現默認是InnoDB

比如: ? ?CREATE TABLE tb1 (

? ? ? ? -> ? ?id tinyint not null auto_increment primary key,

? ? ? ?-> ? ?name varchar(30)) ENGINE=MyISAM;

? ? ? ?則創建了一個以MyISAM為引擎的表。


? ? ? 表選項:table_option:

? ? ? ? ? ? ?常用的選項:

? ? ? ? ? ? ?COLLATE = charset_name:指定專門的排序規則

? ? ? ? ? ? ?AUTO_INCREMENT = value:指定自動增長的起始值

? ? ? ? ? ? ?MAX_ROWS = value:最大行數

? ? ? ? ? ? ?MIN_ROWS = value:最小行數


創建表方法2:從另一個表中選擇數據并創建新表

? ? ? CREATE TABLE [IF NOT EXISTS] tbl_name

? ? ? -> ? ?[(create_definition,…)]

? ? ? -> ? ?[table_options]

? ? ? -> ? ?[partition_options]

? ? ? -> ? ?select_statement


? ? ? select_statement:我們完全可以從一個表中選擇一些數據創建出另一個表。

? ? ? 比如:我想從role表中選擇出里面包含user這個關鍵字的行并創建成新行:

? ? ? CREATE TBALE role2 SELECT * FROM role WHERE name LIKE ‘%user’;


創建表方法3:以某個表為標準創建新表,只復制結構,不復制數據

? ? ? CREATE TABLE [IF NOT EXISTS] tbl_name

? ? ? ? ? ? ?[LIKE old_tbbl_name]

CREATE TABLE role3 LIKE role;

創建表方法4:創建表的同時創建索引:

? ? ? 索引的問題非常關鍵,所以一定要會在表創建的時候添加索引。

? ? ? ? ? ? ?CONSTRAINT UNIQUE唯一鍵索引

? ? ? ? ? ? ?SPATIAL空間索引

? ? ? ? ? ? ?FULLTEXT全文索引

? ? ? ? ? ? ?CHECK檢查性約束

? ? ? ? ? ? ?FOREIGN KEY外鍵索引

? ? ? 索引類型:

? ? ? ? ? ? ?BTREE:平衡樹索引。

? ? ? ? ? ? ?HASH:索引

? ? ? 使用 USE BTREE|HASH 來指定索引類型

格式:

比如:創建一個users 有id,name,age,gender,score,并且經常性的會以成績為區間進行檢查,我們期望在score上進行索引

? ? ? CREATE TABLE users (

-> ? ?ID INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

-> ? ?Name VARCHAR(30) NOT NULL,

-> ? ?Age TINYINT ?UNSIGNED ? ?NOT NULL,

-> ? ?Gender ENUM(‘F’,’M’) NOT NULL DEFAULT ‘M’,

-> ? ?Score FLOAT,

-> ? ?INDEX index_score(score)); ##指定索引,默認索引類型(BTREE類型)

-> ? ?UNIQUE(Name)); ?##要求Name必須唯一


查看當前表的索引:

? ? ? ?SHOW INDEXES FROM tbl_name

? ? ? 直接在創建列的時候就加入索引:

? ? ? ?CREATE TABLE users (

-> ? ?ID INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

-> ? ?Name VARCHAR(30) UNIQUE NOT NULL, #直接指定這個字段唯一。

-> ? ?Age TINYINT ?UNSIGNED ? ?NOT NULL,

-> ? ?Gender ENUM(‘F’,’M’) NOT NULL DEFAULT ‘M’,

-> ? ?Score FLOAT,

-> ? ?INDEX index_score(score)); ##指定索引,默認索引類型(BTREE類型)


如何給自己的數據庫設定默認引擎

方法1:

? ? ? 啟動Mysql的時候,指定引擎

? ? ? ? ? ? ?--default-storage-engine = engine_name

? ? ? 或者寫入配置文件。my.cnf

方法2:

? ? ? 啟動Mysql之后,不想重啟系統的情況下,設定全局變量中storage_engine

? ? ? ? ? ? ?SET GLOBAL storage_engine = engine_name

? ? ? 也可以設置會話級別的變量:

? ? ? ? ? ? ?SET SESSION storage_engine = engin_name;

? ? ? ? ? ? ?SET storage_engine = engine_name;



如何去表中查詢數據:SELECT命令

? ? ? 最簡單的使用方法:

SELECT column1, col2 FROM table_name

? ? ? ? ? ? ?SELECT 字段 FROM 表:顯示表中的選定字段

? ? ? 其中字段名可以使用“*”號來做通配,表示查詢表中的所有字段,并顯示字段中的值。只顯示特定字段的方式叫做投影


注意:字段的次序特別關鍵,你給定的次序就是到時候顯示的次序,字段名并不區分大小寫。

? ? ? ? ? ? ?SELECT name,rid FROM role

? ? ? SELECT rid,name FORM role

的結果是不一樣的。


在查詢的時候顯示某些符合特定條件的行。

WHERE 字句

? ? ? ?WHERE可以設定某個字段做邏輯比較(LIKE,BETWEEN AND)

? ? ? ?WHERE column …. ?

? ? ? ?指定某個字段符合什么樣的條件:

? ? ? ?>

? ? ? ?< ,

? ? ? ?= ,

? ? ? ?LIKE ,

? ? ? ?BETWEEN …AND… ,

? ? ? ?IN,

? ? ? ?IS NULL,

? ? ? ?IS NOT NULL,

? ? ? ?REGEXP(正則表達式)或者寫成 RLIKE

? ? ? 1.比如查看rid大于等于2的role表中的行

? ? ? ? ? ? ? SELECT * FORM role WHERE rid >= 2;

? ? ? 2.所有weight不等于0的行

? ? ? ? ? ? ? SELECT * FROM role WHERE weight <> 0;

? ? ? ? ? ? ? SELECT * FROM role WHERE weight != 0;

3.使用LIKE的時候,的通配符

? ? ? ? ? ? ?%:通配所有字符

? ? ? ? ? ? ?_:通配任意單個字符

? ? ? ? ? ? ?查詢所有中間包含了user的

? ? ? ? ? ? ?SELECT * FROM role WHERE name LIKE “%user%”;

4.同時使用多個條件取他們交集。

? ? ? ? ? ? ?name像user 并且weight不等于0的

? ? ? ? ? ? ?SELECT * FROM role WHERE name LIKE ‘%user%’ and weight <> 0;

? ? ? ? ? ? ?指定rid大于1且小于2的

? ? ? ? ? ? ?SELECT * FROM role WHERE rid BETWEEN 1 AND 2;

? ? ? 5.IN,表示在某個特定集合之中出現過:

? ? ? ? ? ? ?rid當中有1或者為2或者4或者5

? ? ? ? ? ? ?SELECT * FROM role WHERE rid IN (1,2,4,5)


? ? ? ? ? ? ?WHERE還可以使用算數運算比如:

? ? ? ? ? ? ?+ , - , * , /


? ? ? 6.查看role表中rid值加1大于3的

? ? ? ? ? ? ? SELECT * FROM role WHERE rid + 1 > 3


? ? ? ? ? ? ? WHERE還可以使用邏輯操作符:

? ? ? ? ? ? ? AND(&&), OR(||) , NOT(!)


? ? ? 所以當SELECT和WHERE字句同時使用的時候,就顯示了一片內容。



當過濾結果之后,我們想對結果進行排序的方式:

ORDER BY clause

? ? ? ? ? ? ?ASC(升序排序,默認)

? ? ? ? ? ? ?DESC(降序排序)

? ? ? 1.以rid為基準按升序排序

? ? ? ? ? ? ?SET * FROM role ORDER BY rid

? ? ? 2.按降序排序

? ? ? ? ? ? ?SET * FROM role ORDER BY rid DESC;


檢索的結果非常多,只想看特定的行:

LIMIT num

? ? ? 1.只看前2兩行

? ? ? ? ? ? ?SELECT * FROM role LIMIT 2;

? ? ? 2.跳過前2行之后,顯示跳過之后的1行

? ? ? ? ? ? ?SELECT * FROM role LIMIT 2,1;

? ? ? 3.只顯示一個zone字段的前100行

? ? ? ? ? ? ?SELECT zone FROM zones LIMIT 100;


distinct:消除重復的行

? ? ? ? 先消除所有的重復的行,再顯示前100

? ? ? ? ? ? ? ? ?SELECT DISTINCT zone FROM dnsrecords LIMIT 100;

? ? ? ? 先顯示前100,再消去重復的行。【11:04】

? ? ? ? ? ? ? ? ?CREATE TABLE test SELECT DISTINCT zone FROM dnsrecords

? ? ? ? ? ? ? ? ?SELECT DISTINCT * FROM test


GROUP BY:實現以某個字段為標準,以相同的字段為標準,對其進行分組

? ? ? 分組的時候可以使用聚合函數

? ? ? CONUT(*):表示做計數的,對應有多少行并計算行數

? ? ? 按照域名進行分組,并使用COUNT(*)函數來進行計數

? ? ? ? ? ? SELECT zone, COUNT(*) FROM mytb GROUP BY zone

? ? ? 對于GROUP BY的結果,是不能使用WHERE字句的,所以我們使用另一個字句:HAVING字句


AS:修改顯示的結果的值的名字

? ? ? 修改并不對表做修改,僅僅只對顯示做修改

? ? ? 表中的字段名和顯示的不一樣

? ? ? ? ? ? ?SELECT zone AS domain FROM mytb

? ? ? 這樣我們就可以把剛才GROUP BY的顯示成numrecords

? ? ? ? ? ? ?SELECT zone, COUNT(*) AS numrecords FROM mytb GROUP BY zone


HAVING字句:對結果做過濾

? ? ? HAVING xxx

? ? ? 對檢索出來的zong的值將其分組,并統計數目并將統計數目的值的名字修改為numrecords并對這個值進行過濾查看所有大于等于10的結果:

? ? ? ? ? ? ? SELECT zone, COUNT(*) AS numrecords FROM mytb GROUP BY zone HAVING numrecords >= 10;


在Mysql中定義變量:

? ? ? SET @num=10

? ? ? 這樣一來,我們的剛才的那條定義就可以改為變量:

SELECT zone, COUNT(*) AS numrecords FROM mytb GROUP BY zone HAVING numrecords >=@num;



mysql練習1:

1、創建表mytb,比照mytb.jpg圖片中的字段的定義;

答案:

mysql> ?CREATE TABLE mytb (

-> ? ?ID BIGINT(20) NOT NULL DEFAULT '0',

-> ? ?UserID BIGINT(20) NOT NULL,

-> ? ?ZoneID BIGINT(20) NOT NULL,

-> ? ?Zone VARCHAR(255) NOT NULL,

-> ? ?Host VARCHAR(255) NOT NULL,

-> ? ?Type ENUM('A','SOA','NS','MX','CNAME','PTR','TXT','AAAA') NOT NULL,

-> ? ?Mx_priority INT(10),

-> ? ?Data VARCHAR(255) NOT NULL,

-> ? ?TTL INT(10) NOT NULL DEFAULT '600',

-> ? ?View VARCHAR(20) NOT NULL DEFAULT 'DEF',

-> ? ?Active ENUM('Y','N') NOT NULL DEFAULT 'Y',

-> ? ?DomainLevel INT(11) NOT NULL DEFAULT '1',

-> ? ?Standby VARCHAR(255) NOT NULL,

-> ? ?CheckHostID BIGINT(20) NOT NULL DEFAULT '0',

-> ? ?LsFensheng TINYINT(1) NOT NULL DEFAULT '0',

-> ? ?);


2、將table.sql中的數據導入至此表;使用如下命令(假設新建的表名為mytb,原數據文件為/tmp/table.sql):

? ? ? mysql> LOAD DATA INFILE '/tmp/table.sql' INTO TABLE mytb;


練習2:

1、顯示mytb表中Host為www的所有行;

mysql> SELECT * FROM mytb WHERE Host LIKE "www";

2、顯示mytb表中Zone、Host、Type和Data字段;

mysql> SELECT Zone,Host,Type,Data FROM mytb;

3、將第2題中的Data字段顯示時的Data改為顯示Value;

mysql> SELECT Zone,Host,Type,Data AS Value FROM mytb;

4、顯示mytb表中Host為ftp的所有行的Zone、Host、Type和Data字段;

mysql> SELECT Zone,Host,Type,Data FROM mytb WHERE Host LIKE "ftp";

5、顯示mytb表中Zone為以.org結尾或以.net結尾的所有行;

mysql> SELECT * FROM mytb WHERE Zone LIKE "%.org" || Zone LIKE "%.net";

6、顯示mytb表中Host字段的值為mail,@,*或oa的所有行;

mysql> SELECT * FROM mytb WHERE Host IN ('mail','@','*','oa');

7、以Host字段為準對mytb表中的數據進行分組,并對分組后的結果進行行數統計;而后顯示統計結果中行數大于10的組;

mysql> SELECT *,COUNT(*) AS Times FROM mytb GROUP BY Host HAVING Times > 10;

8、顯示mytb表中Mx_priority不為空的行,并對其結果以zone字段為準進行降序排序;

mysql> SELECT * FROM mytb WHERE Mx_priority IS NOT NULL ORDER BY Zone DESC;

9、將第1題中的結果限定為只顯示第50行后100行;

mysql> SELECT * FROM mytb WHERE Host LIKE "www" LIMIT 50,100;

10、顯示mytb表中存在的所有域名;

mysql> SELECT DISTINCT Zone FROM mytb;

11、顯示mytb表中存在的所有記錄類型; ?

mysql> SELECT DISTINCT View FROM mytb;




OK,經過中午的吃飯休息~我們下午繼續開始!



如何去修改表結構:ALTER TABLE

格式:ALTER TABLE tbl_name

1.添加一個新字段:

ADD col_name col_def

ADD [默認情況下如果不說明添加的是什么,則為字段] 字段名 字段定義


我們先創建一個武俠表,方便之后的操作

? ? ? ? ? ? ?CREATE DATABASE wuxia;

? ? ? ? ? ? ?CREATE TABLE knight (

-> ? ?UID TINYINT UNSIGNED AUTO_INCREMENT NOT NULL UNIQUE,

-> ? ?Name VARCHAR(10) NOT NULL,

-> ? ?Alias VARCHAR(30),

-> ? ?Age TINYINT,

-> ? ?Gender ENUM(‘F’,’M’),

-> ? ?CouseID TINYINT

-> ? ?);

? ? ? 使用DESC knight來看這個表



添加一個字段:我們武俠的師傅,這個師傅的值定義為ID號,因為他的師傅肯定會在武俠這個表中出現

? ? ? ALTER TABLE knight ADD Master TINYINT UNSIGNED;

? ? ? 則這個叫Master的字段就添加到了最后一個字段。


AFTER col_name:在現有的某個字段的后面添加

FIRST:添加為第一個字段


2.修改一個字段:

? ? ? CHANGE old_col_name new_col_name column_definition:

? ? ? 要指定原有名字,新名字不帶改字段而且改名字

? ? ? 也可以指定FIRST AFTER col_name

? ? ? MODIFY col_name column_definition

? ? ? 只改變某一個字段的定義,或者位置

? ? ? 后面可以跟FIRST AFTER col_name


比如修改剛才創建表中的Gender讓其具有非空并且默認為M的屬性:

? ? ? ALTER TABLE knight MODIFY Gender ENUM(‘F’,’M’) NOT NULL DEFAULT ‘M’;

? ? ? 比如修改Master的名字為Tutor,并將字段放在Age之后

? ? ? ALTER TABLE knight CHANGE Master Tutor TINYINT UNSIGNED AFTER Age;


3.給表添加索引

格式:ADD (INDEX|KEY) [index_name] [index_type] (index_col_name……);

? ? ? 比如給我們剛才的knight表添加索引為Age

? ? ? ? ? ? ALTER TABLE knight ADD INDEX (Age)


4.刪除的方法

? ? ? DROP col_name :刪除字段

? ? ? DROP PRIMARY KEY:刪除主鍵

? ? ? DROP (INDEX|KEY) index_name:刪除索引


5.給表重命名:

? ? ? RENAME TO new_col_name

? ? ? 比如修改knight為knights

? ? ? ? ? ? ? ALTER TABLE knight RENAME TO knights;


不使用ALTER命令對其進行重命名

? ? ? RENAME TABLE

? ? ? RENAME TABLE knights TO knight

? ? ? 盡量不要重名,重命名的機制是先將源表復制,然后刪除原表,并將原表放入新名字表中。



如何刪除表

DROP TABLE [IF EXISTS] table_name



如何向表中插入數據(DML):INSERT INTO

1:單一的插入方式

? ? ? 格式:INSERT INTO table_name (col1,col2) VALUES (val1,val2)

? ? ? INSERT INTO 表名 (表字段名1,字段名2) 值 (字段值1,字段值2)

? ? ? 比如:往表中插入用戶名:楊過

? ? ? INSERT INTO knight (Name) VALUE (‘Yang Guo’);

? ? ? 我們查看一下:SELECT * FROM knight;

? ? ? 如果我們插入一個東西之后,要求必須不為空而且沒有默認的字段沒有定義的話,它會報錯:

? ? ? 比如:

? ? ? ? ? ?INSERT INTO knight (Gender) VALUE (‘F’)

? ? ? 所以我們先給他刪掉:

? ? ? ? ? ?DELETE FROM knight WHERE Gender=’F’;


2.SET 直接設置

? ? ? INSERT INTO table_name SET col1=VAR1 col2=VAR2

? ? ? INSERT INTO knight SET Name=’Wei Xiaobao’


我們發現,當我們刪除過一個之后,下次再加入的數據將不會從刪除的那個ID的號開始,而是從那個ID之后的號開始。

? ? ? 這時候我們就需要 LAST_INSERT_ID();這個內置函數,用于記錄上次我們插入的新行的ID是幾。

? ? ? SELECT LAST_INSERT_ID();來顯示


所以我們設定新值從來幾來默認。

? ? ? ? ? ? ?ALTER TABLE knight AUTO_INCREMENT=2;

? ? ? 此時:

? ? ? ? ? ? ?INSERT INTO knight SET Name=’Wei Xiaobao’;


3.一次性不用指定字段,按照字段的排序,直接插入值

? ? ? 比如:

? ? ? INSERT INTO knight VALUE(3,’Hong Qigong’,’Jiuzhishengai’,67,NULL,’M’,NULL);


4.一次插入多行:

? ? ? INSERT INTO knight (Name) VALUES (‘Qiao Feng’),(‘Duan Yu’),(‘Chen Jinnan’);

? ? ? 這樣則實現了一次性插入Name為A,B,C的三行。


5.REPLACE命令插入數據。

? ? ? 在數據進行插入的時候,只要發現數據一樣,可以將原有數據替換的。而使用的方法,和INSERT一樣



如何修改數據:UPDATE

? ? ? 格式:UPDATE table_name SET col1=val1,…… [WHERE clause] LINIT n


? ? ? 一般來講,UPDATE一定要加上WHERE字句,如果不加的話,則是設定表中每一行的那個字段全部修改。

? ? ? UPDATE knight SET Age=21;

? ? ? 所以,我們修改的時候要這樣修改:給UID為2的人將年齡更改為25

? ? ? UPDATE knight SET Age=25 WHERE UID=2;

LIMIT n:只修改前幾行

? ? ? UPDATE knight SET Age=19 LIMIT 2;

? ? ? 只修改前2行


如何刪除數據:DELETE

格式:DELETE FROM table [WHERE clause];

? ? ? 刪除數據就直接刪除了,所以需要指定WHERE字句。不指定條件的話,那整個數據就沒有了

? ? ?比如:刪除knight表中UID=5的行

? ? ? ? ? ?DELETE FROM knight WHERE UID=5


直接清空所有數據并將ID號設為最初的計數:

TRUNCATE TABLE table_name



如何多表查詢

? ? ? 多表查詢的原理:join,連接,基于某種方式,先將多張表組合連接起來,然后再讓連接后的表,去響應我們的查詢條件

? ? ? 我們先定義兩個表,他們的列名及屬性分別是:


表中的內容則為:



1.交叉連接:相當于笛卡爾乘積,A表的每一行,分別給B表的每一行做連接。所以當A表10行,B表20行的時候,連接起來一種200行。 ?

? ? ? SELECT * FROM knight,juexue;


2.內連接:也叫做對稱連接,必須要基于某個等值條件,在A表中和B表中都出現的并且值相等的。才將其連接,并只顯示其擁有相同值的。

? ? ? 2.1.我們以knight表和juexue表中讓CouseID以及CID進行對應,并顯示所有符合條件的。

? ? ? ?SELECT * FROM knight,juexue WHERE knight.CouseID = juexue.CID;


? ? ? 2.2.當我們需要只顯示兩個表中的不同的列的時候,則詳細制定顯示內容,并將表合并并取出對稱連接中能夠匹配的值,進行查找

? ? ? SELECT Name,Cname FROM knight,juexue WHERE knight.CouseID = juexue.CID;


? ? ? 2.3.當我們只需要顯示武功的創始人對應的武俠中的名字時使用:

? ? ? SELECT Cname, Name AS Author FROM juexue,knight WHERE juexue.Author = knight.UID;

其實我們可以給表取別名的:

? ? ?SELECT Cname, Name AS Author FROM juexue AS j,knight AS k WHERE j.Author = k.UID;


? ? ? 當我們定義顯示表中字段的時候,如果兩個表的字段名相同,則必須在字段前加表名,比如

? ? ? SELECT juexue.Cname, knight.Name AS Author FROM juexue,knight WHERE juexue.Author = knight.UID;


3.外連接:

? ? ? ?3.1左外連接:LEFT JOIN … ON:左表中有的值但是右表中沒有,能顯示,但是定義為空

? ? ? ?SELECT k.Name,j.Cname FROM knight AS k LEFT JOIN juexue AS j ON k.CouseID = j.CID;


3.2右外連接:RIGHT JOIN … ON:左表中沒有但是右表中有,則能夠顯示右表中的每一項,左表中沒有的則顯示為NULL

? ? ? SELECT j.Cname,k.Name FROM knight AS k RIGHT JOIN juexue AS j ON j.Author = k.UID;


3.3全外連接:FULL JOIN … ON:不論左表和右表是否有對應,都顯示,有對應的則顯示其對應,如果沒有對應則顯示為NULL。

? ? ? 好吧,MySQL其實不支持全外連接,但是SQL Server是支持的,在這里僅僅只是提一下。


4.自連接:由于自己的表中出現了需要去查找自己表中其他人的定義,所以當讀取這個列的時候,就需要將其轉換成自己表中的其他的對應的項,這就是自連接。

? ? ? 比如我們去定義knight表中的人對應的師傅,將其師傅的名字對應其人物的編號:

? ? ? ? ? ?SELECT k1.Name,k2.Name AS Tutor FROM knight AS k1, knight AS k2 WHERE k1.Tutor = k2.UID

? ? ?則符合條件的只有一個,楊過的師傅是小龍女。



5.UNION聯合(Mysql特有的支持的連接):可以實現將兩張表的查詢結果合成一個。而且這些結果可以完全來自兩張不同的表。

? ? ? 我們單獨的去分別查看兩張表的內容:

? ? ? SELECT UID AS ID, Name AS NAME FROM knight;

? ? ? SELECT CID AS ID, Cname AS NAME FROM juexue;

我們可以看出這兩個命令顯示了不同的表的不同的內容,于是我們可以用UNION簡單的將其其組合起來:

? ? ? ? ? ? ?SELECT UID AS ID, Name AS NAME FROM knight

? ? ?-> ? ?UNION

? ? ?-> ? ?SELECT CID AS ID, Cname AS NAME FROM juexue;





2011.09.02,18:35,更新下午學習筆記。

從學習Mysql開始,兩天筆記量:



關于MySQL的學習,沒有結束,明天繼續!壓榨自己的學習能力!超越自己的學習極限。

本文出自 “For The Dream” 博客,請務必保留此出處http://foreveryan.blog.51cto.com/3508502/657640


轉載于:https://blog.51cto.com/feilong0663/1384303

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的MySQL服务器学习笔记!(二) ——数据库各项操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。