@Mrliang123
2022-02-28 22:42
字數 15802
閱讀 0
MySQL
產品
簡介
即市場占有率最大的關系型數據庫,類似於excel表格
DML:select、insert、update、delete
DDL:drop、create等
分類
常用的關系型數據庫:Oracle、Microsoft SQL Server、MySQL、SQLite
常用的非關系型數據庫(NoSQL,Key-Value 的方式存儲數據):MongoDB、Redis
MySQL主從復制原理詳解
主:打開binlog日志,並設置server id號(默認為1),創建主從復制賬號;
從:打開中繼日志(relay log),設置server id號(非1的任何數字);向主發送驗證信息,激活主從復制,開啟長連接。
從:從IO線程實時監聽主的二進制日志,如有變化,便向主發送信息。
主:主IO線程將從需要的的二進制日志對應位置之后的日志復制出來發送給從,並發送新的文件名和位置。
從:將新的文件名和位置記錄在master.info中,將主復制的內容放入中繼日志中。
從:從的SQL線程將每次解析的中繼日志的位置記錄在relay-log.info文件中,並解析中繼日志,把每條命令寫入到data目錄中。
數據庫設計
三大范式
1、列的原子性,不可拆分
2、每個表必須有一個主鍵且非主鍵字段必須完全依賴主鍵
3、非主鍵字段必須直接依賴主鍵,不能傳遞依賴
E-R模型
可以考慮通過power designer,db desinger等軟件來建模,從而達到相關的設計
實體: 用矩形表示,並標注實體名稱
屬性: 用橢圓表示,並標注屬性名稱
關系: 用菱形表示,並標注關系名稱
關系共分為三種
1、一對一
在表A或表B中創建一個字段,存儲另一個表的主鍵值
2、一對多
在多的一方表(學生表)中創建一個字段,存儲班級表的主鍵值
3、多對多
新建一張表C,這個表只有兩個字段,一個用於存儲A的主鍵值,一個用於存儲B的主鍵值
數據類型和約束
數據類型
指存儲的數據類型,共分為:
- 整數:int,bit
- 小數:decimal
如 decimal(5, 2) 表示共存5位數,小數占 2 位 - 字符串:varchar,char,text
varchar表示可變長度的字符串,如varchar(3),填充'ab'時就會存儲'ab',3表示字符數
char表示固定長度的字符串,如char(3),如果填充'ab'時會補一個空格為'ab ',3表示字符數
字符串 text 表示存儲大文本,當字符大於 4000 時推薦使用 - 日期時間: date(年月日), time(時分秒), datetime(年月日時分秒)
- 枚舉類型(enum),用法:
enum('男','女')
數據類型附錄表
1、整數類型
2、字符串
3、時間類型
數據約束
在數據類型的基礎上再增加額外的要求
常見的約束:
- 主鍵 primary key:即id號,唯一的,標識數據記錄,用於區分不同記錄數據
- 自增 auto_increment:自增,用於id號從小到大自增
- 非空 not null: 此字段不允許填寫空值.
- 惟一 unique: 此字段的值不允許重復.
- 默認 default: 當不填寫字段對應的值會使用默認值,如果填寫時以填寫為准.
- 外鍵 foreign key: 即使用某個表中的主鍵數據,可用於連表查詢
事務
什么是事務
- 一個最小的不可分割的單元,邏輯上的一組操作,通常一個事務對應一個完整的業務,為一組sql語句,要么成功,要么失敗
- 一個完整的由多個批量的DML(select、insert、update、delete)語句組成
- 事務只和DML語句有關
- 事務未成功之前只是在內容中完成記錄,只有事務結束后才會記錄到硬盤中
- 只有InnoDB引擎才能使用事務
引擎
常用的存儲引擎為:InnoDB和MyISAM。InnoDB支持事務,MyISAM不支持事務但是訪問速度快
提交事務
開啟事務后變更的數據會保存到緩存中,而不是落地,mysql默認采用自動提交事務模式,即autocommit
模式,不需要手動,可直接落地
set autocommit = 0 表示取消自動提交事務模式,此為臨時模式,關閉會話后自動取消,需手動執行commit
完成事務的提交,將緩存落地,也可以rollback
取消緩存,回到事務前的狀態
開啟事務begin
后,也需要commit
提交事務
術語
- 開啟事務:Start Transaction或者
begin;
- 結束事務:End Transaction
- 提交事務:Commit Transaction
- 回滾事務:Rollback Transaction
事務的特性-ACID
如銀行轉賬,每個轉賬的步驟都有多個sql執行,若執行一半后出現斷電等情況就會導致只執行了一半,從而出現了一些數據丟失的情況出現,為防止此類發生需通過事務來解決,事務能保證數據的合法性
- 原子性
最小單元,無法再次分割,要么全部成功,要么全部失敗(如A向B轉賬200,此事務要不成功要不失敗)- 一致性
執行事務之前和之后必須處於一致(如A向B轉賬,若系統崩潰則此事務不會提交到數據庫中,不會丟失數據)
- 不一致的三種情況
- 臟讀
一個事務運行期間讀取了另一個未提交的事務中的數據- 不可重復讀
一個事務運行期間查找相同的表讀取到不同的數據,可以通過行級鎖防止該數據被更改或刪除- 幻讀
一個事務運行期間查找相同的表讀取到新增的數據,通過表級鎖來防止新增數據或者加上間隙鎖(next-key lock)- 隔離性
多個並發的事務之間相互隔離,比如多個用戶操作同一張表,數據庫為每個用戶開啟的事務不能被其他事務干擾,如:轉賬這個事務未成功時,若其他匯款程序開始執行,則看到是原數據- 持久性
永久存儲到硬盤中,即使系統崩潰也無影響
事務隔離的級別(select @@tx_isolation)
- 未提交讀-Read-Uncommitted(0級)
即能夠讀取到沒有提交的數據,無法解決臟讀、不可重復度、幻讀任何一種 - 已提交讀-Read-Committed(1級)
即能夠讀取到已經提交的數據,寫數據會鎖住對應的行,只能解決臟讀 - 可重復讀-Repeatable-Read(2級)
當讀取了一條數據,這個事務不結束其他事務就無法更改此數據,解決了臟讀、不可重復度 - 串行化-Serializable(3級)
高並發多個事務時,只有運行完一個事務后才能運行其他事務,讀寫數據會鎖住整個表,效率差
鎖機制
- 表級鎖
一次只能有一個事務可以訪問- 行級鎖(InnoDB)
並非鎖住一行,主要加在索引上- 頁面鎖
mysql安裝
ubuntu安裝
service端安裝:sudo apt-get install mysql-server
client端安裝:sudo apt-get install mysql-client
默認配置文件路徑: /etc/mysql/mysql.conf.d/mysqld.cnf
存儲位置:/var/lib/mysql
錯誤日志: /var/log/mysql/error.log
配置
- 遠程連接
1、需注釋/etc/mysql/mysql.conf.d/mysqld.cnf中的bind-address=127.0.0.1
2、更改mysql庫中的user表,將對應的用戶改為%
,如update user set host = '%' where user='root'
3、重啟mysql,service mysql restart
常用sql語句
語法 | 解釋 |
---|---|
select now(); | 顯示當前時間 |
show databases; | 顯示所有數據庫 |
show tables; | 查看數據庫中的表 |
show engines; | 查看數據庫支持的表的存儲引擎 |
show master status; | 查看當前binlog的位置 |
show create table 表名; | 查看創建表的sql語句 |
show create database 庫名; | 查看創建庫的sql語句 |
show index from 表名; | 查看表中已有索引 |
create database 庫名 charset=utf8; | 創建數據庫,並使用 |
drop database 庫名; | 刪除數據庫,drop無法回滾 |
drop table 表名; | 刪除數據表 |
truncate table 表名; | 清空表數據 |
alter table 表名 add 列名 類型 約束; | 添加列名、類型、約束 |
alter table 表名 modify 列名 類型 約束; | 修改字段類型和約束,不能改列名 |
alter table 表名 change 原列名 新列名 類型 約束; | 修改類型、約束、列名 |
alter table 表名 drop 列名; | 刪除指定列名 |
alter table old_表名 rename as new_表名; | 更改表名 |
alter table students engine='MyISAM'; | 更改表引擎 |
alter table 表名 add index 索引名(列名, ..) | 創建索引 |
alter table 表名 drop index 索引名 | 刪除索引 |
desc 表名; | 查看表結構 |
use 庫名; | 使用數據庫 |
create table 表名(字段名1 數據類型 約束條件,字段2 數據類型 約束條件...); | 創建表,並指定表字段 |
create table 表名 like 已有表名; | 創建與現有表一樣字段的新表 |
create table 表名 select * from 現有表 where...(查詢語句); | 將查詢結果創建新表 |
insert into 表名 value(...) | 全列插入,值的順序需和表結構一一對應,主鍵列是自動增長的,但需要(0/null/default)這些空值來占位,若有默認值的列位則使用default占位 |
insert into 表名 value(值1,值2,值3...),(值1,值2,值3....) | 全列多行插入 |
insert into 表名(列1,列2...) values(值1,值2...) | 部分列插入,值的順序要和列名對應 |
insert into 表名(列1,列2...) value(值1,值2..),(值1,值2...) | 部分列多行插入 |
insert into 表名(列1) select .. | 把查詢結果插入到指定表中,也就是表復制。 |
delete from 表名 where 條件=字段; | 刪除表數據中的指定行,盡量使用邏輯刪除,即加一列用作標識字段 |
update 表名 set 列1=值1,列2=值2 where 條件=字段; | 更改數據 |
update 多表查詢結果(不包含select * from) set 表1=列1=表2.列2; | 將多表查詢的結果批量更新,即將查詢結果看出一整個表進行操作 |
select database(); | 查看當前使用的數據庫 |
flush logs; | 生成新的binlog文件 |
source 絕對路徑 | 導入具體的sql語句 |
system clear; | 清屏 |
set profiling=1; | 開啟運行時間檢測 |
show profiles; | 查看sql運行時間 |
實踐
- 創建數據庫
create database pythontest charset=utf8;
- 創建表並設置相關字段
create table students( id int unsigned primary key auto_increment not null,
name varchar(10) not null,
age tinyint unsigned default 0,
height decimal(5,2),
gender enum('男','女'),
s_id int unsigned not null,
foreign key(s_id) references class(id);
);- 查看表字段
desc 表名
- 添加列,並指定類型、約束
alter table students add birthday datetime;
- 修改列名、類型、約束
alter table students change birthday birth date not null;
- 刪除列名
alter table students drop birth;
索引
- 索引也就是一個鍵值對,是一個特殊的文件,可以提高查詢速率
- 經常查詢的表可以創建索引,但是經常更新的表不建議加索引
- 自動創建索引的兩種方式:1、主鍵會自動創建索引;2、外鍵約束會自動創建
- 創建索引,若不知道索引名,默認使用列名
alter table 表名 add index 索引名(列名, ..);
- 查看表中已有索引
show index from 表名;
- 刪除索引
查看索引名:show create table 表名;
刪除索引:alter table 表名 drop index 索引名
聯合索引
即一個索引覆蓋兩個或多個字段,為減少磁盤空間,可以使用聯合索引
創建聯合索引:alter table teacher add index (列1,列2...);
最左原則:即index(name,age)支持name、name和age組合查詢,而不支持單獨age查詢,因為沒有用到創建的聯合索引
-- 下面的查詢使用到了聯合索引
select * from stu where name='張三' -- 這里使用了聯合索引的name部分
select * from stu where name='李四' and age=10 -- 這里完整的使用聯合索引,包括 name 和 age 部分
-- 下面的查詢沒有使用到聯合索引
select * from stu where age=10 -- 因為聯合索引里面沒有這個組合,只有 name | name age 這兩種組合
where查詢
比較運算符
用法(id大於3的列舉):select * from 表名 where id >3;
等於: =
大於: >
大於等於: >=
小於: <
小於等於: <=
不等於: != 或 <>
邏輯運算符
and(都滿足)、or(部分滿足)、not(取反)
示例:select * from 表名 where id > 3 and gender='女';
select * from 表名 where not (id > 3 and gender='女');
范圍查詢
- 連續范圍內:
between .. and ..
如:查詢編號為3至8的學生:select * from students where id between 3 and 8;
- 非連續范圍內:in
如:查詢編號為3,5,7的學生:select * from students where id in (3,5,7);
查詢編號不為3,5,7的學生:select * from students where id not in (3,5,7);
模糊查詢
like表示模糊查詢的關鍵字,%表示多個任意字符,_表示任意一個字符
如:select * from students where name like '諸葛%';
空判斷查詢
查詢非空的數據,null無法直接作為關鍵字查詢
為空is null
;非空is not null
如:select * from 表名 where height is null
進階查詢
分頁查詢
limit后第一個參數默認是0,表示開始行索引(索引都是從0開始的),第二個是查詢條數
用法:每頁顯示m條數據,求第n頁顯示的數據 select * from xxx limit (n-1)*m,m
排序
排序需使用order by;asc 升序,默認,desc 從大到小排序
示例:顯示所有信息,先按照列1倒序,若列1字符相同則使用列2倒序 select * from 表名 where 條件 order by 列1 desc,列2 desc
聚合函數
聚合函數又稱組函數,一般結合分組(group by)來使用
- count(col): 表示求指定列的總行數,常用*替換指定的字段做統計,若需指定字段統計建議使用主鍵
示例:返回非NULL數據的總行數select count(*) from students;
- max(col): 表示求指定列的最大值
示例:查詢女生的編號最大值select max(id) from students where gender = 2;
- min(col): 表示求指定列的最小值
示例:查詢未刪除的學生最小編號select min(id) from students where is_delete = 0;
- sum(col): 表示求指定列的和
示例:查詢男生的總身高select sum(height) from students where gender = 1;
- avg(col): 表示求指定列的平均值
示例:求男生的平均身高, 聚合函數不統計null值,平均身高有誤select avg(height) from students where gender = 1;
- ifnull:表示判斷指定字段是否為空值(null、0、default),若為空使用自己提供的值,聚合函數默認忽略字段為空的值
示例:求男生的平均身高, 包含身高是null的select avg(ifnull(height,0)) from students where gender = 1;
分組查詢
用於對查詢的結果按照指定字段進行分組,相同字段的結果分為一組,若指定了分組字段,查詢時只能用指定分組字段
語法格式:GROUP BY 列名 [HAVING 條件表達式] [WITH ROLLUP]
having表示對分組后的數據進行過濾,類似於where
with rollup表示
- group by + group_concat()常用於對分組的內容進行聚合,每個信息之間用逗號分割
select gender,group_concat(name) from students group by gender;
+--------+----------------------------------------------+
| gender | group_concat(name) |
+--------+----------------------------------------------+
| 男 | 張飛,關羽,劉備,曹操,諸葛亮,周瑜 |
| 女 | 黃蓉,聶小倩 |
+--------+----------------------------------------------+
2 rows in set (0.00 sec)
- 和聚合函數配合,統計不同性別的人數
select gender,count(*) from students group by gender;
+--------+----------+
| gender | count(*) |
+--------+----------+
| 男 | 6 |
| 女 | 2 |
+--------+----------+
2 rows in set (0.00 sec)
- 和having配合,根據gender字段進行分組,統計分組條數大於2的
select gender,count(*) from students group by gender having count(*)>2;
+--------+----------+
| gender | count(*) |
+--------+----------+
| 男 | 6 |
+--------+----------+
1 row in set (0.01 sec)
- 和with rollup配合,在最后加一行,為聚合函數進行匯總數據
select gender,group_concat(name) from students group by gender with rollup;
+--------+---------------------------------------------------------------+
| gender | group_concat(name) |
+--------+---------------------------------------------------------------+
| 男 | 張飛,關羽,劉備,曹操,諸葛亮,周瑜 |
| 女 | 黃蓉,聶小倩 |
| NULL | 張飛,關羽,劉備,曹操,諸葛亮,周瑜,黃蓉,聶小倩 |
+--------+---------------------------------------------------------------+
3 rows in set (0.00 sec)
多表查詢
內連接
查詢兩個表的共有字段
用法:select 字段 from 表1 inner join 表2 on 表1.字段1 = 表2.字段2
inner join 表示連接兩個表;on表示連接條件
mysql> select * from students;
+----+-----------+------+--------+--------+----------+
| id | name | age | height | gender | class_id |
+----+-----------+------+--------+--------+----------+
| 1 | 張飛 | 55 | 1.75 | 男 | 1 |
| 2 | 關羽 | 58 | 1.85 | 男 | 2 |
| 3 | 劉備 | 60 | 1.75 | 男 | 1 |
| 4 | 曹操 | 58 | 1.85 | 男 | 2 |
| 5 | 諸葛亮 | 56 | 1.70 | 男 | 1 |
| 6 | 周瑜 | 50 | 1.80 | 男 | NULL |
| 7 | 黃蓉 | 26 | 1.68 | 女 | NULL |
| 8 | 聶小倩 | 25 | 1.65 | 女 | NULL |
+----+-----------+------+--------+--------+----------+
8 rows in set (0.00 sec)
mysql> select * from class;
+----+------+
| id | name |
+----+------+
| 1 | 1班 |
| 2 | 6班 |
+----+------+
2 rows in set (0.00 sec)
mysql> select s.name,c.name from students as s inner join class as c on s.class_id=c.id;
+-----------+------+
| name | name |
+-----------+------+
| 張飛 | 1班 |
| 關羽 | 6班 |
| 劉備 | 1班 |
| 曹操 | 6班 |
| 諸葛亮 | 1班 |
+-----------+------+
5 rows in set (0.00 sec)
左連接
用法:elect 字段 from 表1 left join 表2 on 表1.字段1 = 表2.字段2
以左表為主根據條件查詢右表數據,如果根據條件查詢右表數據不存在使用null值填充
select * from students s left join class c on s.class_id=c.id;
+----+-----------+------+--------+--------+----------+------+------+
| id | name | age | height | gender | class_id | id | name |
+----+-----------+------+--------+--------+----------+------+------+
| 1 | 張飛 | 55 | 1.75 | 男 | 1 | 1 | 1班 |
| 3 | 劉備 | 60 | 1.75 | 男 | 1 | 1 | 1班 |
| 5 | 諸葛亮 | 56 | 1.70 | 男 | 1 | 1 | 1班 |
| 2 | 關羽 | 58 | 1.85 | 男 | 2 | 2 | 6班 |
| 4 | 曹操 | 58 | 1.85 | 男 | 2 | 2 | 6班 |
| 6 | 周瑜 | 50 | 1.80 | 男 | NULL | NULL | NULL |
| 7 | 黃蓉 | 26 | 1.68 | 女 | NULL | NULL | NULL |
| 8 | 聶小倩 | 25 | 1.65 | 女 | NULL | NULL | NULL |
+----+-----------+------+--------+--------+----------+------+------+
右連接
用法:select 字段 from 表1 right join 表2 on 表1.字段1 = 表2.字段2
以右表為主根據條件查詢左表數據,如果根據條件查詢左表數據不存在使用null值填充
insert into class value(0,'9班');
Query OK, 1 row affected (0.00 sec)
select * from students s right join class c on s.class_id=c.id;
+------+-----------+------+--------+--------+----------+----+------+
| id | name | age | height | gender | class_id | id | name |
+------+-----------+------+--------+--------+----------+----+------+
| 1 | 張飛 | 55 | 1.75 | 男 | 1 | 1 | 1班 |
| 2 | 關羽 | 58 | 1.85 | 男 | 2 | 2 | 6班 |
| 3 | 劉備 | 60 | 1.75 | 男 | 1 | 1 | 1班 |
| 4 | 曹操 | 58 | 1.85 | 男 | 2 | 2 | 6班 |
| 5 | 諸葛亮 | 56 | 1.70 | 男 | 1 | 1 | 1班 |
| NULL | NULL | NULL | NULL | NULL | NULL | 3 | 9班 |
+------+-----------+------+--------+--------+----------+----+------+
6 rows in set (0.00 sec)
自連接
將一張表模擬成左右兩張表,然后進行連表查詢
mysql> create table areas(id varchar(30) not null primary key,title varchar(30) not null,pid varchar(30));
mysql> source /home/python/Desktop/areas.sql
mysql> select c.id as 省id,c.title as 省市名,c.pid as 市id,p.title as 省名 from tb_areas c inner join tb_areas p on c.pid=p.id where p.title='山西省';
+--------+-----------+--------+-----------+
| 省id | 省市名 | 市id | 省名 |
+--------+-----------+--------+-----------+
| 140100 | 太原市 | 140000 | 山西省 |
| 140200 | 大同市 | 140000 | 山西省 |
| 140300 | 陽泉市 | 140000 | 山西省 |
| 140400 | 長治市 | 140000 | 山西省 |
| 140500 | 晉城市 | 140000 | 山西省 |
| 140600 | 朔州市 | 140000 | 山西省 |
| 140700 | 晉中市 | 140000 | 山西省 |
| 140800 | 運城市 | 140000 | 山西省 |
| 140900 | 忻州市 | 140000 | 山西省 |
| 141000 | 臨汾市 | 140000 | 山西省 |
| 141100 | 呂梁市 | 140000 | 山西省 |
+--------+-----------+--------+-----------+
11 rows in set (0.01 sec)
mysql> select c.id as 省id,c.title as 省市名,c.pid as 市id,p.title as 省名 from tb_areas c inner join tb_areas p on c.pid=p.id where c.title='運城市';
+--------+-----------+--------+-----------+
| 省id | 省市名 | 市id | 省名 |
+--------+-----------+--------+-----------+
| 140800 | 運城市 | 140000 | 山西省 |
+--------+-----------+--------+-----------+
1 row in set (0.00 sec)
子查詢
在一個select語句中,嵌入了另外一個select語句,那么被嵌入的select語句稱之為子查詢語句,外部那個select語句則稱為主查詢。子查詢為一個完整的sql語句,可以獨立存在的,放於()內;子查詢先執行,主查詢根據子查詢數據執行
補充
as
用於別名,方便展示
mysql> select name,age from students;
+--------+------+
| name | age |
+--------+------+
| 張飛 | 55 |
| 關羽 | 58 |
+--------+------+
2 rows in set (0.00 sec)
mysql> select name as 姓名,age as 年齡 from students as s;
+--------+--------+
| 姓名 | 年齡 |
+--------+--------+
| 張飛 | 55 |
| 關羽 | 58 |
+--------+--------+
2 rows in set (0.00 sec)
distinct
用於去重
實例:select distinct 列1,列2... from 表名
外鍵約束
添加外鍵約束:alter table 從表 add foreign key(外鍵字段) references 主表(主鍵字段);
刪除外鍵約束:
1、獲取外鍵約束名字:show create table 表名;
2、刪除外鍵約束:alter table 表名 drop foreign key 外鍵名;
實踐
數據准備
表結構說明:
id 表示主鍵 自增
name 表示商品名稱
cate_name 表示分類名稱
brand_name 表示品牌名稱
price 表示價格
is_show 表示是否顯示
is_saleoff 表示是否售完
-- 創建 "京東" 數據庫
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);
mysql> desc goods;
+------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(150) | NO | | NULL | |
| cate_name | varchar(40) | NO | | NULL | |
| brand_name | varchar(40) | NO | | NULL | |
| price | decimal(10,3) | NO | | 0.000 | |
| is_show | bit(1) | NO | | b'1' | |
| is_saleoff | bit(1) | NO | | b'0' | |
+------------+------------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
-- 創建商品分類表(因為只增加一個商品分類,但不寫入具體的商品信息,因此需再增加一個表)
create table good_cates(
id int not null primary key auto_increment,
name varchar(50) not null
);
-- 查詢goods表中商品的分類信息
select cate_name from goods group by cate_name;
-- 將查詢結果插入到good_cates表中
insert into good_cates(name) select cate_name from goods group by cate_name;
-- 添加移動設備分類信息
insert into good_cates(name) values('移動設備');
-- 查看goods表中的商品分類名稱對應的商品分類id
select * from goods g inner join goods_cates gs on g.cate_name = gs.name;
-- 將goods表中的分類名稱更改成商品分類表中對應的分類id,連接更新表中的某個字段
update goods g inner join goods_cates gs on g.cate_name = gs.name set g.cate_name = gs.id;
-- 通過create table ...select來創建商品品牌表並且同時插入數據,其中插入的數據需和創建的表名相同,可以用as改
create table good_brands(id int unsigned not null primary key auto_increment,name varchar(50) not null) select brand_name as name from goods group by brand_name;
-- 插入雙飛燕品牌
insert into goods_brands(name) values('雙飛燕');
-- 查看goods表中的商品品牌對應的商品品牌id
select * from goods g inner join goods_brands gs on g.brand_name = gs.name;
-- 將goods表中的品牌更改成品牌表中對應的品牌id,連接更新表中的某個字段
update goods g inner join goods_brands gs on g.brand_name = gs.name set g.brand_name = gs.id;
-- 通過alter table語句修改表結構,把cate_name改成cate_id,把brand_name改成brand_id
alter table goods change cate_name cate_id int not null,change brand_name brand_id int not null;
相關sql
- 查詢類型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 round(avg(price),2) from goods;
- 顯示每種商品的平均價格
select cate_name, avg(price) from goods group by cate_name;
select cate_name, round(avg(price),2) from goods group by cate_name;
- 查詢每種類型的商品中 最貴、最便宜、平均價、數量
select cate_name, max(price), min(price), avg(price), count(*) from goods group by cate_name
- 查詢所有價格大於平均價格的商品,並且按價格降序排序
select * from goods where price > (select avg(price) from goods) order by price desc;
- 將查詢結果插入到good_cates表中
insert into good_cates(name) select cate_name from goods group by cate_name;
@Mrliang123
2022-02-28 22:42
字數 15802
閱讀 0