數據庫和SQL
什麼數據庫
數據庫是存儲在一起的相關數據的集合,這些數據是結構化的,無有害的或不必要的冗餘,併爲多種應用服務。
什麼是SQL
結構化查詢語言(Structured Query Language)簡稱SQL,是一種特殊目的的編程語言,是一種數據庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關係數據庫系統;同時也是數據庫腳本文件的擴展名。
什麼是mysql
MySQL是一個小型關係型數據庫管理系統,開發者爲瑞典MySQLAB公司,在2008年1月16號被Sun公司收購。MySQL被廣泛地應用在Internet上的中小型網站中。由於其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,許多中小型網站爲了降低網站總體擁有成本而選擇了MySQL作爲網站數據庫。
關係數據庫管理系統(Relational Database Management System:RDBMS):
指包括相互聯繫的邏輯組織和存取這些數據的一套程序 (數據庫管理系統軟件)。關係數據庫管理系統就是管理關係數據庫,並將數據邏輯組織的系統。
mysql中的數據類型
MySQL支持多種類型,大致可以分爲三類:數值、日期/時間和字符串(字符)類型。
數值類型
類型 | 大小 | 範圍(有符號) | 範圍(無符號) | 用途 |
---|---|---|---|---|
TINYINT | 1 字節 | (-128,127) | (0,255) | 小整數值 |
SMALLINT | 2 字節 | (-32 768,32 767) | (0,65 535) | 大整數值 |
MEDIUMINT | 3 字節 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整數值 |
INT或INTEGER | 4 字節 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整數值 |
BIGINT | 8 字節 | (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 極大整數值 |
FLOAT | 4 字節 | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 單精度浮點數值 |
DOUBLE | 8 字節 | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 雙精度浮點數值 |
DECIMAL | 對DECIMAL(M,D) ,如果M>D,爲M+2否則爲D+2 | 依賴於M和D的值 | 依賴於M和D的值 | 小數值 |
時間/日期類型
類型 | 大小(字節) | 範圍 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 時間值或持續時間 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和時間值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和時間值,時間戳 |
字符串類型
類型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字節 | 定長字符串 |
VARCHAR | 0-65535 字節 | 變長字符串 |
TINYBLOB | 0-255字節 | 不超過 255 個字符的二進制字符串 |
TINYTEXT | 0-255字節 | 短文本字符串 |
BLOB | 0-65 535字節 | 二進制形式的長文本數據 |
TEXT | 0-65 535字節 | 長文本數據 |
MEDIUMBLOB | 0-16 777 215字節 | 二進制形式的中等長度文本數據 |
MEDIUMTEXT | 0-16 777 215字節 | 中等長度文本數據 |
LONGBLOB | 0-4 294 967 295字節 | 二進制形式的極大文本數據 |
LONGTEXT | 0-4 294 967 295字節 | 極大文本數據 |
mysql的數據庫操作
數據庫的新增
登陸 MySQL 服務後,使用 create 命令創建數據庫,語法如下:
CREATE DATABASE 數據庫名;
DROP DATABASE if exists 數據庫名;
create database 數據庫名;
實例:
CREATE DATABASE test_db;
數據庫的查詢
獲取所有表名:
USE information_schema;
SELECT table_name FROM TABLES WHERE TABLE_SCHEMA=’數據庫名’;
數據庫的刪除
使用 drop 命令刪除數據庫,語法如下:
DROP DATABASE 數據庫名;
mysql的數據表操作
數據表的新建
實例:
USE test_db;
CREATE TABLE IF NOT EXISTS `student`(
`stu_id` INT UNSIGNED AUTO_INCREMENT,
`stu_age` INT NOT NULL COMMENT '學生的年齡',
`stu_name` VARCHAR(20) NOT NULL COMMENT '學生的姓名',
`stu_number` VARCHAR(30) NOT NULL UNIQUE COMMENT '學號',
`stu_address` VARCHAR(30) NOT NULL COMMENT '學生的地址',
PRIMARY KEY ( `stu_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
總結:
CREATE TABLE table_name (
column_name1 data_type constraint[...],
column_name2 data_type constraint[...],
column_name3 data_type constraint[...],
...
PRIMARY KEY ( `column_name` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
數據的增添
實例:
INSERT INTO `student`
(`stu_age`, `stu_name`, `stu_number`, `stu_address`)
VALUES
(22, '劉太剛', '1234', '貴州'),
(15, '徐維鬆', '2345', '四川'),
(19, '徐任達', '3456', '貴州'),
(18, '彭克喜', '4567', '貴州'),
(20, '潘姚瑤', '5678', '新疆');
總結:
INSERT INTO table_name
(column_name1, column_name2, column_name3, ...)
VALUES
(value1, value2, value3, ...),
(value1, value2, value3, ...),
...
(value1, value2, value3, ...);
數據表的刪除
刪除數據表
DROP TABLE 表名;
刪除數據
刪除表內數據,用 delete。格式爲:
DELETE FROM 表名 WHERE 刪除條件;
實例:
DELETE FROM student WHERE stu_name = "劉太剛"; --刪除學生表內姓名爲劉太剛的記錄
注: 只用delete的時候,一定要使用where並註明刪除的條件,否則會刪除整張表。
刪除數據,但是保留表結構
清除表內數據,保存表結構,用 truncate。格式爲:
TRUNCATE TABLE 表名;
數據表的修改
增加一個字段:
ALTER TABLE 表名 ADD COLUMN 字段名 數據類型 字段約束;
實例:
ALTER TABLE student ADD COLUMN stu_honor VARCHAR(20) DEFAULT NULL;
刪除一個字段:
ALTER TABLE 表名 DROP COLUMN 字段名;
修改一個字段:
ALTER TABLE 表名 MODIFY 字段名 數據類型; --修改數據類型
ALTER TABLE 表名 CHANGE 舊字段名 新字段名 新數據類型; --修改字段名稱
ALTER TABLE student MODIFY stu_honor VARCHAR(10);
ALTER TABLE student CHANGE stu_honor stu_honour varchar(200);
數據表的查詢
一般查詢
一般查詢的格式
SELECT column_name,column_name, ...
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
查詢所有數據
實例:
SELECT * FROM student ;
SELECT stu_name, stu_number FROM student ; --所有數據中的指定字段
根據條件查詢
實例:
select * from student where id= 1;
select * from student where stu_name='徐維鬆' and stu_number='2345' ;
select * from student where stu_name='徐維鬆' or stu_number='3456' ;
select * from student where stu_age>=18 and stu_age<=21 ;
select * from student where stu_age between 20 and 23;
模糊查詢
實例:
select * from student where stu_name like '%克喜'; --%通配符代表任意多個字符
排序
實例:
select * from student order by stu_age asc; --按照價格升序排列
select * from student order by stu_age desc; --按照價格降序排列
統計函數(聚合函數)
實例:
select count(*) from student; --查詢表中有多少條數據
select max(stu_age) from student; --取價格的最大值
select min(stu_age) from student; --取價格的最小值
select sum(stu_age) from student; --取價格的總和
select avg(stu_age) from student; --取價格的平均值
分組查詢
實例1:
select count(*) from student group by stu_address;
注: group by,一般和聚合函數一起使用,如果,查詢的字段出現在GROUP BY後,卻沒有包含在聚合函數中,該字段顯示的是,分組後的第一條記錄的值,這樣,可能會導致查詢結果不符合我們的預期。
實例2:
SELECT COUNT(*) FROM student GROUP BY stu_address HAVING SUM(stu_age)>60; --使用stu_address作爲分組的條件, 找出滿足stu_age的和大於60的那一組
注: HAVING關鍵字和WHERE關鍵字的作用相同,都是用於設置條件表達式,對查詢結果進行過濾。兩者的區別是,HAVING關鍵字後,可以跟聚合函數,而WHERE關鍵字不能,通常情況下,HAVING關鍵字,都是和GROUP BY一起使用,用於對分組後的結果進行過濾。
分頁查詢
select * from student limit 0,3; -- 跳過幾條數據取幾條數據
總結:
SELECT * FROM table_name LIMIT offset, size; -- offset:偏移量; size:數據量
去重(chong)查詢
select distinct stu_address from student;
連結查詢
內聯接
(典型的聯接運算,使用像 = 或 <> 之類的比較運算符)。包括相等聯接和自然聯接。
內聯接使用比較運算符根據每個表共有的列的值匹配兩個表中的行。例如,檢索 students和courses表中學生標識號相同的所有行。
外聯接
外聯接可以是左向外聯接、右向外聯接或完整外部聯接。
在 FROM子句中指定外聯接時,可以由下列幾組關鍵字中的一組指定:
1)LEFT JOIN或LEFT OUTER JOIN
左向外聯接的結果集包括 LEFT OUTER子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均爲空值。
2)RIGHT JOIN 或 RIGHT OUTER JOIN
右向外聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將爲左表返回空值。
3)FULL JOIN 或 FULL OUTER JOIN 完整外部聯接返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的數據值。
交叉聯接
交叉聯接返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉聯接也稱作笛卡爾積。 FROM 子句中的表或視圖可通過內聯接或完整外部聯接按任意順序指定;但是,用左或右向外聯接指定表或視圖時,表或視圖的順序很重要。有關使用左或右向外聯接排列表的更多信息,請參見使用外聯接。
例子
1) 內連接
2)左連接
3) 右連接
4) 完全連接