什么是MySQL數(shù)據(jù)庫?看這一篇干貨文章就夠了!
前言
為啥學(xué)習(xí)MySQL呢?因?yàn)镸ySQL是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,在web應(yīng)用方面,MySQL是最好的軟件。MySQL所使用的sql語言是用于訪問數(shù)據(jù)庫的最常用標(biāo)準(zhǔn)化語言。
這篇文章,我會(huì)為大家詳細(xì)梳理MySQL數(shù)據(jù)庫的方方面面。
1.MySQL的入門
什么是數(shù)據(jù)庫呢?
- 數(shù)據(jù)庫,它是按照 數(shù)據(jù)結(jié)構(gòu)來 組織,存儲(chǔ)和管理數(shù)據(jù)的倉庫。
- 數(shù)據(jù)庫管理系統(tǒng), 指數(shù)據(jù)庫系統(tǒng)中對數(shù)據(jù)進(jìn)行管理的軟件系統(tǒng)。
讓我來整理一張思維導(dǎo)圖:
細(xì)節(jié)掌握:
- 安裝配置,常用命令,操作數(shù)據(jù)庫;
- 整型與浮點(diǎn)型,日期時(shí)間型與字符型;
- 創(chuàng)建與查看數(shù)據(jù)庫表,修改數(shù)據(jù)庫表,刪除數(shù)據(jù)庫表;
- 非空約束,主鍵約束,唯一約束,默認(rèn)約束,外鍵約束;
- 管理工具:MySQL Workbench,SQLyog;
- 單表數(shù)據(jù)記錄的插入與自動(dòng)編號(hào),單表數(shù)據(jù)記錄的更新,單表數(shù)據(jù)記錄的刪除,單表數(shù)據(jù)記錄的查詢,對查詢結(jié)果進(jìn)行分組,對查詢結(jié)果進(jìn)行排序,通過limit語句限制查詢記錄的數(shù)量;
- mysql的運(yùn)算符,數(shù)值函數(shù),字符函數(shù),日期時(shí)間函數(shù),聚合函數(shù),信息函數(shù)與加密函數(shù);
- 使用比較運(yùn)算符引發(fā)的子查詢,插入記錄時(shí)使用的子查詢
- 多表連接,內(nèi)連接,外連接,自連接,多表更新,多表刪除
- 創(chuàng)建,使用自定義函數(shù)
- 創(chuàng)建存儲(chǔ)過程,使用存儲(chǔ)過程
mysql官網(wǎng):
安裝包下載:(安裝操作)
點(diǎn)擊安裝:
產(chǎn)品配置的操作:
打開服務(wù)框用win+r,輸入services.msc
2. mysql目錄結(jié)構(gòu)
- bin目錄:用于存儲(chǔ)一些可執(zhí)行文件
- include目錄:用于存儲(chǔ)包含的一些頭文件
- lib目錄:用于存儲(chǔ)一些庫文件
- share目錄:用于存儲(chǔ)錯(cuò)誤信息,字符集文件等
- data目錄:用于放置一些日志文件以及數(shù)據(jù)庫
- my.ini文件:數(shù)據(jù)庫的配置文件
啟動(dòng)與停止:
mysql參數(shù):
參數(shù) | 描述 |
---|---|
-u | 用戶名 |
-p | 密碼 |
-V | 輸出版本信息并且退出 |
-h | 主機(jī)地址 |
3.常用命令
修改用戶密碼的命令:
mysqladmin?命令用于修改用戶密碼 mysqladmin 命令格式: mysqladmin?-u用戶名?-p舊密碼?password新密碼
顯示數(shù)據(jù)庫的命令
show?databases;
使用數(shù)據(jù)庫的命令
use?數(shù)據(jù)庫的名稱
顯示當(dāng)前連接的信息
- 顯示當(dāng)前 連接的數(shù)據(jù)庫:select database();
- 顯示當(dāng)前 服務(wù)器版本:select version();
- 顯示當(dāng)前 日期時(shí)間:select now();
- 顯示當(dāng)前 用戶:select user();
4.操作數(shù)據(jù)庫(創(chuàng)建,修改,刪除)
創(chuàng)建數(shù)據(jù)庫SQL:
create?database?[if not?exists]?db_name [default]?character set [=]?charset_name
create?database?database_name;
修改數(shù)據(jù)庫的語法格式:
alter?database?db_name?
[default]?character set [=]?charset_name
刪除數(shù)據(jù)庫語法格式:
drop?database?[if exitsts]?db_name;
5.數(shù)據(jù)庫-數(shù)據(jù)類型
了解數(shù)據(jù)類型:(借助圖書管理系統(tǒng))
圖書類別表:
類別編號(hào)(category_id)?類別名稱(category)?父類別(parent_id) 1?計(jì)算機(jī)?0 2?醫(yī)學(xué)?0
圖書信息表:
圖書編號(hào)(book_id)?類別編號(hào)(book_category_id)?書名(book_name)?作者(author)?價(jià)格(price)?出版社(press)?出版時(shí)間(pubdate)?庫存(store)
借閱信息表:
圖書編號(hào)(book_id)?身份證號(hào)(card_id)?借出日期(borrow_date)?歸還日期(return_date)?是否歸還(status)
讀者信息表
身份證號(hào)(card_id)?姓名(name)?性別(sex)?年齡(age)?聯(lián)系電話(tel)?余額(balance)
數(shù)據(jù)類型:
整型:TINYINT-1字節(jié)SMALLINT-2字節(jié)MEDIUMINT-3字節(jié)INT-4字節(jié)BIGINT-8字節(jié)
浮點(diǎn)數(shù)類型和定點(diǎn)數(shù)類型:
float-4個(gè)字節(jié)
double-8個(gè)字節(jié)
decimal
日期時(shí)間類型:
字符型:
6.數(shù)據(jù)庫表結(jié)構(gòu)的操作
- 創(chuàng)建和查看數(shù)據(jù)表
創(chuàng)建數(shù)據(jù)表:create?table create?table?<表名> (? ?列名1?數(shù)據(jù)類型[列級(jí)別約束條件][默認(rèn)值], ?列名2?數(shù)據(jù)類型[列級(jí)別約束條件][默認(rèn)值], ?... ?[表級(jí)別約束條件] );
- 查看數(shù)據(jù)庫表:
show?tables?[from?db_name];
- 查看數(shù)據(jù)表基本結(jié)構(gòu):
show?columns?from?tbl_name; describe?<表名>?/DESC<表名>
show?create?table?tbl_name;
- 修改數(shù)據(jù)庫表
添加列:
alter?table?<表名> ?add?<新列名>?<數(shù)據(jù)類型> ??[?約束條件?]?[first?|?after?已存在列名];
修改列名:
alter?table?<表名> ?change?<舊列名>?<新列名>?<新數(shù)據(jù)類型>;
修改列的數(shù)據(jù)類型:
alter?table?<表名>?MODIFY?<列名>?<數(shù)據(jù)類型>
修改列的排列位置
alter?table<表名> MODIFY?<列1>?<數(shù)據(jù)類型>?FIRST|AFTER<列2>
刪除列:
alter?table?<表名>?drop?<列名>;
修改表名:
alter?table?<舊表名>?RENAME?[TO]?<新表名>;
- 刪除數(shù)據(jù)庫表
drop?table?[if exists]?表1,表2,...表n;
查看表分區(qū)
創(chuàng)建表分區(qū):使用partition by類型(字段)
使用values less than操作符定義分區(qū)
create?table?bookinfo( ?book_id?int, ?book_name?varchar(20) ) partition?by?range(book_id)( ?partition?p1?values?less?than(20101010), ?partition?p3?values?less?than?MAXVALUE );
7.子查詢
select?price?from?bookinfo where book_id?=?20101010; select?*?from?readerinfo; update?readerinfo set balance?=?balance-(select?price?from?bookinfo where book_id?=?20101010)?*?0.05 where card_id?= '2323232342sxxxxx';
什么是子查詢呢?
它是指嵌套在其他sql語句內(nèi)的查詢語句。
select?*?from?table1 where col1?=?(select?col2?from?table2);
insert?into?bookcategory(category,parent_id)values('x',2),('y',2); insert?into?bookinfo(book_id,book_category_id,book_name,author,price,press,pubdate,store) values (45245244,?6, 'x', '1,2,3?等',?115, '出版社', '2020-06-01',10), (45342545,?6, 'y', '1,?2',27.8, '出版社', '2020-07-01',?5); update?readerinfo set balance?=?500 where card_id?= '683246'; insert?into?borrowinfo(book_id,card_id,borrow_date,return_date,status) values (35452455,'5724154','2020-10-10','2020-11-10','否');
查詢借閱信息表, 顯示借 xx這本書的借閱記錄
select?*?from?borrowinfo where book_id?=?(select?book_id?from?bookinfo where book_name?= 'xx');
查詢圖書信息表, 顯示圖書價(jià)格小于圖書平均價(jià)格的所有圖書信息
select?*?from?bookinfo where price?< (select round(avg(price),2) from bookinfo);
查詢圖書信息表,顯示圖書類別不是’數(shù)據(jù)庫’的所有圖書信息
select?*?from?bookinfo where book_category_id<>(select?category_id?from?bookcategory where category?= '數(shù)據(jù)庫');
查詢圖書信息表,顯示圖書類別為’計(jì)算機(jī)’的所有圖書信息
select?*?from?bookcategory; select?*?from?bookinfo where book_category_id?=?ANY(select?category_id?from?bookcategory where parent_id?=?1); select?*?from?bookinfo where price?>?ANY?(select?price?from?bookinfo where book_category_id?=4);?? select?*?from?bookinfo where price?>?ALL?(select?price?from?bookinfo where book_category_id?=4);
查詢圖書信息表,顯示圖書類別為’2’的所有圖書信息
in 后面的子查詢返回一個(gè)數(shù)據(jù)列,等于數(shù)據(jù)列里的任意一個(gè)值都是滿足條件的 select?*?from?bookinfo where book_category_id in (select?category_id?from?bookcategory where parent_id?=?2); select?*?from?bookinfo where book_category_id?=?any?(select?category_id?from?bookcategory where parent_id?=?2);
查看圖書類別表中是否有’y’的類別,如果有,則查看圖書信息表
select?*?from?bookinfo where exists?(select?category_id?from?bookcategory where category='y'); select?*?from?bookinfo where exists?(select?category_id?from?bookcategory where category='x');
insert into select語句從一個(gè)表復(fù)制數(shù)據(jù),然后把數(shù)據(jù)插入到一個(gè)已存在的表中。
insert?into?table2?select?*?from?table1;
需要?jiǎng)?chuàng)建一張罰款記錄信息表,包含如下信息:圖書編號(hào)、身份證號(hào)、應(yīng)還日期、實(shí)際還書日期,罰款金額
記錄來源于借閱信息表超出還書時(shí)間還未還書的讀者
create?table?readerfee( ?book_id?int, ?card_id?char(18), ?return_date?date, ?actual_return_date?date, ?book_fee?decimal(7,3), ?primary?key(book_id,card_id) ); select?book_id,card_id,return_date?from?borrowinfo where datediff(sysdate(),return_date)>0?and?status?= '否'; insert?into?readerfee(book_id,card_id,return_date)?select?book_id,card_id,return_date?from?borrowinfo where datediff(sysdate(),return_date)>0?and?status?= '否'; select?*?from?readerfee;
身份證號(hào)為5461xxxxxxx的讀者將超限的圖書20201101歸還,根據(jù)描述實(shí)現(xiàn)如下需求:
- 更新借閱信息表,將借閱狀態(tài)(status)更新為‘是’。
- 更新罰款記錄信息表,更新實(shí)際還書日期和罰款金額,罰款金額為每超出一天扣0.2元。
update?borrowinfo set status?= '是' where book_id?=?20201101?and?card_id?= '5461xxxxxxx'; select?*?from?borrowinfo; update?readerfee set actual_return_date=sysdate(),?book_fee=datediff(sysdate(),return_date)*0.2 where book_id?=?20201101?and?card_id?= '5461xxxxxxx'; select?*?from?readerfee;
8.mysql的約束
它事一種限制,通過對表的行或列的數(shù)據(jù)做出限制,來確保表的數(shù)據(jù)的完整性,唯一性。
表結(jié)構(gòu):
圖書(圖書編號(hào)book_id,類別編號(hào)book_category_id,書名book_name,作者author)
在mysql中常用的幾種約束類型:
約束類型 | 非空約束 | 主鍵約束 | 唯一約束 | 默認(rèn)約束 | 外鍵約束 |
---|---|---|---|---|---|
關(guān)鍵字 | not null | primary key | unique | default | foreign key |
圖書信息表:
(圖書編號(hào)book_id,類別編號(hào)book_category_id,書名book_name,作者author,價(jià)格price,出版社press,出版時(shí)間pubdate,庫存store)
圖書類別表:
(類別編號(hào)category_id- 主鍵,類別名稱category- 唯一,父類別parent_id-非空)
讀者信息表:
(身份證號(hào)card_id,姓名name,性別sex,年齡age,聯(lián)系電話tel,余額balance)
借閱信息表:
(圖書編號(hào)book_id,身份證號(hào)card_id,借出日期borrow_date,歸還日期return_date,是否歸還status)
非空約束
null字段值可以為空
not null字段值禁止為空
非空約束
非空約束指字段的值不能為空。對于使用了非空約束的字段如果用戶在添加數(shù)據(jù)時(shí),沒有指定值,數(shù)據(jù)庫系統(tǒng)會(huì)報(bào)錯(cuò)。
列名?數(shù)據(jù)類型?not?null
創(chuàng)建表時(shí)添加非空約束
create?table?bookinfo( ?book_id?int, ?book_name?varchar(20)?not?null );
刪除非空約束
alter?table?bookinfo?modify?book_name?varchar(20);
通過修改表添加非空約束
alter?table?bookinfo?modify?book_name?varchar(20)?not?null;
主鍵約束
主鍵約束:要求主鍵列的數(shù)據(jù)唯一,并且不允許為空,主鍵能夠唯一地標(biāo)識(shí)表中的一條記錄。
主鍵的類型:
主鍵分為單字段主鍵和多字段聯(lián)合主鍵
單字段主鍵:是由一個(gè)字段組成
在定義列的同時(shí)指定主鍵 列名?數(shù)據(jù)類型?primary?key; 在列定義的后邊指定主鍵 [constraint<約束名>]?primary?key(列名);
創(chuàng)建表時(shí)添加主鍵約束
create?table?bookinfo( ?book_id?int?primary?key, ?book_name?varchar(20)?not?null );
create?table?bookinfo( ?book_id?int, ?book_name?varchar(20)?not?null, ?constraint?pk_id?primary?key(book_id) );
刪除主鍵約束
ALTER?TABLE?bookinfo?DROP?PRIMARY?KEY;
通過修改表的方式添加主鍵約束
ALTER?TABLE?bookinfo?ADD?PRIMARY?KEY(book_id);
多字段聯(lián)合主鍵,復(fù)合主鍵
主鍵有多個(gè)字段聯(lián)合組成。primary key(字段1,字段2,...字段n);
create?table?borrowinfo( book_id?int, card_id?char(18), primary?key(book_id,card_id) );
通過修改表為列添加主鍵
create?table?bookinfo( ?book_id?int, ?book_name?varchar(20)?not?null ); alter?table?bookinfo?modify?book_id?int?primary?key; alter?table?bookinfo?add?primary?key(book_id); alter?table?bookinfo?add?constraint?pk_id?primary?key(book_id);
唯一約束
唯一約束要求該列唯一,允許為空,唯一約束可以確保一列或者幾列不出現(xiàn)重復(fù)值。
語法規(guī)則:
列名?數(shù)據(jù)類型?unique [constraint?<約束名>]?unique(<列名>)
創(chuàng)建表時(shí)添加唯一約束
CREATE?TABLE?bookinfo( ?book_id?INT?PRIMARY?KEY, ?book_name?VARCHAR(20)?NOT?NULL?UNIQUE? ); 或: create?table?bookinfo( book_id?int?primary?key, book_name?varchar(20)?not?null, constraint?uk_bname?unique(book_name) );
通過修改表的方式添加唯一約束
alter?table?bookinfo?modify?book_name?varchar(20)?unique; ALTER?TABLE?bookinfo?ADD?UNIQUE(book_name); alter?table?bookinfo? add?constraint?uk_bname?unique(book_name);
刪除唯一約束
ALTER?TABLE?book_info?DROP??KEY??uk_bname; ALTER?TABLE?book_info?DROP??INDEX??uk_bname;
唯一約束和主鍵約束的區(qū)別
- 一個(gè)表中可以有多個(gè)unique聲明,但只能有一個(gè)primary key聲明
- 聲明為primary key的列不允許有空值
- 聲明為unique的列允許空值
默認(rèn)約束
默認(rèn)約束是指某列的默認(rèn)值
列名?數(shù)據(jù)類型?default?默認(rèn)值
創(chuàng)建表時(shí)添加默認(rèn)約束
CREATE?TABLE?bookinfo(
?book_id?INT?PRIMARY?KEY,
?press?VARCHAR(20)??DEFAULT '出版社' );
通過修改表的方式添加默認(rèn)約束
ALTER?TABLE?bookinfo? ALTER?COLUMN?press?SET?DEFAULT '出版社'; alter?table?bookinfo? modify?press?varchar(10)?default '出版社';
刪除默認(rèn)約束
alter?table?bookinfo?modify?press?varchar(20); ALTER?TABLE?bookinfo? ALTER?COLUMN?press?DROP?DEFAULT;
外鍵約束
外鍵是用來在兩個(gè)表的數(shù)據(jù)之間建立鏈接,可以是一列或者多列,一個(gè)表可以有一個(gè)或者多個(gè)外鍵。
外鍵對應(yīng)的是參照完整性,一個(gè)表的外鍵可以為空值,若不為空值,則每一個(gè)外鍵必須等于另一個(gè)表中主鍵的某個(gè)值。
作用:保持?jǐn)?shù)據(jù)的一致性,完整性。
創(chuàng)建表時(shí)添加外鍵約束
圖書類別表(父表) CREATE?TABLE?bookcategory( ?category_id?INT?PRIMARY?KEY, ?category?VARCHAR(20), ?parent_id?INT ); 圖書信息表(子表) CREATE?TABLE?bookinfo( ?book_id?INT?PRIMARY?KEY, ?book_category_id??INT, ?CONSTRAINT?fk_cid?FOREIGN?KEY(book_category_id)?REFERENCES?bookcategory(category_id) );
通過修改表的方式添加外鍵約束
ALTER??TABLE??bookinfo?? ADD??FOREIGN?KEY(book_category_id)?REFERENCES??bookcategory(category_id);
刪除外鍵約束
ALTER?TABLE?bookinfo?DROP?FOREIGN?KEY?fk_cid;
外鍵約束的參照操作
cascade,從父表刪除或更新且自動(dòng)刪除或更新子表中匹配的行
create?table?bookinfo( ?book_id?int?primary?key, ?book_category_id?int, ?constraint?fk_cid?foreign?key?(book_category_id)?references?bookcategory(category_id)?on?delete?cascade);
創(chuàng)建圖書管理系統(tǒng)表
圖書類別表
create?table?bookcategory( category_id?int?primary?key, category?varchar(20)?not?null?unique, parent_id?int?not?null );
圖書信息表
create?table?bookinfo( book_id?int?primary?key, book_category_id?int, book_name?varchar(20)?not?null?unique, author?varchar(20)?not?null, price float(5,2)?not?null, press?varchar(20)?default '機(jī)械工業(yè)出版社', pubdate?date?not?null, store?int?not?null, constraint?fk_bcid?foreign?key(book_category_id)?references?bookcategory(category_id) );
讀者信息表
create?table?readerinfo( card_id?char(18)?primary?key, name?varchar(20)?not?null, sex?enum('男','女','保密')?default '保密', age?tinyint, tel?char(11)?not?null, balance?decimal(7,3)?default?200 );
借閱信息表
create?table?borrowinfo( book_id?int, card_id?char(18), borrow_date?date?not?null, return_date?date?not?null, status?char(11)?not?null, primary?key(book_id,card_id) );
9.數(shù)據(jù)庫表記錄的操作
單表數(shù)據(jù)記錄的插入
語法格式:
insert?into?table_name(column_list)?values(value_list);
為表的所有列插入數(shù)據(jù)
insert?into?bookcategory (category_id,category,parent_id)values (1,'x',0); insert?into?bookcategory?values(2,'y',0);
為表的指定列插入數(shù)據(jù)
insert?into?readerinfo (card_id,name,tel)values('4562135465','張飛','4651354651');
同時(shí)插入多條記錄
insert?into?bookcategory(category_id,category,parent_id)values(3,'x',1),(4,'y',1),(5,'z',2);
將查詢結(jié)果插入的表中
insert?into?bookcategory?select?*?from test where id>5;
自動(dòng)增加
設(shè)置表的屬性值自動(dòng)增加:
列名?數(shù)據(jù)類型?auto_increment
創(chuàng)建表時(shí)添加自增列
create?table?bookcategory_tmp( ?category_id?int?primary?key?auto_increment, ?category?varchar(20)?not?null?unique, ?parent_id?int?not?null )auto_increment=5;
測試自增列
insert?into?bookcategory_tmp(category,parent_id)values('dadaqianduan',0);
去掉自增列
alter?table?bookcategory_tmp?modify?category_id?int;
添加自增列
alter?table?bookcategory_tmp?modify?category_id?int?auto_increment;
修改自增列的起始值
alter?table?bookcategory_tmp?auto_increment?=?15;
insert?into?bookcategory_tmp(category,parent_id)values('文學(xué)',0);
刪除圖書信息表的外鍵
alter?table?bookinfo?drop?foreign?key?fk_bcid;
為圖書類別表添加自動(dòng)編號(hào)的功能
alter?table?bookcategory?modify?category_id?int?auto_increment;
恢復(fù)關(guān)聯(lián)
alter?table?bookinfo?add?constraint?fk_bcid?foreign?key(book_category_id)references?bookcategory(category_id);
單表數(shù)據(jù)記錄的更新
向借閱信息表插入一條借閱信息
insert?into?borrowinfo(book_id,card_id,borrow_date,return_date,status)values(20202010,46516874,'2020-11-29','2020-12-29','否');
更新讀者信息表中的余額
查看書的價(jià)格???79.80
select?price?from?bookinfo where book_id?=?20202010;
更新余額
update?readerinfo set balance?=?balance?-?79.80*0.05 where card_id?= '46516874'; select?*?from?readerinfo;
更新圖書信息表的庫存
update?bookinfo set store?=?store?-1 where book_id?=?20150201; select?*?from?bookinfo;
單表數(shù)據(jù)記錄的刪除
刪除指定條件的記錄
delete?from?readerinfo where card_id?= '46461265464565';
刪除表中所有記錄
delete?from?readerinfo; truncate?table?readerinfo;快
想要?jiǎng)h除表中的所有記錄,可以使用truncate table語句,truncate將直接刪除原來的表,并重新創(chuàng)建一個(gè)表,其語法結(jié)構(gòu):
truncate?table?table_name
查詢兒科學(xué)的類別編號(hào)
select?category_id?from?bookcategory where category='兒科學(xué)';
刪除圖書編號(hào)為5的圖書信息
delete?from?bookinfo where book_category_id?=?5;
刪除圖書類別表中兒科學(xué)這個(gè)類別
delete?from?bookcategory where category?= '兒科學(xué)';
單表數(shù)據(jù)記錄的查詢
查詢所有列
select?*?from?bookcategory; select?category_id,category,parent_id?from?bookcategory;
查詢指定列
select?category?from?bookcategory; select?category_id,category?from?bookcategory;
查詢指定條件的記錄
select?book_id,book_name,price?from?bookinfo where press='出版社';
查詢結(jié)果不重復(fù)的記錄
select?distinct?press?from?bookinfo;
查看空值
select?*?from?readerinfo where age?is?null;
分組
統(tǒng)計(jì)讀者信息表中男讀者的人數(shù)
select?count(*)?from?readerinfo where sex='男';
將讀者信息表中的記錄按性別進(jìn)行分組
select?sex?from?readerinfo?group?by?sex;
將讀者信息表中的記錄按性別進(jìn)行分組,并統(tǒng)計(jì)每種性別的人數(shù)
select?sex,count(*)?from?readerinfo?group?by?sex;
將讀者信息表中的記錄按性別進(jìn)行分組,分組后人數(shù)大于的性別
select?sex?from?readerinfo?group?by?sex?having?count(sex)>2;
排序
通過order by子句對查詢的結(jié)果進(jìn)行排序
order?by?列名?[asc|desc]
排序方向:
- 排序分為升序和降序,默認(rèn)為升序
- 升序asc
- 降序desc
單列排序
select?*?from?bookinfo?order?by?price;
多列排序
select?*?from?bookinfo?order?by?price,store;
指定排序方向
select?*?from?bookinfo?order?by?price,store?desc;
limit語句限制查詢記錄的數(shù)量
前3行記錄
select?*?from?bookinfo limit 3;
從第3條記錄開始的后2條記錄
select?*?from?bookinfo limit 2,2; select?*?from?bookinfo limit 2?offset?2;
insert?into?bookinfo(book_id,book_category_id,book_name,author,price,press,pubdate,store) values (454235424,4, '123', 'xxx',85.8, '出版社', '2020-04-01',?10), (452454542,4, '456', 'xxx',?35.5, '出版社', '2020-08-01',?20), (454578754,4, '789', 'xxx',?46.6, '出版社', '2020-05-01',8);
將圖書信息按照庫存進(jìn)行分組,統(tǒng)計(jì)每組庫存下的個(gè)數(shù),然后按庫存進(jìn)行降序排序,并查看結(jié)果中的前四條記錄
select?store,count(*)from?bookinfo?
group?by?store?
order?by?store?desc limit 4;
10.運(yùn)算符與函數(shù)
MySQL 主要有以下幾種運(yùn)算符:
- 算術(shù)運(yùn)算符
- 比較運(yùn)算符
- 邏輯運(yùn)算符
- 位運(yùn)算符
算術(shù)運(yùn)算符
比較運(yùn)算符
邏輯運(yùn)算符
位運(yùn)算符
運(yùn)算符優(yōu)先級(jí)
讀者的身份證號(hào),姓名,電話,余額。
select?card_id,?name,?tel,?balance?from?readerinfo where balance-200<=0;
查看讀者信息表中,余額大于200的讀者信息。
select?*?from?readerinfo where balance>200;
查看讀者信息表中,余額不等于200的讀者信息。
select?*?from?readerinfo where balance?<>?200;
查看讀者信息表中,年齡不為空的讀者信息。
select?*?from?readerinfo where age?is?not?null;
查看讀者信息表中,余額在350到450之間的讀者信息。
select?*?from?readerinfo where balance?between?350?and?450;
select?*?from?readerinfo where name in('dada','dada1','dada2'); select?*?from?readerinfo where name?like '張_'; select?*?from?readerinfo where tel?like '135%'; select?*?from?bookinfo where price>50?and?store<5; select * from bookinfo where price>80?or?press?= '出版社'; select?*?from?bookinfo where price?not?between?50?and?100;
數(shù)值函數(shù)
ceil返回大于x的最小整數(shù)值
select?ceil(28.55);?//?29
floor返回小于x的最大整數(shù)值
select?floor(28.55);?//?28
四舍五入 round返回最接近于參數(shù)x的整數(shù),對參數(shù)x進(jìn)行四舍五入
select?round(28.55);?//?29 select?round(28.55,1),round(28.55,0),round(28.55,-1); //?28.6?29?30
截?cái)嗪瘮?shù)
select?truncate(28.55,1),truncate(28.55,0),truncate(28.55,-1); //?28.5?28?20
取模,返回x被y除后的余數(shù)
select?mod(11,2);?//?1
select?book_id,book_name,price,?round(price)?from?bookinfo;
select?*?from?bookinfo where mod(book_id,2)=0;
字符函數(shù)
字符串連接
select?concat('hello','world'); select?concat_ws('-','hello','world');
字母轉(zhuǎn)換大小寫
select?lower('Hello?World'); select?upper('Hello?World');
求長度
select?length('?hello?');
刪除空格
select?ltrim('?hello?'),length(ltrim('?hello?')); select?rtrim('?hello?'),length(rtrim('?hello?')); select?trim('?hello?'),length(trim('?hello?'));
截取字符串
select?substring('hello?world',1,5); select?substring('hello?world',-5,2);
獲取指定長度的字符串
select?left('hello?world',?5);?//?hello select?right('hello?world',?5);?//?world
替換函數(shù)
select?replace('hello?world','world','mysql');?//?hello?mysql
格式化函數(shù)
select?format(1234.5678,2),format(1234.5,2),format(1234.5678,0); //1234.57?1234.50?12345 select?book_id,book_name,format(price,2)from?bookinfo;
日期和時(shí)間函數(shù)
查看當(dāng)前的系統(tǒng)日期
select?curdate(); //?2020-02-02
select?curdate()+0; select?curtime()+0;
查看當(dāng)前的系統(tǒng)日期和時(shí)間
select?now();?//?2020-10-10?12:12:12 select?sysdate();?//?2020-10-10?12:12:12
date_add(date,interval expr type):year,month,day,week,hour
日期的加運(yùn)算 select?date_add('2020-01-01',?interval?5?month);?//?2020-06-01 計(jì)算兩個(gè)日期之間間隔的天數(shù) select?datediff('2020-02-10','2020-02-01'); 日期格式化 select?date_format('2020-02-01', '%Y%m');
聚合函數(shù)(分組函數(shù))
| 名稱 | 描述 | |avg()| 返回某列的平均值 | |count()| 返回某列的行數(shù) | |max()| 返回某列的最大值 | |min()| 返回某列的最小值 | |sum()| 返回某列值的和 |
求圖書信息表中,所有圖書的平均價(jià)格。
select?avg(price)?from?bookinfo;
求圖書信息表中,所有圖書的總價(jià)格。
select?sum(price)?from?bookinfo;
求圖書信息表中的最大庫存。
select?max(store)?from?bookinfo;
求圖書信息表中的最小庫存。
select?min(store)?from?bookinfo;
求圖書信息表中有多少種圖書。
select?count(*)?from?bookinfo;
按類別進(jìn)行分組, 查詢每種類別下有多少種圖書以及每種類別圖書的庫存總和。
select?book_category_id?as '圖書類別',count(book_id)?as '圖書種類',?sum(store)?as '庫存總和' from?bookinfo?group?by?book_category_id;
信息函數(shù)與加密函數(shù)
系統(tǒng)信息函數(shù)
查看當(dāng)前MySQL服務(wù)器版本的版本號(hào) select?version(); 查看MySQL服務(wù)器當(dāng)前連接的次數(shù) select?connection_id(); 查看當(dāng)前的數(shù)據(jù)庫名 select?schema(); 查看當(dāng)前登錄的用戶名 select?user();
加密函數(shù)
select?md5('test'); create?table?myuser( ?username?varchar(10), ?password?varchar(35) ); insert?into?myuser?values('user1',md5('pwd1')); select?*?from?myuser; select?*?from?myuser where username?= 'user1' and?password?=?md5('pwd1'); select?password('rootpwd'); set password?=?password('rootpwd'); select?user,authentication_string?from?mysql.user;
11.多表連接查詢
多表連接查詢是從多個(gè)表中獲取數(shù)據(jù)。
由圖書信息表:(圖書編號(hào)book_id,類別編號(hào)book_category_id,書名book_name)
由圖書類別表:(類別編號(hào)category_id,類別名稱category,父類別parent_id)
獲取表:(圖書編號(hào)book_id,書名book_name,類別名稱category)
多表連接的語法結(jié)構(gòu):
table_reference [INNER]?JOIN?|?{LEFT|RIGHT}?[OUTER]?JOIN table_reference on?conditional_expr
多表連接 通過查看圖書信息表和圖書類別表 來獲取圖書編號(hào)、圖書名稱、圖書類別
select?book_id,book_name,category?from?bookinfo?inner?join?bookcategory??on?bookinfo.book_category_id?=?bookcategory.category_id;
內(nèi)連接
根據(jù)連接條件從多個(gè)表中查詢選擇數(shù)據(jù),顯示這些表中與連接條件相匹配的數(shù)據(jù)行,組合成新記錄。(內(nèi)連接就是兩者共同都有的)
內(nèi)連接的語法結(jié)構(gòu):
select?column_list
from?t1
[INNER]?JOIN?t2?ON?join_condition1
[INNER]?JOIN?t3?ON?join_condition2
...] where where_conditions;
由于圖書借閱統(tǒng)計(jì)的需要,想查詢未歸還圖書的圖書編號(hào),圖書名稱,身份證號(hào),姓名,電話,歸還日期, 是否歸還。
select?borrowinfo.book_id,book_name,borrowinfo.card_id,?name,?tel,?return_date,?status?from?borrowinfo inner?join?bookinfo?on?borrowinfo.book_id?=?bookinfo.book_id inner?join?readerinfo?on?borrowinfo.card_id?=?readerinfo.card_id where borrowinfo.status?= '否'; select?t1.book_id,book_name,t1.card_id,?name,?tel,?return_date,?status?from?borrowinfo?t1 join?bookinfo?t2?on?t1.book_id?=?t2.book_id join?readerinfo?t3?on?t1.card_id?=?t3.card_id where t1.status?= '否';
外連接
外連接將查詢多個(gè)表中相關(guān)聯(lián)的行。
外連接分為:左外連接left outer join;右外連接right outer join
根據(jù)業(yè)務(wù)需要,我們需要查看圖書類別表中的所有類別下都有哪些圖書。
select?book_id,?book_name,?category?from?bookcategory
left?join?bookinfo?on?bookcategory.category_id?=?bookinfo.book_category_id where parent_id<>0;
select?book_id,?book_name,?category?from?bookinfo?a
right?join?bookcategory?b?on?b.category_id?=?a.book_category_id;
select?*?from?bookcategory;
左外連接:顯示左表全部記錄,右表滿足連接條件的記錄。
右外連接:顯示右表全部記錄,左表滿足連接條件的記錄。
語法結(jié)構(gòu):
select?column_list from?t1 left?|?right?[outer]?join?t2?on?join_condition1;
自連接
如果在一個(gè)連接查詢中,涉及的兩個(gè)表都是同一個(gè)表,這種查詢稱為自連接
查詢所有圖書類別的圖書類別編號(hào),類別名稱,上級(jí)分類名稱。
select?*?from?bookcategory; select?s.category_id?as'圖書類別編號(hào)',?s.category?as '圖書類別名稱',?p.category?as'圖書的上級(jí)分類名稱' from?bookcategory?s inner?join?bookcategory?p on?s.parent_id?=?p.category_id;
多表更新
update? table1?{[inner]?join?|?{left|right}?[outer]?join}?table2 on?conditional_expr set col1?=?{expr1|default} [,col2?=?{expr2|default}]... [where where_condition]
身份證號(hào)為432xxxxxx的讀者將超時(shí)的圖書86154歸還,根據(jù)描述實(shí)現(xiàn)如下需求:
- 更新借閱信息表,將借閱狀態(tài)(status)更新為‘是’。
- 更新罰款記錄信息表,更新實(shí)際還書日期和罰款金額,罰款金額為每超出一天扣0.2元。
- 同時(shí)更新讀者信息表的余額。(在余額中扣除罰款金額)
update?readerfee?t1?join?readerinfo?t2?on?t1.card_id?=?t2.card_id set actual_return_date?=?sysdate(),book_fee=datediff(sysdate(),return_date)*0.2,balance?=?balance?-?book_fee where t1.book_id?=?86154?and?t1.card_id?= '432xxxxxx'; select?*?from?readerinfo;
多表刪除
delete?table1[.*],?table2[.*]
from?table1?{[inner]join|{left|right}[outer]join}?table2
on?conditional_expr
[where where_condition]
圖書類別表,圖書信息表:
由于業(yè)務(wù)需求,需要?jiǎng)h除圖書類別表中在圖書信息表中沒有圖書記錄的類別。
select?book_id,book_name,category?from?bookcategory_bak?t1 left?join?bookinfo_bak?t2? on?t1.category_id?=?t2.book_category_id where parent_id<>0; delete?t1?from?bookcategory_bak?t1 left?join?bookinfo_bak?t2? on?t1.category_id?=?t2.book_category_id where parent_id<>0?and?book_id?is?null; select?*?from?bookcategory_bak;
需要?jiǎng)h除圖書類別表的編程語言的類別,以及圖書信息表中關(guān)于編程語言的圖書記錄。
select?book_id,book_name,category_id,category?from?bookcategory_bak?t1
inner?join?bookinfo_bak?t2
on?t1.category_id?=?t2.book_category_id;
delete?t1,t2?from?bookcategory_bak?t1
inner?join?bookinfo_bak?t2
on?t1.category_id?=?t2.book_category_id where t1.category_id?=?3;
多表連接
根據(jù)連接查詢返回的結(jié)果:內(nèi)連接(inner join),外連接(outer join),交叉連接(cross join)。
根據(jù)連接條件所使用的操作符:相等連接,不等連接。
12.自定義函數(shù)
創(chuàng)建函數(shù)
CREATE?FUNCTION?函數(shù)名(參數(shù)列表)?RETURNS?返回類型 BEGIN ?函數(shù)體 END
調(diào)用函數(shù)
SELECT?函數(shù)名(參數(shù)列表)
查看函數(shù)
SHOW?FUNCTION?STATUS;
刪除函數(shù)
DROP?FUNCTION?IF?EXISTS?function_name;
函數(shù):需要有返回值,可以指定0~n個(gè)參數(shù)
創(chuàng)建自定義函數(shù):
create function function_name([func_parameter]) returns type [characteristics..]?routine_body
Characteristics指定存儲(chǔ)函數(shù)的特性,取值舉例:
sql security{definer|invoker}指明誰有權(quán)限來執(zhí)行。
definer表示只有定義者才能執(zhí)行。
invoker表示擁有權(quán)限的調(diào)用者才可以執(zhí)行,默認(rèn)情況下,系統(tǒng)指定為definer。
comment 'string':注釋信息,可以用來描述存儲(chǔ)函數(shù)。
函數(shù)體是由sql代碼構(gòu)成,可以簡單的sql語句。如果為復(fù)合結(jié)構(gòu)需要使用begin...end語句,復(fù)合結(jié)構(gòu)可以包含聲明,流程控制。
select?length('hello'); select?date_format(pubdate,'%Y-%m')?from?bookinfo; delimiter?//? create function ym_date(mydate?date) returns?varchar(15) begin return date_format(mydate,'%Y-%m'); end// delimiter; select?ym_date(pubdate)?from?bookinfo;
創(chuàng)建自定義函數(shù):
語法格式:
create function function_name([func_parameter]) returns type [characteristics...]?routine_body
select?length('hello'); select?date_format(pubdate,'%Y-%m')?from?bookinfo;
delimiter?// create function ym_date(mydate?date) returns?varchar(15) begin return date_format(mydate,'%Y-%m'); end// delimiter?; 使用(調(diào)用)自定義函數(shù) select?ym_date(pubdate)?from?bookinfo;
實(shí)例分析函數(shù):
創(chuàng)建一個(gè)函數(shù) delimiter?$$?--定界符 ---?開始創(chuàng)建函數(shù) create function user_main_fn(v_id?int) returns?varchar(50) begin --定義變量 declare v_userName?varchar(50); --給定義的變量賦值 select?f_userName?info?v_userName?from?t_user_main where f_userId?=?v_id; --返回函數(shù)處理結(jié)果 return v_userName; end?$$?--函數(shù)創(chuàng)建定界符 delimiter;
自定義函數(shù)兩個(gè)必要條件:參數(shù),返回值
創(chuàng)建自定義函數(shù)
create function function_name returns {string|integer|real|decimal} routine_body 語法格式: CREATE?FUNCTION?function_name([func_parameter]) RETURNS type [characteristics?…?]?routine_body
- function_name : 函數(shù)名稱
- func_parameter : 函數(shù)的參數(shù)列表
- RETURNS type : 指定返回值的類型
- Characteristics : 指定存儲(chǔ)函數(shù)的特性
- routine_body : 函數(shù)體
創(chuàng)建無參的自定義函數(shù):
刪除自定義函數(shù)
DROP?FUNCTION?[IF?EXISTS]?func_name;
SELECT?DATE_FORMAT(NOW(), '%Y年%m月%d日?%H點(diǎn):%i分:%s秒') CREATE?FUNCTION?f1()?RETURNS?VARCHAR(30) RETURN?DATE_FORMAT(NOW(), '%Y年%m月%d日?%H點(diǎn):%i分:%s秒'); SELECT?f1();
復(fù)合結(jié)構(gòu)體的函數(shù)
--?將語句結(jié)束符改為$$,為了防止下面的函數(shù)將;看成是語句的結(jié)束 DELIMITER?$$ CREATE?FUNCTION?adduser(username?VARCHAR(20)) RETURNS?INT?UNSIGNED RETURN BEGIN INSERT?INTO?table_1(username)?VALUES(username); LAST_INSERT_ID(); END; --?將分隔符改回來 DELIMITER?;
流程控制的使用
常用的流程控制語句:
- IF條件判斷語句-if
- CASE條件判斷語句-case
- WHILE循環(huán)語句-while
- LOOP循環(huán)語句-loop
- REPEAT循環(huán)語句-repeat
13.存儲(chǔ)過程
局部變量以關(guān)鍵字DECLARE聲明
DECLARE?var_name?[,?varname2,?varname3?…]?date_type?[DEFAULT?value]; 例:DECARE num INT DEFAULE 10;
內(nèi)部BEGIN…END塊中定義的變量只在該塊內(nèi)有效
會(huì)話變量的作用范圍為整個(gè)程序
語法結(jié)果
create?procedure?proc_name([proc_parameter]) [characteristics...]?routine_body
delimiter?//? create?procedure?selectproc1() begin select?book_id,?book_name,?price,?store?from?bookinfo; end?// delimiter; call?selectproc();
刪除存儲(chǔ)過程:
drop?procedure?[if exists]?proc_name;
創(chuàng)建一個(gè)查詢圖書的編號(hào)、書名、價(jià)格和庫存的存儲(chǔ)過程。 delimiter?// create?procedure?selectproc1() begin select?book_id,book_name,price,store?from?bookinfo; end// delimiter?; 調(diào)用存儲(chǔ)過程 call?selectproc1();
創(chuàng)建查詢圖書編號(hào)、書名、圖書類別的存儲(chǔ)過程 delimiter?// create?procedure?proc1() begin select?book_id,book_name,category?from?bookinfo?t1 join?bookcategory?t2 on?t1.book_category_id?=?t2.category_id; end// delimiter?; call?proc1(); 設(shè)計(jì)一個(gè)存儲(chǔ)過程,刪除一個(gè)讀者,并輸出剩余讀者的個(gè)數(shù)。 delimiter?// create?procedure?proc2(in cid?char(18),?out?num?int) begin delete?from?readerinfo where card_id?=?cid; select?count(card_id)?into?num?from?readerinfo; end// delimiter?; select?*?from?readerinfo; call?proc2('6545xx',?@num); select?@num; 設(shè)計(jì)一個(gè)存儲(chǔ)過程,實(shí)現(xiàn)交換兩個(gè)數(shù)的處理。 delimiter?// create?procedure?proc3(inout?num1?int,?inout?num2?int) begin declare t?int?default?0; set t?=?num1; set num1?=?num2; set num2?=?t; end// delimiter?; set @n1?=?3,?@n2?=?5; call?proc3(@n1,@n2); select?@n1,@n2; 刪除存儲(chǔ)過程 drop?procedure?proc1; drop?procedure if exists?proc2;
存儲(chǔ)過程和函數(shù)的區(qū)別
存儲(chǔ)過程,存儲(chǔ)過程實(shí)現(xiàn)的功能比較復(fù)制,功能強(qiáng)大,可以執(zhí)行包括修改表等一系列數(shù)據(jù)庫操作。
存儲(chǔ)函數(shù),實(shí)現(xiàn)的功能針對性比較強(qiáng)。
返回值上的不同
存儲(chǔ)過程:可以返回多個(gè)值,也可以不返回值,只是實(shí)現(xiàn)某種效果或動(dòng)作。
存儲(chǔ)函數(shù):必須有返回值,而且只能有一個(gè)返回值。
參數(shù)不同
存儲(chǔ)過程:存儲(chǔ)過程的參數(shù)類型有三種,in,out,inout。
存儲(chǔ)函數(shù):參數(shù)類型只有一種,類似于in參數(shù),調(diào)用函數(shù)時(shí)需要按照參數(shù)的類型指定值即可。
語法結(jié)構(gòu)
存儲(chǔ)過程,存儲(chǔ)過程聲明時(shí)不需要指定返回類型。
存儲(chǔ)函數(shù),函數(shù)聲明時(shí)需要指定返回類型,且在函數(shù)體中必須包含一個(gè)有效的return語句。
調(diào)用方式
存儲(chǔ)過程,用call語句進(jìn)行調(diào)用
存儲(chǔ)函數(shù),嵌入在sql中使用的,可以在select中調(diào)用
14.事務(wù)
事務(wù)必須滿足的四個(gè)條件:
atomicity?原子性 consistency?一致性 lsolation?隔離性 durability?持久性
控制事務(wù)處理
rollback,回滾會(huì)結(jié)束用戶的事務(wù),并撤銷正在進(jìn)行的所有未提交的修改
commit,會(huì)提交事務(wù),并使已對數(shù)據(jù)庫進(jìn)行的所有修改稱為永久性的
savepoint identifier,允許在事務(wù)中創(chuàng)建一個(gè)保存點(diǎn),一個(gè)事務(wù)中可以有多個(gè)savepoint
rollback to identifier,把事務(wù)回滾到標(biāo)記點(diǎn)
事務(wù)處理主要有兩種方法
用begin, rollback, commit來實(shí)現(xiàn)
- begin,start transaction開始一個(gè)事務(wù)
- rollback事務(wù)回滾
- commit事務(wù)確認(rèn)
直接用set來改變mysql的自動(dòng)提交模式
- set autocommit = 0禁止自動(dòng)提交
- set autocommit = 1開始自動(dòng)提交
innodb使用事務(wù)
從Mysql5.5版本開始,InnoDB是默認(rèn)的表存儲(chǔ)引擎。
innodb是事務(wù)型數(shù)據(jù)庫的首選引擎,支持事務(wù)安全表。
MySql中 delimiter
默認(rèn)下,delimiter是分號(hào),在命令行客戶端中,如果有一行命令以分號(hào)結(jié)束,那么回車后,mysql將會(huì)執(zhí)行該命令。
(告訴mysql解釋器,該段命令是否已經(jīng)結(jié)束了,mysql是否可以執(zhí)行了。)
什么是存儲(chǔ)引擎:數(shù)據(jù)庫存儲(chǔ)引擎是數(shù)據(jù)庫底層軟件組件。數(shù)據(jù)庫管理系統(tǒng)使用數(shù)據(jù)引擎進(jìn)行創(chuàng)建,查詢,更新和刪除數(shù)據(jù)的操作。
mysql的核心就是存儲(chǔ)引擎。
innodb存儲(chǔ)引擎
- 它為mysql提供了具有提交,回滾和崩潰恢復(fù)能力的事務(wù)安全存儲(chǔ)引擎。
- 對于處理巨大數(shù)據(jù)量的數(shù)據(jù)擁有很好的性能
- innodb存儲(chǔ)引擎支持外鍵完整性約束
- innodb被用在眾多需要高性能的大型數(shù)據(jù)庫站點(diǎn)上
設(shè)置存儲(chǔ)引擎:
- 設(shè)置服務(wù)器的存儲(chǔ)引擎
- 在配置文件my.ini中的mysqld下面設(shè)置需要的存儲(chǔ)引擎
- default-storage-engine=InnoDB
- 重啟mysql服務(wù)器
創(chuàng)建表(單個(gè))設(shè)置存儲(chǔ)引擎 create?table?mytest( ?id?int?primary?key, ?name?varchar(10) )?engine?=?innodb?default?charset?=?utf8;
修改表的存儲(chǔ)引擎
alter?table?tablename?engine?=?engineName
15.管理與維護(hù)
管理用戶
USE?mysql; select?user?from?user;
權(quán)限表:存儲(chǔ)賬號(hào)的權(quán)限信息表:user,db,host,tables_priv,columns_priv和procs_priv
各個(gè)權(quán)限表的作用
tables_priv表用來對表設(shè)置操作權(quán)限;columns_priv表用來對表的某一列設(shè)置權(quán)限;procs_priv表可以對存儲(chǔ)過程和存儲(chǔ)函數(shù)設(shè)置操作權(quán)限。
使用CREATE USER語句創(chuàng)建新用戶
語法格式:
CREATE?USER?“user”@“host”?[IDENTIFIED?BY?“password”];
使用DROP USER 語句刪除用戶
語法格式:
DROP?USER?user[,?user]; 例:使用DROP USER刪除賬戶"rose"@"localhost": DROP?USER "rose"@"localhost";
示例:
查看日志文件的路徑
show?variables?like 'log_error';
創(chuàng)建新的日志信息表
flush?logs;
創(chuàng)建新的日志信息表
mysqladmin?-uroot?-p?flush-logs
點(diǎn)關(guān)注,不迷路
好了各位,以上就是這篇文章的全部內(nèi)容,能看到這里的人都是人才。我后面會(huì)不斷更新技術(shù)相關(guān)的文章,如果覺得文章對你有用,歡迎給個(gè)“在看”,也歡迎分享,感謝大家 ?。?
—————END—————
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場,如有問題,請聯(lián)系我們,謝謝!