持续更新,mysql的复习强化路
數據庫與表的基本操作
了解結構化查詢語言SQL
sql是結構化查詢語言,是一門標準的計算機語言,用于訪問和操作數據庫,其主能包括數據定義、數據操縱、數據查詢和數據控制
sql已稱為RDBMS的標準語言,單不同的RDBMS使用的SQL版本有一些差異。
按功能用途可以將sql語言分為4類: ddl、dml、dql、dcl
- DDL(數據定義語言) :用于數據庫、表視圖等的建立、刪除包括CREATE、ALTER、DROP
- DML(數據操縱語言):用于添加、刪除和修改數據表中的記錄包括: INSERT、DELETE、UPDATE
- DCL(數據控制語言):包括數據庫對象的權限管理和事務管理包括:COMMIT、ROLLBACK、GRANT
- DQL(數據查詢語言):查詢是數據庫的基本功能包括: SELECT
掌握數據庫相關操作
DDL之數據庫
創建數據庫
刪除數據庫
DROP DATABASE 數據庫名展示數據庫
show databases;查看自己當前在哪個數據庫下工作
select database();存儲引擎,就是如何存儲數據、如何更新數據、如何查詢數據、如何為存儲的數據建立索引等一系列技術的實現方法
查看mysql支持的存儲引擎
| MyISAM | 擁有較快的插入、查詢速度,但不支持事務 |
| InnoDB | 支持ACID事務,支持行級鎖,支持外鍵;MySQL 5.5版本之后默認存儲引擎 |
| MRG_MYISAM | 將一組結構相同的MyISAM表聚合成一個整體,再進行增刪改查操作。 |
| Memory | 所有數據存儲再內存中,響應快,MySQL重啟時數據會全部丟失 |
| Archive | 歸檔,且有壓縮機制,適用于歷史數據歸檔 |
| CSV | 邏輯上由逗號分隔數據,會為每張表創建一個.csv文件。 |
在創建數據表時、準確的定義字段的數據類型比較重要
數值類型
| tinyint | 1 | 小整數值,如狀態 |
| smallint | 2 | 大整數值 |
| mediumint | 3 | 大整數值 |
| int | 4 | 大整數值 |
| bigint | 8 | 極大整數值 |
| float | 4 | 單精度浮點數值 |
| double | 8 | 雙精度浮點數值 |
| decimal | max(D+, M+) | 含小數值,例如金額 |
日期和時間類型
| date | 3 | YYYY-MM-DD |
| time | 3 | HH:MM:SS |
| year | 1 | YYYY |
| datetime | 8 | YYYY-MM-DD HH:MM:SS |
| timestamp | 8 | YYYYMMDDHHMMSS |
字符串類型
| char | 0~255 | 定長字段串 |
| varchar | 0~65535 | 變長字符串 |
| text | 0~65535 | 長文本數據 |
| blob | 二進制形式文本數據 |
在DDL中對數據表的操作主要有3種: 創建、修改、刪除
創建數據表,需要定義的信息主要包括: 表名、字段名、字段類型
mysql的建表語法
create [temporary] table [if not exists] table_name [(create_definition,...)] [table_options][select_statement]temporary:臨時表,會話結束自動消失
create_definition:定義表種各列屬性
table_options:表配置,如存儲引擎、字符集
select_statement: 通過select語句建表
示例建表
查看表
show tables;查看表結構
desc contacts;增加表結構
alter table contacts add sex char(1);修改表結構
alter table contacts modify sex int;刪除表結構
alter table contacts drop column sex;刪除表
drop table contacts;INSERT插入單條數據
INSERT插入多條數據
INSERT INTO table_name(field1,field2,...,fieldN) VALUES (valueA1,valueA2,...,valueAN),(valueB1,valueB2,...,valueBN);注意事項:
- 如果字段是字符型,值必須適用單引號或者雙引號,如"value";如果值本身就有引號,需要轉義
- 如果所有列都要添加數據,insert into 語句可以不指定列,即INSERT INTO table_name VALUES (valueA1,valueA2,…,valueAN);
updata語法:
注意事項:
- 可以同時更新一個或多個字段
- 可以通過where子句來指定更新范圍,如果不帶where,則更新數據表中所有記錄。
delete from table_name [WHERE Clause]
注意事項:
- 可以通過where子句來指定刪除范圍,如果不帶where,則刪除數據表中所有記錄
示例總結:
建表
插數據
insert into contacts(name,sex,phone) values("張三",1,"13200000001") insert into contacts(name,sex,phone) values("xiong\'s",1,"13200000002") // 有默認值的字段,可以不賦值也行的哈~ insert into contacts(name,sex,phone) values("李四",1,"13200000003"),("王五",1,"13200000004");修改(更新表)
update contacts set sex = 2;updata contacts set sex = 1 where name="張三";updata contacts set sex = 2, phone="13200000005" where name="張三";刪除表內容
delete from contacts where id =4; delete from contacts;數據完整性是指存儲在數據庫中的數據,應該保持一致性和可靠性
關系模型允許定義三類數據約束,他們是事提完整性、參照完整性、以及用戶定義的完整性約束、其中前兩種完整性約束由關系數據庫系統自動支持
- 實體完整性: 實體就是現實世界中的某個對象,RDBMS中一行代表一個實體,實體完整性就是保證每一個實體都能被區別
- 域完整性: 域完整性主要是對列的輸入有要求,通過限制列的數據類型、格式或值的范圍來實現
- 參照完整性: 主要是表與表之間的關系、可以通過外鍵來實現
- 用戶自定義完整性: 借助存儲過程和觸發器實現
實體完整性: 要求每張表都有唯一標識符,每張表中的主鍵字段不能為空且不能重復
域完整性: 針對某一具體關系數據庫條件,保證表中某些列不能輸入無效值
約束方法: 限制數據類型、檢查約束、默認值、費控約束
參照完整性: 要求關系中不允許引用不存在的實體
用戶自定義完整性: 反應某一具體應用所涉及的數據必須滿足語義要求。
唯一性約束
在Mysql中可以適用關鍵字UNIQUE實現字段的唯一性約束,從而保證實體完整性
- unique意味著任何兩條數據的同一個字段不能有相同值
- 一個表中可以有多個unique約束
外鍵約束
外鍵(FOREIGN KEY)約束定義了表之間的一致性關系,用于強制參照完整性。外鍵約束定義了對同一個表或者其他表的列的引用,這些列具有PRIMARY KEY 或者 UNIQUE約束。
數據庫與表的基本操作
查詢所有
條件查詢
select name, id_number from person select name,id_num from from person where name="張三";工具用法 (科普):
select 8*9;在sql中,insert、updata、delete和select后面都能帶where子句,用于插入、刪除、修改或查詢指定條件的記錄
sql語句中適用where子句用法
select column_name from table_name where column_nam 運算符 value| = | 等于 |
| <>或!= | 不等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| >= | 小于等于 |
| between and | 選取介于兩個值之間的數據范圍;在Mysql中,相當于>=并且<= |
在where子句中,適用and、or可以把兩個或多個過濾條件結合起來
and、or運算符語法
select column_name from table_name where condition1 and condition2 or condition3| and | 表示左右兩邊的條件同時成立 |
| or | 表示左右兩邊只要有一個條件成立 |
案例演示:
use mydb;create table employee(id int not null auto_increment primary key,name varchar(30) comment "姓名",sex varchar(1) comment "性別",salary int comment "薪資(元)" );insert into employee(name,sex,salary) values("張三",'男',5500); insert into employee(name,sex,salary) values("李潔",'女',4500); insert into employee(name,sex,salary) values("李小梅",'女',4200); insert into employee(name,sex,salary) values("歐陽輝",'男',7500); insert into employee(name,sex,salary) values("李芳",'女',8500); insert into employee(name,sex,salary) values("張江",'男',6800); insert into employee(name,sex,salary) values("李四",'男',12000); insert into employee(name,sex,salary) values("王五",'男',3500); insert into employee(name,sex,salary) values("馬小龍",'男',6000); insert into employee(name,sex,salary) values("龍五",'男',8000); insert into employee(name,sex,salary) values("馮小芳",'女',10000); insert into employee(name,sex,salary) values("馬小花",'女',4000);# 單條件查詢男性工資 select * from employee where sex = "男"; select * from employee where sex != "女"; select * from employee where sex <> "女"; select * from employee where salary >= 10000; select * from employee where salary between 10000 and 12000;# 多條件,性別為男并且薪資大于等于10000 select * from employee where sex = "男" and salary >=10000;# 多條件,男性員工中,大于10000 或者 小于4000 select * from employee where sex = "男" and salary <=4000 or salary >=10000; # 以上錯誤寫法 or作用域它左右兩邊 select * from employee where sex = "男" and (salary <=4000 or salary >=10000);運算符in允許我們在where子句中過濾某個字段的多個值
where 子句中使用in語法
select column_name from table_name where column_name in (value1,value2,...)where子句使用like語法
select column_name from table_name where column_name like "%value%"說明:
- like子句中的%類似于正則表達式中的*,匹配任意0個或多個字符
- like子句中的_匹配任意單個字符
- like子句如果沒有%和_就相當于運算符=的效果
示例代碼:
# 選擇id是1或者2或者3的 select * from emplyee where id=1 or id=2 or id=3; select * from emplyee where id in(1,2,3); #篩選張三 select * from emplyee where name like "張三"; # 篩選姓李的用戶 select * from emplyee where name like "李%"; # 篩選名字芳結尾的 select * from emplyee where name like "%芳";我們通常說的Mysql函數指的是Mysql數據庫提供的內置函數,包括數學函數,字符串函數,日期和時間函數,聚合函數條件判斷函數等,這些內置函數可以幫助用戶更加方便地處理表中的數據,簡化用戶操作
| 數學函數 | ABS、SQRT、MOD SIN COS TAN COT等 |
| 字符串函數 | length lower upper trim substring |
| 日期時間函數 | now curdate curtime sysdate data_format yera month week |
| 聚合函數 | count sum avg min max |
| 條件判斷函數 | if ifnull case when 等 |
| 系統信息函數 | version database user等 |
| 加密函數 | md5 |
函數now()
應用場景:
在實際應用中,大多數業務表都會帶一個創建時間,create_time字段,用于記錄每一條數據的產生時間,在向表中插入數據時,就可以在insert語句中使用now()函數
date_format()
應用場景:
在實際應用中,一般會按標準格式存儲日期/時間,如:2020-05-26 20:41:16. 在實際的查詢中,又可能有其他的格式要求,這時候就需要采用date_format()函數進行格式轉換。
select name,date_format(birthday,'%Y%m%d') from user;
聚合函數
聚合函數是對一組值進行計算,并返回單個值。
Mysql常用的聚合函數有5個,分別count、sum、avg、min和max.
示例代碼:
# 男性數據有多少條 select count(*) from employee where sex = '男'; # 員工表里面的總薪資 select sum(salary) from employee; # 最低薪水 select min(salary) from employee; # 平均薪資 select avg(salary) from employee;如果有一條數據的工資為NULL它會自動把這條數據整體過濾掉。
ifnull()
函數ifnull()用于處理NULL值
ifnull(v1,v2)如果V1的值不為NULL,則返回v1否則返回V2.
示例代碼:
insert into employee(name,sex,salary) values("張熊","男",null);case when
case when 是流程控制語句,可以在sql語句中使用case when來獲取更加準確和直接的結果,sql中的case when類似于編程語句中的if else 或者switch
case [col_name] when [value1] then [result1]...else [default] end case when [expr] then [result1]...else[default] end如
select id,name,case sexwhen '男' then 'F'when '女' then 'M'else ''end as sex, salary from employee;我們已經掌握使用select語句結合where查詢條件獲取需要的數據,但是在實際應用中,還會遇到下面這類需求,又該如何解決?
- 學生按升高從高到低進行排序
- 雙十一交易量排行榜
- 博客中的文章按先后順序顯示
在sql中,使用order by對查詢結果集進行排序,可以按照一列或多列進行排序
order by語法
select column_name1,column_name2 from table_name1,table_name2 order by column_name,column_nam [asc|desc]說明: asc表示按升序排列,desc表示按降序排列
默認情況按升序排列
示例sql:
select * from employee order by salary desc; # 按兩個字段進行排序 select * from employee order by sex,salary desc; # 以上就是說 先按性別排序,就會先顯示女再顯示男,然后再按薪水排序,整體出現的情況,先按薪資從大到小顯示女員工信息,再按薪資從大到小顯示男員工薪資。在select語句中使用limit子句來約束要返回的記錄數,通常使用limit實現分頁
limit語法
select column_name1,column_name2 from table_name1,table_name2 limit [offset,]row_count說明: offset指定要返回的第一行的偏移量,第一行的偏移量是0,而不是1.row_count指定要返回的最大行數。這個offset對于新手來講,這個偏移量的說法很不友好我感覺,反正我第一次沒理解出來,就是從第幾條數據開始讀,讀多少條。 第一頁開始每頁顯示10條 limit 0,10
示例sql:
# 獲取前3條數據 select * from employee limit 3; # 分頁每頁顯示5條,顯示第一頁 select * from employee limit 0,5; # 分頁每頁顯示5條,顯示第二頁 select * from employee limit 5,5; # 分頁顯示每頁顯示5條,顯示第三頁 select * fromm employee limit 10,5;我們已經掌握使用select語句結合where查詢條件獲取需要的數據,但在實際的應用中,還會遇到下main這類需求,又該如何解決:
- 公司想知道每個部門有多少名員工
- 班主任想統計各科第一名的成績
- 某門店想掌握男、女性會員的人數及平局年齡
從字面上理解,group by表示根據某種規則對數據進行分組,它必須配合聚合函數進行使用,對數據進行分組之后需要進行count、sum、avg、max和min等聚合運算
group by語法
select column_name,aggregate_function(column_nam) from table_name group by column_nameaggregate_function表示聚合函數。
group by可以對一列或多列進行分組。
掌握having的應用場景及使用
在sql中增加having子句的原因是,where關鍵字無法與聚合函數一起使用,having子句可以對分組后的各組數據進行篩選
having語法
select column_name,aggregate_function(column_name) from table_name where column_name operator value group by column_name having aggregate_function(column_name) operator value示例sql:
# 把原有的employee表刪除了,創建這個表 create table employee(id int not null auto_increment primary key,name varchar(30) comment "姓名",sex varchar(1) comment "性別",salary int comment "薪資(元)",dept varchar(30) comment "部門" ); insert into employee(name,sex,salary,dept) values("張三", "男", 5500, "部門A"); insert into employee(name,sex,salary,dept) values("李潔", "女", 4500, "部門C"); insert into employee(name,sex,salary,dept) values("李小梅", "女", 4200, "部門A"); insert into employee(name,sex,salary,dept) values("歐陽輝", "男", 7500, "部門C"); insert into employee(name,sex,salary,dept) values("李芳", "女", 8500, "部門A"); insert into employee(name,sex,salary,dept) values("張江", "男", 6800, "部門A"); insert into employee(name,sex,salary,dept) values("李四", "男", 12000, "部門B"); insert into employee(name,sex,salary,dept) values("王五", "男", 3500, "部門B"); insert into employee(name,sex,salary,dept) values("馬小龍", "男", 6000, "部門A"); insert into employee(name,sex,salary,dept) values("龍五", "男", 8000, "部門B"); insert into employee(name,sex,salary,dept) values("馮小芳", "女", 10000, "部門C"); insert into employee(name,sex,salary,dept) values("馬小花", "女", 4000, "部門B"); insert into employee(name,sex,salary,dept) values("張熊", "男", 8800, "部門A");# 男性員工和女性員工的數量 select sex,count(*) from employee group by sex; # 統計每個部門的人數 select dept,count(*) from employee group by dept; # 知道每個工資薪水總和 select dept,sum(salary) from employee group by dept; # 每個部門薪資最高的 select dept,max(salary) from employee group by dept; # 每個部門薪資最低 select dept,min(salary) from employee group by dept; # 人數小于4個人的部門 select dept,count(*) from employee group by dept having count(*)<5;應用場景:
- 使用group by可以分組統計每個部門有多少員工。加入,除了統計每個部門的員工數量之外,還想知道具體是哪些員工(員工列表),又該怎么實現呢?
group_concat
group_concat配合group by一起使用,用于將某一列的值按指定的分隔符進行拼接,mysql默認的分隔符是逗號
select dept,group_concat(name) from employee group by dept;distinct用于在查詢中返回列的唯一不同值(去重復),支持單列或多列。在實際的應用中,表中的某一列含有重復值是很常見的,如employ表的dept列.如果在查詢數據時,希望得到某列的所有不同值,可以使用distinct
sql示例:
# 性別這列去重 select distinct sex from employee;create table footprint(id int not null auto_increment primary key,username varchar(30) comment '用戶名',city varchar(30) comment "城市",visit_date varchar(10) comment "到訪日期" );insert into footprint(username, city, visit_date) values("liufeng", "貴陽", "2019-12-05"); insert into footprint(username, city, visit_date) values("liufeng", "貴陽", "2020-01-15"); insert into footprint(username, city, visit_date) values("liufeng", "北京", "2018-10-10"); insert into footprint(username, city, visit_date) values("zhangsan", "上海", "2020-01-01"); insert into footprint(username, city, visit_date) values("zhangsan", "上海", "2020-02-02"); insert into footprint(username, city, visit_date) values("lisi", "拉薩", "2016-12-20");# 有多少用戶在footprint留下足跡 select distinct username from footprint; # 所有的用戶達到過哪些城市 select dictinct city from footprint; # 每一個用戶去過哪些地方 select distinct username,city from footprint;表連接(join) 是在多個表之間通過一定的連接條件,使表之間發生關聯,進而能從多個表之間獲取數據
表連接語法
select table1.column,table2.column from table1,table2 where table1.column1 = table2.column2;- 內連接 join 或inner join
- 外連接:左連接 left join,右連接 right join 全連接 full join
- 自然連接:同一張表內的連接
| 內連接 | 至連接匹配的行 | select A.c1,B.c2 from A join B on A.c3 = B.c3 |
| 左連接 | 包含左表的全部行(不管右表是否存在與之匹配的行), 以及右表中遍布匹配的行 | select A.c1,B.c2 from A left join B on A.c3 = B.c3 |
| 右連接 | 包含右表的全部行(不管左表是否存在與之匹配的行), 以及左表中遍布匹配的行 | select A.c1,B.c2 from A right join B on A.c3 = B.c3 |
| 全連接 | 包含左右兩個表的全部行(不管在另一個表中是否存在與之匹配的行) | select A.c1,B.c2 from A full join B on A.c3 = B.c3 |
全連接: mysql里面無
自連接時一種特殊的表連接,它是指互相連接的表在物理上同為一張表,但是邏輯上時多張表。自連接通常用于表中的數據有層次結構,如區域表、菜單表、商品分類等。
自連接語法
select a.column,b.column from table a,table b where a.column=b.column;示例sql:
drop table if exists area; drop table if exists area;create table area( id int not null auto_increment primary key comment '區域id', pid int not null comment '父id(0-省份)', name varchar(30) comment '區域名稱' );insert into area(id,pid,name) values(1,0,'貴州省'); insert into area(id,pid,name) values(2,1,'貴陽'); insert into area(id,pid,name) values(3,1,'遵義'); insert into area(id,pid,name) values(4,0,'廣東省'); insert into area(id,pid,name) values(5,4,'廣州'); insert into area(id,pid,name) values(6,4,'深圳');# 查出所有城市 select * from area where pid<>0; # 查出這些城市的父親id select A.id,A.name,B.name ad provinceName from area A, area B where A.pid = B.id and A.pid<>0;之前的課程中,我們已經學習過運算符IN,它允許我們在where子句中過濾某個字段的多個值。
where子句使用in語法
select column_name from table_name where column_name IN(value1,value2,...);如果運算符in后面的值式來源于某個查詢結果,并非是指定幾個值,這時就需要用到子查詢。子查詢又稱為內部查詢或嵌套查詢,即在sql查詢的where子句中嵌套查詢語句
子查詢in語法
select column_name from table_name where column_name IN(select column_name from table_name [where] );exists是子查詢中用于測試內部查詢是否返回任何行的布爾運算符。將主查詢的數據放到子查詢中做條件驗證,根據驗證結果(TRUE 或FALSE)來決定主查詢的數據結果是否保留
where子句使用exists語法
select column_name1 from table_name1 where exists (select * from table_name2 where condition);示例sql:
# 看下student表數據 select * from score;# 要用in做一個子查詢 查詢所有選修了課程的學生 select A.* from student A where A.stu_no in(select B.stu_no from score B);# 查詢選修了離散數學的學生 select A.* from student A where A.stu_no in (select B.stu_no from score B where B.course='離散數學')# 要用exists做一個子查詢 查詢所有選修了課程的學生 select A.* from student A where exists(select * from score B where A.stu_no = B.stu_no); # 這個exists說一點個人的理解,先看子查詢里面的東西,也就是說子查詢查詢出來了一個表,這個時候就是說,A表查詢出來的數據,在查詢出來的這個表中存在就能輸出出來,不存在就不能輸出。總結
以上是生活随笔為你收集整理的持续更新,mysql的复习强化路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用python和递归实现赶鸭子问题
- 下一篇: 第九章——规范数据库设计