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 );