Python筆記(八)MySQL

1、數據庫簡介

傳統記錄數據的缺點:python

不易保存、備份困難、查找不便mysql

文件:linux

①使用簡單,例如python中的open能夠打開文件,用read/write對文件進行讀寫,close關閉文件程序員

②對於數據容量較大的數據,不可以很好的知足,並且性能較差web

③不易擴展算法

數據庫:sql

①持久化存儲數據庫

②讀寫速度極高編程

③保證數據的有效性服務器

④對程序支持性很是好,容易擴展

 

數據庫就是一種特殊的文件,存儲着須要的數據

存放路徑:/var/lib/mysql (須要切換到root用戶才能打開)

 

關係型數據庫的元素:

①數據行(記錄)

②數據列(字段)--可以惟一標記某個字段,稱爲主鍵

③數據表(數據行的集合)

④數據庫(數據表的集合)

 

RDBMS:關係數據庫管理系統

所謂的關係型數據庫RDBMS,是創建在關係模型基礎上的數據庫,藉助於集合代數等數學概念和方法來處理數據庫中的數據

關係型數據庫的主要產品:

  • oracle:在之前的大型項目中使用,銀行,電信等項目
  • mysql:web時代使用最普遍的關係型數據庫
  • ms sql server:在微軟的項目中使用
  • sqlite:輕量級數據庫,主要應用在移動平臺

C/S架構,經過SQL語句來操做數據庫:

 

2、SQL與MySQL簡介

(1)SQL簡介:

SQL是結構化查詢語言,是一種用來操做RDBMS的數據庫語言,當前關係型數據庫都支持使用SQL語言進行操做,也就是說能夠經過 SQL 操做 oracle,sql server,mysql,sqlite 等等全部的關係型的數據庫

  • SQL語句主要分爲:
    • DQL:數據查詢語言,用於對數據進行查詢,如select
    • DML:數據操做語言,對數據進行增長、修改、刪除,如insert、udpate、delete
    • TPL:事務處理語言,對事務進行處理,包括begin transaction、commit、rollback
    • DCL:數據控制語言,進行受權與權限回收,如grant、revoke
    • DDL:數據定義語言,進行數據庫、表的管理等,如create、drop
    • CCL:指針控制語言,經過控制指針完成表的操做,如declare cursor
  • 對於web程序員來說,重點是數據的crud(增刪改查),必須熟練編寫DQL、DML,可以編寫DDL完成數據庫、表的操做,其它語言如TPL、DCL、CCL瞭解便可
  • SQL 是一門特殊的語言,專門用來操做關係數據庫
  • 不區分大小寫

 

(2)MySQL簡介:

MySQL是一個關係型數據庫管理系統,由瑞典MySQL AB公司開發,後來被Sun公司收購,Sun公司後來又被Oracle公司收購,目前屬於Oracle旗下產品

  • 使用C和C++編寫,並使用了多種編譯器進行測試,保證源代碼的可移植性

  • 支持多種操做系統,如Linux、Windows、AIX、FreeBSD、HP-UX、MacOS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris等

  • 爲多種編程語言提供了API,如C、C++、Python、Java、Perl、PHP、Eiffel、Ruby等

  • 支持多線程,充分利用CPU資源

  • 優化的SQL查詢算法,有效地提升查詢速度
  • 提供多語言支持,常見的編碼如GB23十二、BIG五、UTF8
  • 提供TCP/IP、ODBC和JDBC等多種數據庫鏈接途徑
  • 提供用於管理、檢查、優化數據庫操做的管理工具
  • 大型的數據庫。能夠處理擁有上千萬條記錄的大型數據庫
  • 支持多種存儲引擎
  • MySQL 軟件採用了雙受權政策,它分爲社區版和商業版,因爲其體積小、速度快、整體擁有成本低,尤爲是開放源碼這一特色,通常中小型網站的開發都選擇MySQL做爲網站數據庫
  • MySQL使用標準的SQL數據語言形式
  • Mysql是能夠定製的,採用了GPL協議,你能夠修改源碼來開發本身的Mysql系統
  • 在線DDL更改功能
  • 複製全局事務標識
  • 複製無崩潰從機
  • 複製多線程從機

開源 免費 不要錢 使用範圍廣,跨平臺支持性好,提供了多種語言調用的 API

是學習數據庫開發的首選

 

(3)MySQL安裝:

安裝服務器端

sudo apt-get install mysql-server

服務器用於接收客戶端的請求、執行sql語句、管理數據庫

服務器端通常以服務方式管理,名稱爲mysql

啓動服務

sudo service mysql start

查看進程中是否存在mysql服務

ps ajx|grep mysql

中止服務

sudo service mysql stop

重啓服務

sudo service mysql restart

 

配置

  • 配置文件目錄爲/etc/mysql/mysql.cnf

  • 進入conf.d目錄,打開mysql.cnf,發現並無配置
  • 進入mysql.conf.d目錄,打開mysql.cnf,能夠看到配置

bind-address表示服務器綁定的ip,默認爲127.0.0.1 port表示端口,默認爲3306 datadir表示數據庫目錄,默認爲/var/lib/mysql general_log_file表示普通日誌,默認爲/var/log/mysql/mysql.log log_error表示錯誤日誌,默認爲/var/log/mysql/error.log

 

命令行客戶端

  • 在終端運行以下命令,按提示填寫信息
sudo apt-get install mysql-client
  • 詳細鏈接的命令能夠查看幫助文檔
mysql --help
  • 最基本的鏈接命令以下,輸入後回車(-u 用戶名 -p密碼)
mysql -u root -pmysql
  • 查看版本號
mysql> select version();
  • 按ctrl+d或輸入 quit 或 exit 退出

 

圖形化界面客戶端Navicat

下載或拷貝到Linux,而後解壓

tar -zxvf navicat120_premium_cs_x64.tar.gz

進入解壓後的目錄,運行start文件

./start_navicat

選擇不安裝wine(wine的做用是使得Windows的軟件能夠在Linux中運行)

選擇試用

打開後若是出現亂碼,雙擊打開start_navicat文件,而後修改字符集

找到 export LANG=en_US.UTF-8

改爲 export LANG=zh_CN.UTF-8

 

打開軟件,選擇鏈接---輸入密碼---測試鏈接

左側的數據庫圖表雙擊才能夠啓動

 

新建數據庫

 

3、數據類型和約束

在表中爲了更加準確的存儲數據,保證數據的正確有效,能夠在建立表的時候,爲表添加一些強制性的驗證,包括數據字段的類型、約束

(一)數據類型

夠用就行,儘可能使用取值範圍小的,而不用大的,這樣能夠更多的節省存儲空間

經常使用數據類型以下:

  • 整數:int,bit
  • 小數:decimal
  • 字符串:varchar,char
  • 日期時間: date, time, datetime
  • 枚舉類型(enum):枚舉中的下標從1開始,能夠直接用下標賦值

特別說明的類型以下:

  • decimal表示浮點數,如decimal(5,2)表示共存5位數,小數佔2位
  • char表示固定長度的字符串,如char(3),若是填充'ab'時會補一個空格爲'ab '
  • varchar表示可變長度的字符串,如varchar(3),填充'ab'時就會存儲'ab'
  • 字符串text表示存儲大文本,當字符大於4000時推薦使用
  • 對於圖片、音頻、視頻等文件,不存儲在數據庫中,而是上傳到某個服務器上,而後在表中存儲這個文件的保存路徑

更全的數據類型能夠參考http://blog.csdn.net/anxpp/article/details/51284106

數值類型(經常使用)

類型

字節大小

有符號範圍(Signed)

無符號範圍(Unsigned)

TINYINT

1

-128 ~ 127

0 ~ 255

SMALLINT

2

-32768 ~ 32767

0 ~ 65535

MEDIUMINT

3

-8388608 ~ 8388607

0 ~ 16777215

INT/INTEGER

4

-2147483648 ~2147483647

0 ~ 4294967295

BIGINT

8

-9223372036854775808 ~ 9223372036854775807

0 ~ 18446744073709551615

字符串

類型

字節大小

示例

CHAR

0-255

類型:char(3) 輸入 'ab', 實際存儲爲'ab ', 輸入'abcd' 實際存儲爲 'abc'

VARCHAR

0-255

類型:varchar(3) 輸 'ab',實際存儲爲'ab', 輸入'abcd',實際存儲爲'abc'

TEXT

0-65535

大文本

日期時間類型

類型

字節大小

示例

DATE

4

'2020-01-01'

TIME

3

'12:29:59'

DATETIME

8

'2020-01-01 12:29:59'

YEAR

1

'2017'

TIMESTAMP

4

'1970-01-01 00:00:01' UTC ~ '2038-01-01 00:00:01' UTC

 

(二)約束

  • 主鍵primary key:物理上存儲的順序
  • 非空not null:此字段不容許填寫空值
  • 唯一unique:此字段的值不容許重複
  • 默認default:當不填寫此值時會使用默認值,若是填寫時以填寫爲準
  • 外鍵foreign key:對關係字段進行約束,當爲關係字段填寫值時,會到關聯的表中查詢此值是否存在,若是存在則填寫成功,若是不存在則填寫失敗並拋出異常
  • 說明:雖然外鍵約束能夠保證數據的有效性,可是在進行數據的crud(增長、修改、刪除、查詢)時,都會下降數據庫的性能,因此不推薦使用,那麼數據的有效性怎麼保證呢?答:能夠在邏輯層進行控制

 

4、數據庫操做

連接數據庫

SQL語句最後要有分號結尾

mysql -uroot -p
mysql -uroot -pmysql

退出數據庫

exit 或 quit 或 ctrl+D

顯示數據庫版本

select version();

顯示時間

select now();

查看全部數據庫

show databases;

建立數據庫

create database 數據庫名 charset=utf8;

create database python02 charset=utf8; create database python01;

查看建立數據庫的語句

show create database ...

show create database python02;

刪除數據庫

drop database 數據庫名;

drop database python01; drop database `python-04`; 使用tab鍵上方的`來分開字符串

查看當前使用的數據庫

select database();

使用數據庫

use 數據庫名

use python02;

查看當前數據庫中全部表

show tables;

建立表

auto_increment 自動增加

not_null 不能爲空

primary key 主鍵

default 默認值

create table 數據表名字 (字段 類型 約束,字段 類型 約束)

create table test1(id int,name varchar(30));

建立class表(id,name)

mysql> create table class -> (id int primary key not null auto_increment, -> name varchar(30) not null);

查看錶的結構

desc 數據表的名字;

desc test1;

建立student表

mysql> create table students( -> id int unsigned primary key not null auto_increment, -> name varchar(30) not null, -> age tinyint unsigned, -> high decimal(5,2), -> gender enum('','','無性別','保密') default '保密', -> cls_id int unsigned -> );

查看建立表的語句

show create table 表名字;

show create table students;

修改表-添加字段

alter table 表名 add 列名 類型;

alter table students add birthday datetime;

修改表-修改字段

alter table 表名 modify 列名 類型及約束;

alter table students modify birthday date;

修改表-修改字段

alter table 表名 change 原名 新名 類型及約束;

alter table students change birthday birth date default "2000-01-01";

修改表-刪除字段

alter table 表名 drop 列名;

alter table students drop high;

刪除表

drop table test1;

 

5、增刪改查

curd的解釋: 表明建立(Create)、更新(Update)、讀取(Retrieve)和刪除(Delete)

增長

全列插入

insert into 表名 values(...);

主鍵字段能夠用0 null default來佔位

insert into classes values(0,"大數據");

部分插入

insert into 表名(列名...) values(值...);

insert into students(name, age) values('xq',14);

多行插入

insert into students(name, age) values('大喬',14),('孫尚香',15);

 

修改

update 表名 set 列1=值1,列2=值2... where 條件;

不寫where就會全改

修改多個字段用逗號隔開

update students set cls_id=1 where id=2;

 

刪除

物理刪除

delete from 表名 where 條件;

 

邏輯刪除

用一個字段表示這條信息是否已經不能再使用了

alter table students add is_delete bit default 0;

update students set is_delete=1 where id=6;

 

查詢

查詢全部列

select * from students;

指定條件查詢

select * from students where age=14;

查詢指定列

字段的順序和查詢時寫的順序一致

select name,gender from students where age=14;

可使用as起別名

select name as "姓名",gender as "年齡" from students where age=14;

 

6、查詢

(1)基本查詢

查詢全部字段

select * from students;

查詢指定字段  

select name,age from students;

使用as給字段起別名

select name as 姓名,age as 年齡 from students;
select students.age,students.gender from students;

使用as給表起別名

select s.age,s.gender from students as s;

清除重複行

distinct 字段

select distinct gender from students;

 

(2)條件查詢

比較運算符

大於18歲

select * from students where age>18;

等於18歲 只有一個=

select * from students where age=18;

不等於18歲 不推薦<>,用!=

select * from students where age!=18;

邏輯運算符

and 18-28歲的學生信息

select * from students where age>18 and age<28;

or 18以上或身高超過180的

select * from students where age>18 or height>=180;

not 不在18以上的女性

select * from students where not age>18 and gender='';

 

(3)模糊查詢

like

%表示任意多個任意字符

_表示一個任意字符

查詢以小開頭的名字

select name from students where name like "小%";

查詢有兩個字的名字

select name from students where name like "__";

查詢至少有兩個字的名字

select name from students where name like "__%";

rlike 正則

查詢以周開頭,倫結尾的名字

select name from students where name rlike "^周.*倫$";

 

(4)範圍查詢

select name,age from students where age in (12,18,34);
select name,age from students where age not in (12,18,34);
select name,age from students where age between 18 and 34;
select name,age from students where age not between 18 and 34;

 

判斷空

select * from students where height is null;
select * from students where height is not null;

 

(5)排序

order by 字段

asc從小到大排列,即升序。默認按照列值從小到大排列(asc)

desc從大到小排序,即降序。

查詢年齡18-34之間男性,按年齡從小到大排序

select * from students where age>18 and age<34 and gender="男" order by age;

查詢年齡18-34之間女性,按身高從大到小排序

select * from students where age>=18 and age<=34 and gender=2 order by height desc;

查詢全部女性,按身高從大到小排序,身高相同則按照年齡從小到大排序

select * from students where gender=2 order by height desc,age;

 

(6)聚合函數

總數

count

女性總數

select count(*) as 總數 from students where gender=2;

最大值

max

select max(age) from students;

最小值

min

select min(age) from students;

求和

sum

全部人年齡總和

select sum(age) from students;

平均值

avg

計算平均年齡

select avg(age) from students;
select sum(age)/count(*) from students;

round(原數,保留小數位數)   四捨五入

select round(avg(age),2) from students;

 

(7)分組

group by

按照性別分組,查詢每種性別的人數

select gender,count(*) from students group by gender;

看每一組包括哪些人

select gender,group_concat(name) from students group by gender;

計算男性的人數,where寫在group前面

select gender,count(*) from students where gender=1 group by gender;
select gender,group_concat(name," ",age) from students where gender=1 group by gender;

 

having 對分組進行條件判斷

查詢平均年齡超過30的性別

select gender,group_concat(name) from students group by gender having avg(age)>30;

 

(8)分頁

限制查詢結果的個數

查詢前兩個結果

select * from students limit 2;

limit start,count

從第7個開始查5個

select * from students limit 6,5;

分頁

limit (第n頁-1)*每頁個數,每頁個數

可是不能用SQL直接計算,之後在程序中實現

limit必須寫在最後

 

(9)鏈接查詢

 

當查詢結果的列來源於多張表時,須要將多張錶鏈接成一個大的數據集,再選擇合適的列返回

mysql支持三種類型的鏈接查詢,分別爲:

  • 內鏈接查詢:查詢的結果爲兩個表匹配到的數據

  • 右鏈接查詢:查詢的結果爲兩個表匹配到的數據,右表特有的數據,對於左表中不存在的數據使用null填充

  • 左鏈接查詢:查詢的結果爲兩個表匹配到的數據,左表特有的數據,對於右表中不存在的數據使用null填充

 

 

inner join ... on

select ... from 表A inner join 表B;

select * from students inner join classes;

查詢 有可以對應班級的學生以及班級信息

select * from students inner join classes on students.cls_id=classes.id;

按照要求顯示姓名、班級

select students.*,classes.name from students inner join classes on students.cls_id=classes.id;

給數據表起名字

select s.name,c.name from students as s inner join classes as c on s.cls_id=c.id;

在以上的查詢中,將班級姓名顯示在第1列

select c.name,s.* from students as s inner join classes as c on s.cls_id=c.id;

查詢 有可以對應班級的學生以及班級信息, 按照班級進行排序

select c.name,s.* from students as s inner join classes as c on s.cls_id=c.id order by c.name;

當時同一個班級的時候,按照學生的id進行從小到大排序

select c.name,s.* from students as s inner join classes as c on s.cls_id=c.id order by c.name,s.id;

left join
查詢每位學生對應的班級信息,沒有對應班級的學生也會顯示出來,沒有的班級名顯示NULL

select * from students as s left join classes as c on s.cls_id=c.id;

查詢沒有對應班級信息的學生

select * from students as s left join classes as c on s.cls_id=c.id having c.id is null;
select * from students as s left join classes as c on s.cls_id=c.id where c.id is null;

right join on
將數據表名字互換位置,用left join完成

 

(10)自關聯

CREATE TABLE `areas` ( `aid` int(11) NOT NULL, `atitle` varchar(20) DEFAULT NULL, `pid` int(11) DEFAULT NULL, PRIMARY KEY (`aid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8

從sql文件中導入數據

先cd到當前目錄,再打開MySQL,切換數據庫

source area.sql;

 

查找某個省全部市區

select * from areas where pid=2

自關聯

select city.aid,province.atitle,city.atitle from areas as province inner join areas as city where province.aid=city.pid;

 

查詢省的名稱爲「山西省」的全部城市 

select city.* from areas as city inner join areas as province on city.pid=province.aid where province.atitle='山西省';

 

(11)子查詢

 查詢最高的男生信息

select * from students where height=(select max(height) from students);

查出高於平均身高的學生信息

select * from students where height>(select avg(height) from students);

 

7、數據庫設計

關係型數據庫建議在E-R模型的基礎上,咱們須要根據產品經理的設計策劃,抽取出來模型與關係,制定出表結構,這是項目開始的第一步。

在開發中有不少設計數據庫的軟件,經常使用的如power designer,db desinger等,這些軟件能夠直觀的看到實體及實體間的關係。

設計數據庫,多是由專門的數據庫設計人員完成,也多是由開發組成員完成,通常是項目經理帶領組員來完成。

 

範式

通過研究和對使用中問題的總結,對於設計數據庫提出了一些規範,這些規範被稱爲範式(Normal Form)

目前有跡可尋的共有8種範式,通常須要遵照3範式便可

◆ 第一範式(1NF):強調的是列的原子性,即列不可以再分紅其餘幾列。

考慮這樣一個表:【聯繫人】(姓名,性別,電話) 若是在實際場景中,一個聯繫人有家庭電話和公司電話,那麼這種表結構設計就沒有達到 1NF。要符合 1NF 咱們只需把列(電話)拆分,即:【聯繫人】(姓名,性別,家庭電話,公司電話)。1NF 很好辨別,可是 2NF 和 3NF 就容易搞混淆。

◆ 第二範式(2NF):首先是 1NF,另外包含兩部份內容,一是表必須有一個主鍵;二是沒有包含在主鍵中的列必須徹底依賴於主鍵,而不能只依賴於主鍵的一部分。

考慮一個訂單明細表:【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName)。 由於咱們知道在一個訂單中能夠訂購多種產品,因此單單一個 OrderID 是不足以成爲主鍵的,主鍵應該是(OrderID,ProductID)。顯而易見 Discount(折扣),Quantity(數量)徹底依賴(取決)於主鍵(OderID,ProductID),而 UnitPrice,ProductName 只依賴於 ProductID。因此 OrderDetail 表不符合 2NF。不符合 2NF 的設計容易產生冗餘數據。

能夠把【OrderDetail】表拆分爲【OrderDetail】(OrderID,ProductID,Discount,Quantity)和【Product】(ProductID,UnitPrice,ProductName)來消除原訂單表中UnitPrice,ProductName屢次重複的狀況。

◆ 第三範式(3NF):首先是 2NF,另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。即不能存在:非主鍵列 A 依賴於非主鍵列 B,非主鍵列 B 依賴於主鍵的狀況。

考慮一個訂單表【Order】(OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)主鍵是(OrderID)。 其中 OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity 等非主鍵列都徹底依賴於主鍵(OrderID),因此符合 2NF。不過問題是 CustomerName,CustomerAddr,CustomerCity 直接依賴的是 CustomerID(非主鍵列),而不是直接依賴於主鍵,它是經過傳遞才依賴於主鍵,因此不符合 3NF。 經過拆分【Order】爲【Order】(OrderID,OrderDate,CustomerID)和【Customer】(CustomerID,CustomerName,CustomerAddr,CustomerCity)從而達到 3NF。 *第二範式(2NF)和第三範式(3NF)的概念很容易混淆,區分它們的關鍵點在於,2NF:非主鍵列是否徹底依賴於主鍵,仍是依賴於主鍵的一部分;3NF:非主鍵列是直接依賴於主鍵,仍是直接依賴於非主鍵列。

不遵循1NF

 

不遵循2NF:主鍵有兩個,但洗髮水只依賴PID

 

不遵循3NF:存在傳遞依賴

 

 最終表

 

 

E-R模型

  • E表示entry,實體,設計實體就像定義一個類同樣,指定從哪些方面描述對象,一個實體轉換爲數據庫中的一個表
  • R表示relationship,關係,關係描述兩個實體之間的對應規則,關係的類型包括包括一對1、一對多、多對多
  • 關係也是一種數據,須要經過一個字段存儲在表中
  • 實體A對實體B爲1對1,則在表A或表B中建立一個字段,存儲另外一個表的主鍵值

  • 實體A對實體B爲1對多:在表B中建立一個字段,存儲表A的主鍵值

  • 實體A對實體B爲多對多:新建一張表C,這個表只有兩個字段,一個用於存儲A的主鍵值,一個用於存儲B的主鍵值

 

邏輯刪除

  • 對於重要數據,並不但願物理刪除,一旦刪除,數據沒法找回
  • 刪除方案:設置isDelete的列,類型爲bit,表示邏輯刪除,默認值爲0
  • 對於非重要數據,能夠進行物理刪除
  • 數據的重要性,要根據實際開發決定

 

8、SQL演練

-- 建立 "京東" 數據庫
create database jing_dong charset=utf8; -- 使用 "京東" 數據庫
use jing_dong; -- 建立一個商品goods數據表
create table goods( id int unsigned primary key auto_increment not null, name varchar(150) not null, cate_name varchar(40) not null, brand_name varchar(40) not null, price decimal(10,3) not null default 0, is_show bit not null default 1, is_saleoff bit not null default 0 );
-- 向goods表中插入數據

insert into goods values(0,'r510vc 15.6英寸筆記本','筆記本','華碩','3399',default,default); insert into goods values(0,'y400n 14.0英寸筆記本電腦','筆記本','聯想','4999',default,default); insert into goods values(0,'g150th 15.6英寸遊戲本','遊戲本','雷神','8499',default,default); insert into goods values(0,'x550cc 15.6英寸筆記本','筆記本','華碩','2799',default,default); insert into goods values(0,'x240 超極本','超級本','聯想','4880',default,default); insert into goods values(0,'u330p 13.3英寸超極本','超級本','聯想','4299',default,default); insert into goods values(0,'svp13226scb 觸控超極本','超級本','索尼','7999',default,default); insert into goods values(0,'ipad mini 7.9英寸平板電腦','平板電腦','蘋果','1998',default,default); insert into goods values(0,'ipad air 9.7英寸平板電腦','平板電腦','蘋果','3388',default,default); insert into goods values(0,'ipad mini 配備 retina 顯示屏','平板電腦','蘋果','2788',default,default); insert into goods values(0,'ideacentre c340 20英寸一體電腦 ','臺式機','聯想','3499',default,default); insert into goods values(0,'vostro 3800-r1206 臺式電腦','臺式機','戴爾','2899',default,default); insert into goods values(0,'imac me086ch/a 21.5英寸一體電腦','臺式機','蘋果','9188',default,default); insert into goods values(0,'at7-7414lp 臺式電腦 linux )','臺式機','宏碁','3699',default,default); insert into goods values(0,'z220sff f4f06pa工做站','服務器/工做站','惠普','4288',default,default); insert into goods values(0,'poweredge ii服務器','服務器/工做站','戴爾','5388',default,default); insert into goods values(0,'mac pro專業級臺式電腦','服務器/工做站','蘋果','28888',default,default); insert into goods values(0,'hmz-t3w 頭戴顯示設備','筆記本配件','索尼','6999',default,default); insert into goods values(0,'商務雙肩揹包','筆記本配件','索尼','99',default,default); insert into goods values(0,'x3250 m4機架式服務器','服務器/工做站','ibm','6888',default,default); insert into goods values(0,'商務雙肩揹包','筆記本配件','索尼','99',default,default);
  • 查詢類型cate_name爲 '超極本' 的商品名稱、價格
select name,price from goods where cate_name = "超級本";
  • 顯示商品的種類
select distinct cate_name from goods;
select cate_name from goods group by cate_name;
select cate_name,group_concat(name) from goods group by cate_name;
  • 求全部電腦產品的平均價格,而且保留兩位小數
select round(avg(price),2) as "平均價格" from goods;
  • 顯示每種商品的平均價格
select cate_name,round(avg(price),2) from goods group by cate_name;
  • 查詢每種類型的商品中 最貴、最便宜、平均價、數量
select cate_name,max(price) as "最貴",min(price) as "最便宜",avg(price) as "平均",count(*) from goods group by cate_name;
  • 查詢全部價格大於平均價格的商品,而且按價格降序排序
select * from goods where price > (select avg(price) from goods) order by price desc;
  • 查詢每種類型中最貴的電腦信息

 

 

-- 建立商品分類表
create table if not exists goods_cates( id int unsigned primary key auto_increment, name varchar(40) not null );
相關文章
相關標籤/搜索