MYSQL語法的詳細總結(附示例)

本篇文章給大家帶來的內容是關于mysql語法的詳細總結(附示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

用戶管理

新建用戶及密碼:foo為名,123為密碼,locahost為固定地址登錄

#?以下為兩種創建方式 CREATE?USER?foo@localhost?IDENTIFIED?BY?‘123’? insert?into?mysql.user(Host,User,Password)?values("localhost","test",password("1234")); #只要更改了用戶及密碼 flush?privileges

設置及更改用戶密碼:

#以下為三種更改方式 SET?PASSWORD?FOR?'username'@'host'?=?PASSWORD('newpassword') #若果是當前登錄用戶 SET?PASSWORD?=?PASSWORD('newpassword') update?mysql.user?set?password=password('newpassword')?where?User='username'?and?Host='host' #只要更改了用戶及密碼 flush?privileges

刪除用戶:

Delete?FROM?user?Where?User='test'?and?Host='localhost'; flush?privileges; #?刪除用戶的數據庫 drop?database?testDB;? #?刪除賬戶及權限 drop?user?用戶名@?localhost;

授權:

GRANT?INSERT,DELETE,UPDATE,SELECT?ON?databasename.tablename?TO?'username' @'host' flush?privileges

說明:?

(1)privileges-用戶的操作權限,如SELECT , INSERT , UPDATE ?
(2)databasename – 數據庫名,tablename-表名,如果要授予該用戶對所有數據庫和表的相應操作權限則可用表示, 如.*
(3)新設置用戶或更改密碼后需用flush privileges刷新MySQL的系統權限相關表,否則會出現拒絕訪問,還有一種方法,就是重新啟動mysql服務器,來使新設置生效

查看權限:

show?grants?for?root@localhost;
  • 去除權限:

#?GRANT的反操作,去除權限 ?REVOKE?SELECT?ON?db_name.*?TO?name;

登錄遠程MySQL(ubuntu): mysql -h ? -P 遠程端口 -u 用戶- p 密碼

#?需遠程ip和端口:10.10.101.111:30061??遠程mysql的用戶及密碼 mysql?-h?10.10.101.111?-P?30061?-u?root?-p?123456

MYSQL數據類型

參考:http://www.php.cn/mysql-tutorials-415213.html

數據庫

  • 查看數據庫:SHOW DATABASES;

  • 創建數據庫: CREATE DATABASES db_name;

  • 使用數據庫: USE db_name;

  • 刪除數據庫: DROP DATABASE db_name;

  • 設置數據庫編碼: set names utf8;

創建表:

CREATE?TABLE?table_name( id?TINYINT?UNSIGNED?NOT?NULL?AUTO_INCREMENT, name?VARCHAR(60)?NOT?NULL, score?TINYINT?UNSIGNED?NOT?NULL?DEFAULT?0,PRIMARY?KEY(id) )ENGINE=InnoDB;//設置表的存儲引擎,一般常用InnoDB和MyISAM;InnoDB可靠,支持事務;MyISAM高效不支持全文檢索
  • 設置表編碼:create table name (…) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  • 復制表:CREATE TABLE tb_name2 SELECT * FROM tb_name

  • 部分復制: CREATE TABLE tb_names SELECT id,name FROM tb_namr;

  • 創建臨時表:CREATE TEMPORARY TABLE tb_name;
    臨時表:客戶端與服務器會話中使用處理特定事務,節省空間、私密性

  • 查看數據庫中可用表: SHOW TABLES;

  • 查看表結構: DESCRIBE tb_name; 或者 SHOW COLUMNS FROM tb_name;

  • 刪除表: DROP ?[ TEMPORARY ] TABLE [ IF EXISTS ] tb_name[ ,tb_name2…….];

DROP?TABLE?IF?EXISTS?`db_school`,`Student`;
  • 表別名: SELECT a.title,a.content,u.username FROM article AS a, user AS u where a.aid=1 and a.uid=u.uid

  • 表重命名:RENAME TABLE name_old TO name_new; 或ALTER TABLE name_old RENAME name_new;

  • 更改表結構:ALTER TABLE tb_name ADD[CHANGE、RENAME、DROP]

ALTER?TABLE?tb_name?ADD?COLUMN?address?varchar(80)?NOT?NULL; ALTER?TABLE?tb_name?DROP?address; ALTER?TABLE?tb_name?CHANGE?score?score?SMALLINT(4)?NOT?NULL;

數據

  • 插入數據:
    INSERT INTO tb_name(id,name,score) VALUES(NULL,’張三’,140),(NULL,’張四’,178),(NULL,’張五’,134);
    注意: 插入多條數據直接后面加上逗號

  • 插入檢索出來的數據:
    INSERT INTO tb_name(name,score) SELECT name score FROM tb_name2;

  • 更新數據
    UPDATE tb_name SET score=180 WHERE id=2;
    UPDATE tablename SET columnName=NewValue[WHERE condition]

  • 刪除數據:
    DELETE FROM tb_name WHERE id=3;

條件控制

where語句:

SELECT?*?FROM?tb_name?WHERE?id=3;

Group by ?
Group by解釋
GROUP BY 與WHERE聯合查詢:
select 列a,聚合函數 from 表名 where 過濾條件 group by 列a having 過濾條件
當結合在一起時,where在前,group by 在后。即先對select xx from xx的記錄集合用where進行篩選,然后再使用group by 對篩選后的結果進行分組 使用having字句對分組后的結果進行篩選

HAVING語句:

SELECT?*?FROM?tb_name?GROUP?BY?score?HAVING?count(*)>2;

Having用法

*以上三者實踐:?

轉載: mysql group by 用法解析(詳細)

相關條件控制符:

 =、>、、IN(1,2,3......)、BETWEEN?a?AND?b、NOT  AND?、OR  Like()用法中??????%??為匹配任意、??_??匹配一個字符(可以是漢字)  IS?NULL?空值檢測?IS?NOT?NULL?  IN???NOT?IN??//?  limit?[offset,]?N?#如果給定兩個參數,第一個參數指定第一個返回記錄行的偏移量,第二個參數指定返回記錄行的最大數目。初始記錄行的偏移量是?0(而不是?1)?:?SELECT?*?FROM?table?LIMIT?5,10;?//?檢索記錄行?6-15
  • 多條件查詢:

SELECT?*?FROM?tb_name? WHERE?id=1003?AND?price
  • 分組查詢:分組查詢可以按照指定的列進行分組
    SELECT COUNT() FROM tb_name GROUP BY score HAVING COUNT()>1 ;
    注意:以上條件用HAVING,GROUP BY 按列排序

  • 排序: ORDER BY column_name DESC|ASC; //按數據的降序和升序排列

?SELECT?*?FROM?t1?WHERE?key_part1=1?ORDER?BY?key_part1?DESC,?key_part2?DESC;

MySQL常見運算符?

正則表達式
SELECT * FROM tb_name WHERE REGEXP ‘^[A-D]’;
解釋:使用“^”匹配名字的開始,找出以A-D為開頭的name
* 正則表達式實踐:
參考博客:MYSQL使用正則表達式過濾數據

子查詢

where型子查詢:(把內層查詢結果當作外層查詢的比較條件)

#不用order?by?來查詢最新的商品 select?goods_id,goods_name?from?goods?where?goods_id?=?(select?max(goods_id)?from?goods); #取出每個欄目下最新的產品(goods_id唯一) select?cat_id,goods_id,goods_name?from?goods?where?goods_id?in(select?max(goods_id)?from?goods?group?by?cat_id);
  • from型子查詢: (把內層的查詢結果供外層再次查詢)

#先查出哪些同學掛科兩門以上 select?name,count(*)?as?gk?from?stu?where?score?=2; #以上查詢結果,我們只要名字就可以了,所以再取一次名字 select?name?from?(select?name,count(*)?as?gk?from?stu?having?gk?>=2)?as?t; #找出這些同學了,那么再計算他們的平均分 select?name,avg(score)?from?stu?where?name?in?(select?name?from?(select?name,count(*)?as?gk?from?stu?having?gk?>=2)?as?t)?group?by?name;
  • exists型子查詢:(把外層查詢結果拿到內層,看內層的查詢是否成立)

#查詢哪些欄目下有商品,欄目表category,商品表goods select?cat_id,cat_name?from?category?where?exists(select?*?from?goods?where?goods.cat_id?=?category.cat_id);

MySQL函數

  • distinct : 去重 ?Select ?player_id,distinct(task_id) from task;
    distinct去除重復樣本(多個字段)

  • select distinct Student.Sno,Sname from Student (另一種方式)

  • 字符串連接——CONCAT()
    SELECT CONCAT(name,”==>”,score) FRON tb_name;

  • 數學函數:
    AVG、SUM、MAX、MIN、COUNT

  • 文本處理函數:
    TRIM、LOCATE、UPPER、LOWER、SUNSTRING

  • 運算符:
    +、-、*、

  • 時間函數:
    DATE()、CURTIME()、DAY()、YEAR()、NOW()…..

JOIN詳解

join 用于多表中字段之間的聯系

...?FROM?table1?INNER|LEFT|RIGHT?JOIN?table2?ON?conditiona

JOIN 按照功能大致分為如下三類:
* INNER JOIN(內連接,或等值連接):取得兩個表中存在連接匹配關系的記錄
* LEFT JOIN(左連接):取得左表(table1)完全記錄,即是右表(table2)并無對應匹配記錄
* RIGHT JOIN(右連接):與 LEFT JOIN 相反,取得右表(table2)完全記錄,即是左表(table1)并無匹配對應記錄

注意:mysql不支持Full join,不過可以通過UNION 關鍵字來合并 LEFT JOIN 與 RIGHT JOIN來模擬FULL join.
具體參考博客Mysql Join語法解析與性能分析

UNION規則

UNION 用于把來自多個 SELECT 語句的結果組合到一個結果集合中:在多個 SELECT 語句中,對應的列應該具有相同的字段屬性

SELECT?column,...?FROM?table1??UNION?[ALL]?SELECT?column,...?FROM?table2?...
  • UNION 與 UNION ALL 的區別: ?
    使用 UNION 時,MySQL 會把結果集中重復的記錄刪掉,而使用 UNION ALL ,MySQL 會把所有的記錄返回,且效率高于 UNION
    具體參考博客MySQL UNION 與 UNION ALL 語法與用法

視圖

視圖是從一個或多個表中導出來的表,是一種虛擬存在的表。數據庫中只存放了視圖的定義,而沒有存放視圖中的數據,這些數據存放在原來的表中。
背景:安全性、查詢性能提高
– 使操作簡單化,可以對經常使用的查詢定義一個視圖,使用戶不必為同樣的查詢操作指定條件
– 增加數據的安全性,通過視圖,用戶只能查詢和修改指定的數據。
– 節省空間,內容是總是一致的話,那么我們不需要維護視圖的內容,維護好真實表的內容,就可以保證視圖的完整性了
– 提高表的邏輯獨立性,視圖可以屏蔽原有表結構變化帶來的影響
工作機制:當調用視圖的時候,才會執行視圖中的sql,進行取數據操作。視圖的內容沒有存儲,而是在視圖被引用的時候才派生出數據。這樣不會占用空間,由于是即時引用,視圖的內容總是與真實表的內容是一致的。更新視圖可以更新真實表。
視圖與數據庫:?

視圖中的數據依賴于原來表中的數據,一旦表中數據發生改變,顯示在視圖中的數據也會發生改變。
視圖的建立和刪除只影響視圖本身,不影響對應的基本表
某些視圖是可更新的。也就是說,可以在諸如UPDATE、DELETE或INSERT等語句中使用它們,以更新基表的內容。對于可更新的視圖,在視圖中的行和基表中的行之間必須具有一對一的關系。還有一些特定的其他結構,這類結構會使得視圖不可更新。更具體地講,如果視圖包含下述結構中的任何一種,那么它就是不可更新的。
視圖中雖然可以更新數據,但是有很多的限制。一般情況下,最好將視圖作為查詢數據的虛擬表,而不要通過視圖更新數據。因為,使用視圖更新數據時,如果沒有全面考慮在視圖中更新數據的限制,就可能會造成數據更新失敗。

索引

  • 10W條數據,檢索nickname=’css’

    • 一般:SELECT * FROM award WHERE nickname = ‘css’ ?:mysql需要掃描全表及掃描10W條數據找這條數據

    • 索引: 在nickname上建立索引,那么mysql只需要掃描一行數據

  • 索引分為單列索引(主鍵索引,唯索引,普通索引)和組合索引

    • 單列索引:一個索引只包含一個列,一個表可以有多個單列索引.

    • 組合索引:一個組合索引包含兩個或兩個以上的列

單列索引:

  • 普通索引,這個是最基本的索引
    ALTER table SC ADD INDEX Sno_Index(Sno); //注意符號,不是單引號
    注意: 字段:CHAR,VARCHAR,類型,索引:length可以小于字段的實際長度,如果是BLOB和TEXT類型就必須指定長度

  • 唯一索引: 唯一索引要求所有的類的值是唯一的,這一點和主鍵索引一樣.但是它允許有空值
    create UNIQUE INDEX sname ON Student(Sname);

  • 主鍵索引,不允許有空值: ?
    規則:int優于varchar,一般在建表的時候創建,最好是與表的其他字段不相關的列或者是業務不相關的列.一般會設為 int 而且是 AUTO_INCREMENT自增類型的

組合索引

一個表中含有多個單列索引不代表是組合索引,通俗一點講 組合索引是:包含多個字段但是只有索引名稱
創建:CREATE INDEX Tno_Tname_index ON Teacher(Tno,Tname);

全文索引

文本字段上(text)如果建立的是普通索引,那么只有對文本的字段內容前面的字符進行索引,其字符大小根據索引建立索引時申明的大小來規定.
建立: ALTER TABLE tablename ADD FULLTEXT(column1, column2)

刪除索引

DORP INDEX IndexName ON TableName

查看索引

show index from tblname;

這塊參考博客細說mysql索引 ,寫的很詳細。
索引原理:索引原理

存儲

一組為了完成特定功能的SQL語句集,經過編譯后存儲在數據庫中。當希望在不同應用程序或者平臺上執行相同函數時,或封裝特定功能時,存儲過程是非常有用的。存儲過程類似一個可編程函數。MySQL 中,單個 Store Procedure(SP) 不是原子操作,要使整個存儲過程成為一個原子操作的辦法是:在存儲過程主體開始部分。
注意:非事務導致存儲過程沒有原子性即過程有的成功有的失敗,變為事務增加原子性,即使執行過程出錯,出錯前的操作將不會真正執行。http://www.cnblogs.com/fnlingnzb-learner/p/6861376.html

優點
1. 執行速度快:存儲過程會預編譯,查詢優化器會對其優化。
2. 可多次調用及修改
3. 功能靈活:可用流程控制語句編寫,完成復雜運算
4. 安全:設置存儲過程權限,保證數據安全
5. 減少流量:調用存儲過程時,網絡只傳輸此調用語句即可

語法

  • 結構:
    CREATE PROCEDURE ?過程名([[IN|OUT|INOUT] 參數名 數據類型[,[IN|OUT|INOUT] 參數名 數據類型…]]) [特性 …] 過程體

DELIMITER?// ??CREATE?PROCEDURE?myproc(OUT?s?int) ????BEGIN ??????SELECT?COUNT(*)?INTO?s?FROM?students; ????END ????//DELIMITER?;

解釋: ?
(1)分隔符:mysql默認“;”,“DELIMITER //”聲明分隔符 ,最后“DELIMITER ;”還原分隔符
(2)參數:輸入、輸出、輸入輸出參數{IN,OUT,INOUT} 具體參考mysql存儲

  • 變量

  1. DECLARE局部變量: DECLARE var_name[,…] type [DEFAULT value] ?
    要給變量提供一個默認值,請包含一個DEFAULT子句。值可以被指定為一個表達式,不需要為一個常數。如果沒有DEFAULT子句,初始值為NULL。 局部變量的作用范圍在它被聲明的BEGIN … END塊內

  2. 變量SET語句:SET var_name = expr [, var_name = expr]
    被參考變量可能是子程序內聲明的變量,或者是全局服務器變量

  3. SELECT … INTO 語句:SELECT col_name[,…] INTO var_name[,…] table_expr
    把選定的列直接存儲到變量

  • 基本常用函數:參考博客:Mysql存儲過程

  • 字符串類:默認第一個字符下標為1,即參數position必須大于等于1

    CHARSET(str)?//返回字串字符集? CONCAT?(string2?[,...?])?//連接字串? INSTR?(string?,substring?)?//返回substring首次在string中出現的位置,不存在返回0? LCASE?(string2?)?//轉換成小寫? LEFT?(string2?,length?)?//從string2中的左邊起取length個字符? LENGTH?(string?)?//string長度? LOAD_FILE?(file_name?)?//從文件讀取內容? LOCATE?(substring?,?string?[,start_position?]?)?同INSTR,但可指定開始位置? LPAD?(string2?,length?,pad?)?//重復用pad加在string開頭,直到字串長度為length? LTRIM?(string2?)?//去除前端空格? REPEAT?(string2?,count?)?//重復count次? REPLACE?(str?,search_str?,replace_str?)?//在str中用replace_str替換search_str? RPAD?(string2?,length?,pad)?//在str后用pad補充,直到長度為length? RTRIM?(string2?)?//去除后端空格? STRCMP?(string1?,string2?)?//逐字符比較兩字串大小,? SUBSTRING?(str?,?position?[,length?])?//從str的position開始,取length個字符,? TRIM([[BOTH|LEADING|TRAILING]?[padding]?FROM]string2)?//去除指定位置的指定字符? UCASE?(string2?)?//轉換成大寫? RIGHT(string2,length)?//取string2最后length個字符? SPACE(count)?//生成count個空格

    數學類?

    ABS?(number2?)?//絕對值? BIN?(decimal_number?)?//十進制轉二進制? CEILING?(number2?)?//向上取整? CONV(number2,from_base,to_base)?//進制轉換? FLOOR?(number2?)?//向下取整? FORMAT?(number,decimal_places?)?//保留小數位數? HEX?(DecimalNumber?)?//轉十六進制? 注:HEX()中可傳入字符串,則返回其ASC-11碼,如HEX('DEF')返回4142143? 也可以傳入十進制整數,返回其十六進制編碼,如HEX(25)返回19? LEAST?(number?,?number2?[,..])?//求最小值? MOD?(numerator?,denominator?)?//求余? POWER?(number?,power?)?//求指數? RAND([seed])?//隨機數? ROUND?(number?[,decimals?])?//四舍五入,decimals為小數位數]? 注:返回類型并非均為整數,如下文:? SIGN?(number2?)?//

    日期時間類?

    ADDTIME?(date2?,time_interval?)?//將time_interval加到date2? CONVERT_TZ?(datetime2?,fromTZ?,toTZ?)?//轉換時區? CURRENT_DATE?(?)?//當前日期? CURRENT_TIME?(?)?//當前時間? CURRENT_TIMESTAMP?(?)?//當前時間戳? DATE?(datetime?)?//返回datetime的日期部分? DATE_ADD?(date2?,?INTERVAL?d_value?d_type?)?//在date2中加上日期或時間? DATE_FORMAT?(datetime?,FormatCodes?)?//使用formatcodes格式顯示datetime? DATE_SUB?(date2?,?INTERVAL?d_value?d_type?)?//在date2上減去一個時間? DATEDIFF?(date1?,date2?)?//兩個日期差? DAY?(date?)?//返回日期的天? DAYNAME?(date?)?//英文星期? DAYOFWEEK?(date?)?//星期(1-7)?,1為星期天? DAYOFYEAR?(date?)?//一年中的第幾天? EXTRACT?(interval_name?FROM?date?)?//從date中提取日期的指定部分? MAKEDATE?(year?,day?)?//給出年及年中的第幾天,生成日期串? MAKETIME?(hour?,minute?,second?)?//生成時間串? MONTHNAME?(date?)?//英文月份名? NOW?(?)?//當前時間? SEC_TO_TIME?(seconds?)?//秒數轉成時間? STR_TO_DATE?(string?,format?)?//字串轉成時間,以format格式顯示? TIMEDIFF?(datetime1?,datetime2?)?//兩個時間差? TIME_TO_SEC?(time?)?//時間轉秒數]? WEEK?(date_time?[,start_of_week?])?//第幾周? YEAR?(datetime?)?//年份? DAYOFMONTH(datetime)?//月的第幾天? HOUR(datetime)?//小時? LAST_DAY(date)?//date的月的最后日期? MICROSECOND(datetime)?//微秒? MONTH(datetime)?//月? MINUTE(datetime)?//分返回符號,正負或0? SQRT(number2)?//開平方

    游標

    定義:游動的標識,相對于普通的一次性查詢給出所有結果;游標的作用就是對數據樣本中一條一條分析處理,像個指針。
    使用:
    1. 聲明: declare 游標名 cursor for select_statement;
    2. 打開: open 游標名
    3. 取值: fetch 游標名 into var1,var2[,…]
    4. 關閉:close 游標名;

    事務

    Mysql事務主要用于處理操作量大,復雜度高的數據。例如:當你刪除一樣東西時,你得把它自身及所依賴的東西都要刪除。所有這些操作行為形成一個事務。
    注意
    – MYSQL中:只有Innodb數據庫引擎的數據庫或表才支持事務
    – 事務處理用來維護數據庫完整性即保證批量SQL語句全部執行或者全部不執行
    – 事務用來管理insert,update,delete語句
    事務滿足4個條件:
    1. 事務的原子性:要么成功,要么失敗
    2. 穩定性: 有非法數據,事務撤回
    3. 隔離性: 事務獨立運行
    4. 可靠性:當發生奔潰,InnoDB數據表驅動會利用日志文件重構修改
    參考博客事務

    導入導出

    • 導出整個數據庫:mysqldump -u 用戶名 -p 數據庫名 > 導出的文件名

    • 導出一個表: mysqldump -u 用戶名 -p 數據庫名 表名> 導出的文件名

    • 導出一個數據結構: mysqldump -u dbuser -p -d –add-drop-table dbname >d:/dbname_db.sql ?(-d 沒有數據 –add-drop-table 在每個create語句之前增加一個drop table)

    • 導入數據庫:

    use?數據庫; source?d:/dbname.sql;

    性能優化

    查詢實例

    數據庫題:學生表,選課表,課程表 設教學數據庫中有三個基本表:
    學生表 Student(Sno,Sname,Age,Sex),其屬性表示學生的學號、姓名、年齡和性別;
    選課表 SC(Sno,Cno,score),其屬性表示學生的學號、所學課程的課程號和成績;
    課程表 Course(Cno,Cname,Tho),其屬性表示課程號、課程名稱和任課教師姓名;
    教師表 Teacher (Tno,Tname),其屬性表示教師號、教師名稱;
    下面的題目都是針對上述三個基本表操作的。
    *導入sql文件:source ?course.sql; ?sql文件編碼格式:無BOM的UTF-8

    drop?database?IF?EXISTS?db_school; CREATE?database?db_school; use?db_school; DROP?TABLE?IF?EXISTS?`db_school`.`Student`;? create?table?Student?? (?? ????Sno?varchar(20),?? ????Sname?varchar(50),? ????Age?smallint, ????Sex?varchar(5), ????primary?key?(Sno)?? )?ENGINE=InnoDB?DEFAULT?CHARSET=utf8;??  DROP?TABLE?IF?EXISTS?`db_school`.`Course`;?? create?table?Course?? (?? ????Cno?varchar(20),?? ????Cname?varchar(50),???? ????Tno?varchar(20),?? ????primary?key?(Cno)?? )?ENGINE=InnoDB?DEFAULT?CHARSET=utf8;?? DROP?TABLE?IF?EXISTS?`db_school`.`SC`;?? create?table?SC?? (?? ????Sno?varchar(20),?? ????Cno?varchar(20),?????? ????score?int,?? ????primary?key?(Sno,Cno)?? )?ENGINE=InnoDB?DEFAULT?CHARSET=utf8;??  DROP?TABLE?IF?EXISTS?`db_school`.`Teacher`;?? create?table?Teacher?? (?? ????Tno?varchar(20),?? ????Tname?varchar(50),???? ????primary?key?(Tno)?? )?ENGINE=InnoDB?DEFAULT?CHARSET=utf8;?? INSERT?INTO?`Student`(Sno,Sname,Age,Sex)?VALUES?('001','陳一',25,'nan');?? INSERT?INTO?`Student`(Sno,Sname,Age,Sex)?VALUES?('002','郭二',20,'nv');?? INSERT?INTO?`Student`(Sno,Sname,Age,Sex)?VALUES?('003','張三',25,'nv');?? INSERT?INTO?`Student`(Sno,Sname,Age,Sex)?VALUES?('004','李四',22,'nan');?? INSERT?INTO?`Student`(Sno,Sname,Age,Sex)?VALUES?('005','王五',23,'nan');?? INSERT?INTO?`Teacher`(Tno,Tname)?VALUES?('001','張老師');?? INSERT?INTO?`Teacher`(Tno,Tname)?VALUES?('002','王老師');?? INSERT?INTO?`Teacher`(Tno,Tname)?VALUES?('003','錢老師');?? INSERT?INTO?`Teacher`(Tno,Tname)?VALUES?('004','劉老師');?? INSERT?INTO?`Teacher`(Tno,Tname)?VALUES?('005','胡老師');?? INSERT?INTO?`Course`(Cno,Cname,Tno)?VALUES?('001','語文','張老師');?? INSERT?INTO?`Course`(Cno,Cname,Tno)?VALUES?('002','數學','王老師');?? INSERT?INTO?`Course`(Cno,Cname,Tno)?VALUES?('003','英語','錢老師');?? INSERT?INTO?`Course`(Cno,Cname,Tno)?VALUES?('004','物理','劉老師');?? INSERT?INTO?`Course`(Cno,Cname,Tno)?VALUES?('005','政治','胡老師');?? INSERT?INTO?`SC`(Sno,Cno,score)?VALUES?('001','001',50);?? INSERT?INTO?`SC`(Sno,Cno,score)?VALUES?('001','002',60);?? INSERT?INTO?`SC`(Sno,Cno,score)?VALUES?('001','003',70);?? INSERT?INTO?`SC`(Sno,Cno,score)?VALUES?('001','004',80);?? INSERT?INTO?`SC`(Sno,Cno,score)?VALUES?('001','005',90);?? INSERT?INTO?`SC`(Sno,Cno,score)?VALUES?('002','001',90);?? INSERT?INTO?`SC`(Sno,Cno,score)?VALUES?('002','002',80);?? INSERT?INTO?`SC`(Sno,Cno,score)?VALUES?('002','003',70);?? INSERT?INTO?`SC`(Sno,Cno,score)?VALUES?('002','004',60);?? INSERT?INTO?`SC`(Sno,Cno,score)?VALUES?('002','005',50);?? INSERT?INTO?`SC`(Sno,Cno,score)?VALUES?('003','001',81);?? INSERT?INTO?`SC`(Sno,Cno,score)?VALUES?('003','002',82);?? INSERT?INTO?`SC`(Sno,Cno,score)?VALUES?('003','003',83);?? INSERT?INTO?`SC`(Sno,Cno,score)?VALUES?('003','004',84);?? INSERT?INTO?`SC`(Sno,Cno,score)?VALUES?('003','005',85);
    • 寫出檢索全是女同學選修的課程的課程號的SQL語句。

    select?Cno??from?Student,SC?where?Student.Sno=SC.Sno?AND?Student.Sex='nv';
    • 寫出下列插入操作的SQL語句:把SC表中每門課程的平均成績插入到另一個已存在的表SC_C(C#,CNAME, AVG_GRADE)中,其中 AVG_GRADE 為每門課程的平均成績。

    #?先創建SC_C表,自行創建insert?into?SC_C?select?SC.Cno,Cname,AVG(score)?AS?Avg_score?FROM?Course,SC?WHERE?Course.Cno=SC.Cno?GROUP?BY?SC.Cno;
    • 試寫出下列刪除操作的SQL語句:從SC表中把王老師的女學生選課元組刪去。

    delete?from?SC?where?Sno?in?(select?Sno?from?Student?where?Sex='nv')?AND?Cno?in?(select?Cno?from?Course?where?Tno='王老師');
    • 查詢“001”課程比“002”課程成績高的所有學生的學號;

    select?a.Sno?from?(select?Sno,score?FROM?SC?where?Cno='001')?AS?a?,(select?Sno,score?FROM?SC?where?Cno='002')?AS??b??WHERE?a.score?>?b.score;//當兩個表存在相同列名時,用tablename.columnname指定列
    • 查詢所有同學的學號、姓名、選課數、總成績;

    select?Student.Sno,Student.Sname,count(SC.Cno),sum(SC.score)?from?Student?left?OUTER?join?SC?on?Student.Sno=SC.Sno?group?by?Student.Sno,Student.Sname;

    ? 版權聲明
    THE END
    喜歡就支持一下吧
    點贊10 分享