查看版本:select version();顯示當前時間:select now();註意:在語句結尾要使用分號;遠程連接一般在公司開發中,可能會將資料庫統一搭建在一臺伺服器上,所有開發人員共用一個資料庫,而不是在自己的電腦中配置一個資料庫運行命令mysql -hip地址 -uroot -p-h後面寫... ...
- 註意:在語句結尾要使用分號;
- 一般在公司開發中,可能會將資料庫統一搭建在一臺伺服器上,所有開發人員共用一個資料庫,而不是在自己的電腦中配置一個資料庫
- 運行命令
- -h後面寫要連接的主機ip地址
- -u後面寫連接的用戶名
- -p回車後寫密碼
- 創建資料庫
- 刪除資料庫
- 切換資料庫
- 查看當前選擇的資料庫
- 查看當前資料庫中所有表
- 創建表
- auto_increment表示自動增長
create table 表名(列及類型);
如:
create table students(
id int auto_increment primary key,
sname varchar(10) not null
); - 修改表
- 刪除表
- 查看表結構
- 更改表名稱
- 查看表的創建語句
- 查詢
- 增加
- 主鍵列是自動增長,但是在全列插入時需要占位,通常使用0,插入成功後以實際數據為準
- 修改
- 刪除
- 邏輯刪除,本質就是修改操作update
- 進入超級管理員
- 進入mysql庫目錄
- 運行mysqldump命令
- 連接mysqk,創建資料庫
- 退出連接,執行如下命令
- 在select後面列前使用distinct可以消除重覆的行
- and
- or
- not
- 查詢編號大於3的女同學
- 查詢編號小於4或沒被刪除的學生
- like
- %表示任意多個任意字元
- _表示一個任意字元
- 查詢姓黃的學生
- 查詢姓黃並且名字是一個字的學生
- 查詢姓黃或叫靖的學生
- in表示在一個非連續的範圍內
- 查詢編號是1或3或8的學生
- between ... and ...表示在一個連續的範圍內
- 查詢學生是3至8的學生
- 查詢學生是3至8的男生
- 註意:null與''是不同的
- 判空is null
- 查詢沒有填寫地址的學生
- 判非空is not null
- 查詢填寫了地址的學生
- 查詢填寫了地址的女生
- 小括弧,not,比較運算符,邏輯運算符
- and比or先運算,如果同時出現並希望先算or,需要結合()使用
- 按照欄位分組,表示此欄位相同的數據會被放到一個組中
- 分組後,只能查詢出相同的數據列,對於有差異的數據列無法出現在結果集中
- 可以對分組後的數據進行統計,做聚合運算
- 語法:
- 查詢男女生總數
- 查詢各城市人數
- 語法:
- having後面的條件運算符與where的相同
- 查詢男生總人數
- where是對from後面指定的表進行數據篩選,屬於對原始數據的篩選
- having是對group by的結果進行篩選
- 為了快速得到統計數據,提供了5個聚合函數
- count(*)表示計算總行數,括弧中寫星與列名,結果是相同的
- 查詢學生總數
- max(列)表示求此列的最大值
- 查詢女生的編號最大值
- min(列)表示求此列的最小值
- 查詢未刪除的學生最小編號
- sum(列)表示求此列的和
- 查詢男生的編號之後
- avg(列)表示求此列的平均值
- 查詢未刪除女生的編號平均值
- 為了方便查看數據,可以對數據進行排序
- 語法:
- 將行數據按照列1進行排序,如果某些行列1的值相同時,則按照列2排序,以此類推
- 預設按照列值從小到大排列
- asc從小到大排列,即升序
- desc從大到小排序,即降序
- 查詢未刪除男生學生信息,按學號降序
- 查詢未刪除科目信息,按名稱升序
- 當數據量過大時,在一頁中查看數據是一件非常麻煩的事情
- 語法
- 從start開始,獲取count條數據
- start索引從0開始
- 已知:每頁顯示m條數據,當前顯示第n頁
- 求總頁數:此段邏輯後面會在python中實現
- 查詢總條數p1
- 使用p1除以m得到p2
- 如果整除則p2為總數頁
- 如果不整除則p2+1為總頁數
- 求第n頁的數據
- 完整的select語句
- 執行順序為:
- from 表名
- where ....
- group by ...
- select distinct *
- having ...
- order by ...
- limit star,count
- 實際使用中,只是語句中某些部分的組合,而不是全部
- 問:查詢每個學生每個科目的分數
- 分析:學生姓名來源於students表,科目名稱來源於subjects,分數來源於scores表,怎麼將3個表放到一起查詢,並將結果顯示在同一個結果集中呢?
- 答:當查詢結果來源於多張表時,需要使用連接查詢
- 關鍵:找到表間的關係,當前的關係是
- students表的id---scores表的stuid
- subjects表的id---scores表的subid
- 則上面問題的答案是:
- 結論:當需要對有關係的多張表進行查詢時,需要使用連接join
- 連接查詢分類如下:
- 表A inner join 表B:表A與表B匹配的行會出現在結果中
- 表A left join 表B:表A與表B匹配的行會出現在結果中,外加表A中獨有的數據,未對應的數據使用null填充
- 表A right join 表B:表A與表B匹配的行會出現在結果中,外加表B中獨有的數據,未對應的數據使用null填充
- 在查詢或條件中推薦使用“表名.列名”的語法
- 如果多個表中列名不重覆可以省略“表名.”部分
- 如果表的名稱太長,可以在表名後面使用' as 簡寫名'或' 簡寫名',為表起個臨時的簡寫名稱
- 查詢學生的姓名、平均分
- 查詢男生的姓名、總分
- 查詢科目的名稱、平均分
- 查詢未刪除科目的名稱、最高分、平均分
- 查詢支持嵌套使用
- 查詢各學生的語文、數學、英語的成績
- 查看字元的ascii碼值ascii(str),str是空串時返回0
- 查看ascii碼值對應的字元char(數字)
- 拼接字元串concat(str1,str2...)
- 包含字元個數length(str)
- 截取字元串
- left(str,len)返回字元串str的左端len個字元
- right(str,len)返回字元串str的右端len個字元
- substring(str,pos,len)返回字元串str的位置pos起len個字元
- 去除空格
- ltrim(str)返回刪除了左空格的字元串str
- rtrim(str)返回刪除了右空格的字元串str
- trim([方向 remstr from str)返回從某側刪除remstr後的字元串str,方向詞包括both、leading、trailing,表示兩側、左、右
- 返回由n個空格字元組成的一個字元串space(n)
- 替換字元串replace(str,from_str,to_str)
- 大小寫轉換,函數如下
- lower(str)
- upper(str)
- 求絕對值abs(n)
- 求m除以n的餘數mod(m,n),同運算符%
- 地板floor(n),表示不大於n的最大整數
- 天花板ceiling(n),表示不小於n的最大整數
- 求四捨五入值round(n,d),n表示原數,d表示小數位置,預設為0
- 求x的y次冪pow(x,y)
- 獲取圓周率PI()
- 隨機數rand(),值為0-1.0的浮點數
- 還有其它很多三角函數,使用時可以查詢文檔
- 獲取子值,語法如下
- year(date)返回date的年份(範圍在1000到9999)
- month(date)返回date中的月份數值
- day(date)返回date中的日期數值
- hour(time)返回time的小時數(範圍是0到23)
- minute(time)返回time的分鐘數(範圍是0到59)
- second(time)返回time的秒數(範圍是0到59)
- 日期計算,使用+-運算符,數字後面的關鍵字為year、month、day、hour、minute、second
- 日期格式化date_format(date,format),format參數可用的值如下
- 獲取年%Y,返回4位的整數
* 獲取年%y,返回2位的整數
* 獲取月%m,值為1-12的整數 - 獲取日%d,返回整數
* 獲取時%H,值為0-23的整數
* 獲取時%h,值為1-12的整數
* 獲取分%i,值為0-59的整數
* 獲取秒%s,值為0-59的整數
- 獲取年%Y,返回4位的整數
- 當前日期current_date()
- 當前時間current_time()
- 當前日期時間now()
- 對於複雜的查詢,在多次使用後,維護是一件非常麻煩的事情
- 解決:定義視圖
- 視圖本質就是對查詢的一個封裝
- 定義視圖
- 視圖的用途就是查詢
- 當一個業務邏輯需要多個sql完成時,如果其中某條sql語句出錯,則希望整個操作都退回
- 使用事務可以完成退回的功能,保證業務邏輯的正確性
- 事務四大特性(簡稱ACID)
- 原子性(Atomicity):事務中的全部操作在資料庫中是不可分割的,要麼全部完成,要麼均不執行
- 一致性(Consistency):幾個並行執行的事務,其執行結果必須與按某一順序串列執行的結果相一致
- 隔離性(Isolation):事務的執行不受其他事務的干擾,事務執行的中間結果對其他事務必須是透明的
- 持久性(Durability):對於任意已提交事務,系統必須保證該事務對資料庫的改變不被丟失,即使資料庫出現故障
- 要求:表的類型必須是innodb或bdb類型,才可以對此表使用事務
- 查看表的創建語句
- 修改表的類型
- 事務語句
- 步驟1:打開兩個終端,連接mysql,使用同一個資料庫,操作同一張表
- 步驟2
- 步驟3
- 步驟1:打開兩個終端,連接mysql,使用同一個資料庫,操作同一張表
- 步驟2
- 步驟3
- 創建表的語句如下
- 思考:怎麼保證關係列數據的有效性呢?任何整數都可以嗎?
- 答:必須是學生表中id列存在的數據,可以通過外鍵約束進行數據的有效性驗證
- 為stuid添加外鍵約束
- 此時插入或者修改數據時,如果stuid的值在students表中不存在則會報錯
- 在創建表時可以直接創建約束
- 在刪除students表的數據時,如果這個id值在scores中已經存在,則會拋異常
- 推薦使用邏輯刪除,還可以解決這個問題
- 可以創建表時指定級聯操作,也可以在創建表後再修改外鍵的級聯操作
- 語法
- 級聯操作的類型包括:
- restrict(限制):預設值,拋異常
- cascade(級聯):如果主表的記錄刪掉,則從表中相關聯的記錄都將被刪除
- set null:將外鍵設置為空
- no action:什麼都不做
查看版本:select version();
顯示當前時間:select now();
遠程連接
mysql -hip地址 -uroot -p
資料庫操作
create database 資料庫名 charset=utf8;
drop database 資料庫名;
use 資料庫名;
select database();
表操作
show tables;
alter table 表名 add|change|drop 列名 類型;
如:
alter table students add birthday datetime;
drop table 表名;
desc 表名;
rename table 原表名 to 新表名;
show create table '表名';
數據操作
select * from 表名
全列插入:insert into 表名 values(...)
預設插入:insert into 表名(列1,...) values(值1,...)
同時插入多條數據:insert into 表名 values(...),(...)...;
或insert into 表名(列1,...) values(值1,...),(值1,...)...;
update 表名 set 列1=值1,... where 條件
delete from 表名 where 條件
alter table students add isdelete bit default 0;
如果需要刪除則
update students isdelete=1 where ...;
備份與恢復
數據備份
sudo -s
cd /var/lib/mysql
mysqldump –uroot –p 資料庫名 > ~/Desktop/備份文件.sql;
按提示輸入mysql的密碼
數據恢復
mysql -uroot –p 資料庫名 < ~/Desktop/備份文件.sql
根據提示輸入mysql密碼
查詢時消除重覆行
select distinct gender from students;
邏輯運算符
select * from students where id>3 and gender=0;
select * from students where id<4 or isdelete=0;
模糊查詢
select * from students where sname like '黃%';
select * from students where sname like '黃_';
select * from students where sname like '黃%' or sname like '%靖%';
範圍查詢
select * from students where id in(1,3,8);
select * from students where id between 3 and 8;
select * from students where id between 3 and 8 and gender=1;
空判斷
select * from students where hometown is null;
select * from students where hometown is not null;
select * from students where hometown is not null and gender=0;
優先順序
分組
select 列1,列2,聚合... from 表名 group by 列1,列2,列3...
select gender as 性別,count(*)
from students
group by gender;
select hometown as 家鄉,count(*)
from students
group by hometown;
分組後的數據篩選
select 列1,列2,聚合... from 表名
group by 列1,列2,列3...
having 列1,...聚合...
方案一
select count(*)
from students
where gender=1;
-----------------------------------
方案二:
select gender as 性別,count(*)
from students
group by gender
having gender=1;
對比where與having
聚合
select count(*) from students;
select max(id) from students where gender=0;
select min(id) from students where isdelete=0;
select sum(id) from students where gender=1;
select avg(id) from students where isdelete=0 and gender=0;
排序
select * from 表名
order by 列1 asc|desc,列2 asc|desc,...
select * from students
where gender=1 and isdelete=0
order by id desc;
select * from subject
where isdelete=0
order by stitle;
獲取部分行
select * from 表名
limit start,count
示例:分頁
select * from students
where isdelete=0
limit (n-1)*m,m
總結
select distinct *
from 表名
where ....
group by ... having ...
order by ...
limit star,count
多表操作之連接
select students.sname,subjects.stitle,scores.score
from scores
inner join students on scores.stuid=students.id
inner join subjects on scores.subid=subjects.id;
連接查詢
練習
select students.sname,avg(scores.score)
from scores
inner join students on scores.stuid=students.id
group by students.sname;
select students.sname,avg(scores.score)
from scores
inner join students on scores.stuid=students.id
where students.gender=1
group by students.sname;
select subjects.stitle,avg(scores.score)
from scores
inner join subjects on scores.subid=subjects.id
group by subjects.stitle;
select subjects.stitle,avg(scores.score),max(scores.score)
from scores
inner join subjects on scores.subid=subjects.id
where subjects.isdelete=0
group by subjects.stitle;
子查詢
select sname,
(select sco.score from scores sco inner join subjects sub on sco.subid=sub.id where sub.stitle='語文' and stuid=stu.id) as 語文,
(select sco.score from scores sco inner join subjects sub on sco.subid=sub.id where sub.stitle='數學' and stuid=stu.id) as 數學,
(select sco.score from scores sco inner join subjects sub on sco.subid=sub.id where sub.stitle='英語' and stuid=stu.id) as 英語
from students stu;
內置函數
字元串函數
select ascii('a');
select char(97);
select concat(12,34,'ab');
select length('abc');
select substring('abc123',2,3);
select trim(' bar ');
select trim(leading 'x' FROM 'xxxbarxxx');
select trim(both 'x' FROM 'xxxbarxxx');
select trim(trailing 'x' FROM 'xxxbarxxx');
select space(10);
select replace('abc123','123','def');
select lower('aBcD');
數學函數
select abs(-32);
select mod(10,3);
select 10%3;
select floor(2.3);
select ceiling(2.3);
select round(1.6);
select pow(2,3);
select PI();
select rand();
日期時間函數
select year('2016-12-21');
select '2016-12-21'+interval 1 day;
select date_format('2016-12-21','%Y %m %d');
select current_date();
select current_time();
select now();
視圖
create view stuscore as
select students.*,scores.score from scores
inner join students on scores.stuid=students.id;
select * from stuscore;
事務
show create table students;
alter table '表名' engine=innodb;
開啟begin;
提交commit;
回滾rollback;
示例1
終端1:
select * from students;
------------------------
終端2:
begin;
insert into students(sname) values('張飛');
終端1:
select * from students;
終端2:
commit;
------------------------
終端1:
select * from students;
示例2
終端1:
select * from students;
------------------------
終端2:
begin;
insert into students(sname) values('張飛');
終端1:
select * from students;
終端2:
rollback;
------------------------
終端1:
select * from students;
create table scores(
id int primary key auto_increment,
stuid int,
subid int,
score decimal(5,2)
);
外鍵
alter table scores add constraint stu_sco foreign key(stuid) references students(id);
create table scores(
id int primary key auto_increment,
stuid int,
subid int,
score decimal(5,2),
foreign key(stuid) references students(id),
foreign key(subid) references subjects(id)
);
外鍵的級聯操作
alter table scores add constraint stu_sco foreign key(stuid) references students(id) on delete cascade;