下篇地址:MySQL數據庫學習(二)
1、什麼是數據庫
數據庫是保存有組織的數據的容器,通常是一個文件或一組文件(一個有組織的數據文件庫)
2、數據庫管理軟件
數據庫是放在文件中,而管理該數據庫的軟件稱爲數據庫管理軟件(DBMS),對數據庫的管理是通過數據庫管理軟件完成的。數據庫管理軟件主要有,MySQL,SQLSERVER。
3、mysql中的表(主鍵以及外鍵)
- mysql數據庫的表是一個二維表,由一個或者多個數據構成,一個表由列和行組成,列是一個表的字段,比如一個顧客表中,一個列存儲着顧客的編號,另一個列存儲着顧客的姓名,表中的一行便是一個數據,唯一標識表的列被成爲主鍵(注意唯一性),這個主鍵列中的行值被成爲主鍵值。
- 列A存於表1和表2中,如果列A在表1中是主鍵,那麼列A稱爲表2的外鍵,外鍵表示了兩個表之間的相連關係。
4、mysql的數據類型
數據類型指的是列的數據類型,有三種,數值類,字符串類,日期時間類。
4.1 數值類的列類型包括整形和浮點型。
整形:
TINYINT:1字節,非常小的整數,帶符號:-128~127,不帶符號:0~255
SMALLINT:2字節小整數,帶符號:-32768~32767,不帶符號:0~65535
MEDIUMINT:3字節中等大小整數,帶符號:-8388608~8388607,不帶符號:0~4294967295
IN:4字節,標準整數。
BIGINT:8字節,大整數。
浮點型:
FLOAT:4字節,單精度浮點數。
DOUBLE:8字節,雙精度浮點數。
DECIMAL:M+2字節以字符串形式表示的浮點數。
4.2 字符串的列類型包括整形和浮點型。
字符串可以用來表示任何一種值,是最基本的類型之一。
CHAR[(M)] :M字節,M字節
VARCHAR[(M)]:M字節,L+1ZHIJIE1
TINYBLOD,TINYTEXT:2^8-1字節 L+1字節
BLOB,TXET:2^16-1字節 L+2字節
MEDIUMBLOB,MEDIUMTEXT:2^24-1字節 L+3字節
LONGBLOB,LONGTEXT:2^32-1字節 L+4字節
ENUM(‘value1’,‘value2’,….):65535成員 1或2字節
SET(‘value1’,‘value’,…):64成員 1,2,3,4或者8字節
CHAR和VARCHAR是最常用的兩種字符串類型,CHAR是固定長度的,每個值佔用相同的字節,不夠的位數MySQL會在它的右邊用空格字符補足。VARCHAR是可變長度字符串,每個值佔用其剛好的字節數再加上一個用來記錄其長度的字節即L+1字節。
5、基本操作
這裏用的是navicat 8進行操作。cmd登陸的語句爲:mysql -u root -p
>show database; //查看數據庫
>create database mydb; //創建一個測試數據庫
>show create database mydb; //查看創建的數據庫
>use mydb; //切換mydb
>show table; //查看mydb中的表 (顯然這裏是空的)
>desc 表名; //查看錶的內容(desc=describe)
>show status; //查看服務器的狀態
>show grants; //查看數據庫用戶的權限
>show errors; //查看mysql服務器的錯誤日誌
>show warnings; //查看警告日誌
>use mydb; //切換mydb
//mydb中,創建一個表,noll指的是允許插入時不給值,not noll指的是帶值插入,auto_increment指的是本列每增加一行自動增加1。
>create table student(
> id int not null auto_increment,
> name char(10) not null,
> primary key(id))
> engine = innodb;
> drop table student;//刪掉這個表
> rename table student to xuesheng; //表改名
>show create table student; //查看創建的表
>insert into student(id,name) values(0,'wanger'); //插入一條數據
>select * from student; //查看錶中的數據
>alter table student add score int; //給表增加一個列
>alter table student drop column score; //刪掉表中的一個列
>alter table student change score sex char(10);//列改名
>update student set name='zhangsan',score = 100 where id=0;//行改值
>delete from student where id=0; //刪掉id=0這一行
>drop database mydb //刪掉這個庫
6、數據庫查詢(查詢列之前需要注意切換到當前數據庫)
查找用select,注意查找只能查找列,*表示全部查找,列明表示全部查找。
>select id from student; //查詢單個列
>select id,name from student; //查詢多個列
>select * from student; //查詢所有的列
>select distinct id from student; //去掉這個列下面重複的行
>select id from student limit n,m; //查詢限定在第n行到第m行(從零開始的)
7、查詢結果排序(order by)
> select name from student oeder by id; //選擇name下面所有的行,以id來排序(排序是以字母A到Z來排序)
> select name from student order by id desc; //默認查詢結果是升序,使用關鍵字desc可以實現降序
> //找到倒數第一個
> select name from student order by id desc limit 1; //查找最後一個
8、查詢結果過濾(where)
數據庫中有大量的數據,具體查到某一行,或者某一列中選取特定的行就需要過濾。注意同時使用排序 order by 和 where 時,order by 要放到最後
>select name from student where id=0;//查詢name這一列過濾的條件是id=0
where 子句操作符
操作符 | 說明 |
---|---|
= | 等於 |
< | 不等於 |
!= | 不等於 |
< | 小於 |
<= | 小於等於 |
> | 大於 |
>= | 大於等於 |
between n and m | 在n和m之間 |
null | 無值,與零,空字符是不同的 |
**組合操作字符,**and / or,多條件以及組合條件,and的優先級大於or,組合時要用括號括起來,以免混亂。
> select name from student where id>1 and scor>=80;//id大於1且分數大於等於80分
> select name from student where id>1 or scor>=80; //id大於1或者分數大於等於80分的返回。
> select name from student where (id>1 or id < 100 ) and scor>=80; //先括號再括號外面。
in 的條件操作
in表示括號內的每個條件都進行匹配,用逗號隔開。
> select name from student where id in (0,1);//id取0和1.
not 操作符
not 是否定之後所跟的任何條件,使用not 找出不匹配的行。
>select name from student where id not in (0,1); //id 除了0,1其他的。
like 操作符
查找表中是否包含某行,like 後面接通配符,對相匹配的進行查找,這裏是指找到所有,%表示匹配多個字符,_表示匹配一個字符。
> select name from student where scor like 100; //找到考100分的
> select name from student where sex like '%a%'; //找到性別中有a的
> select name from student where sex like '_a%'; //找到性別中有a的
8、創建新字段
存儲在表中的數據不是應用所需的,需要創建新的字段來表示數據庫中的數據進行轉換後的數據。用concat()進行字符串拼接,給查詢出來的數據列指定新名字
> select name from student order by id; //以id升序,選擇name
> select concat('hha',name) from student id>0;
> +--------------------+
| concat('hha',name) |
+--------------------+
| hhawanger |
| hhahahha
+--------------------+
執行算術計算 mysql支持對查詢出的數據進行算術計算。as
作爲別名。( + - * / )
//計算總分數
> select name,math+english as score from student order by name;
concat()函數擴展
> select concat('11','22','33');
> select concat('11','22',null); //有null就爲null
> select concat_ws(',','11','22','33');
> +-------------------------------+
| concat_ws(',','11','22','33') |
+-------------------------------+
| 11,22,33 |
+-------------------------------+
>
9、mysql函數
mysql 支持利用函數處理數據,函數在數據上執行,給數據的轉換和處理提供了方便。支持的函數類型有:
- 用於處理字符串的文本處理函數;
- 用於在數值數據上進行算術操作的數值函數;
- 用於處理日期的和時間的函數;
- 返回數據庫信息的系統函數;
文本處理函數如下:
函數 | 說明 |
---|---|
left() | 返回左邊的字符 |
length() | 返回字符串的長度 |
locate() | 找出字符串的一個子串 |
lower() | 將字符串轉成小寫 |
ltrim() | 去掉字符串左邊的空格 |
right() | 返回字符串右邊的字符 |
soundex() | 返回字符串的soundex值 |
substring() | 返回子串的字符串 |
upper() | 將字符串轉換成大寫 |
使用upper()函數將小寫字母轉換成大寫字母
> select id, upper(name) as name_upcase from student;
> +----+-------------+
| id | name_upcase |
+----+-------------+
| 0 | XIAOYUN |
| 1 | WANGER |
| 2 | HAHHA |
+----+-------------+
10、日期和時間處理函數
函數 | 說明 |
---|---|
adddate() | 增加一個日期(天,周) |
addtime() | 增加一個時間(時,分) |
curdate() | 返回當前日期 |
curtime() | 返回當前時間 |
date() | 返回日期 |
datediff() | 計算兩個日期之差 |
date_add() | 日期相加運算 |
date_format() | 返回格式化的日期 |
day() | 返回日期的天數部分 |
dauoffweek() | 返回日期的星期 |
hour() | 返回日期的小時 |
minute() | 返回日期的分鐘 |
month() | 返回日期的月份 |
now() | 返回當前日期的和時間 |
second() | 返回時間的秒部分 |
time() | 返回一個日期時間的時間部分 |
year() | 返回一個日期的年份 |
查找指定時間範圍內的數據
> select id name from student where data(order_date) between '2002-09-01' and '2009-02-01';
數值處理函數
函數 | 說明 |
---|---|
abs() | 返回一個數的絕對值 |
cos() | 返回一個角度的餘弦 |
exp() | 返回一個數的指數值 |
mod() | 返回除操作的餘數 |
pi() | 返回圓周率 |
rand() | 返回一個隨機數 |
sin() | 返回一個角度的正弦 |
sqrt() | 返回一個數的平方根 |
tan() | 返回一個角度的正切 |
獲取一個隨機數
> select rand();
11、數據彙總
在應用中經常需要彙總數據,myaql提供了專門的聚集操作函數。函數也可以組合使用
函數 | 說明 |
---|---|
avg() | 返回某列的平均值 |
count() | 返回某列的行數 |
max() | 返回某列的最大值 |
min() | 返回某列的最小值 |
sum() | 返回某列值之和 |
> select avg(score) as avg_score from mydb.student ;//計算全班平均分
> select name,max(score) as max_score from mydb.student ; //查看最高分是誰
> select count(score) from student where score=100;//統計100分的人數
11、分組數據 (group by)
將數據分成多個組,以便對數據進行聚集計算。group by創建分組,但是不保證分組內部數據的排序,使用 order by對內部數據排序。(group by 是按照列來分組,必須出現在where之後,order by 之前。查詢字段中出現聚合函數和普通列,一起查詢的時候,那麼分組的條件就是普通列,使用普通列進行分組查詢要聚合的函數)
使用形式:
> select [聚合函數] 字段名 from 表名
> [where 分組前行過濾]
> [group by 字段名]
> [having 分組後行過濾]
選擇一列進行分組聚合,選擇多列進行分組聚合。
>select avg(score),subject from student group by subject; //對學科進行分組,計算平均分。(一列)
>select avg(score),max(score),min(score),subject,Sex from student
-> where score>=80
-> group by subject,Sex
-> having subject in ('math','eng')
>