1 數據庫入門
1.1 引入
方式一: 數據放到內存
優點:
1)擦寫數據的效率很高!
缺點:
1)無法永久保存,當程序關閉了,數據丟失
方式二: 數據放到普通文件
優點:
1)可以永久保存
缺點:
1)頻繁地進行IO操作,效率比較低
2)查詢數據不方便的!!!
方式三: 數據放到數據庫軟件
優點:
1)數據永久保存下來
2)查詢數據非常方便的!!
3)效率不能低
1.2 市面上常見的數據庫軟件
數據庫軟件,存儲和管理數據的倉庫。
Oracle: 是甲骨文公司的產品。滿足中大型應用。和java語言兼容性非常好的。
SQL Server: 是微軟公司的產品。和net平台(c#語言)兼容最好。
DB2: 是IBM的產品。
mysql:開源的數據庫產品。和java語言兼容非常好。滿足中小型應用。
mangoDB: noSQL數據庫
mysql: 滿足中小型應用
oracle:滿足中大小應用
1.3 mysql數據庫基本使用
C:\Users\APPle>mysql -u root -p Enter password: **** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 12 Server version: 5.5.40 MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> |
※數據定義語言(DDL),例如:CREATE、DROP、ALTER等語句。
※數據操作語言(DML),例如:INSERT(插入)、UPDATE(修改)、DELETE(刪除)語句。
※ 數據查詢語言(DQL),例如:SELECT語句。(一般不會單獨歸於一類,因為只有一個語句)。
※數據控制語言(DCL),例如:GRANT、REVOKE等語句。
※事務控制語言(TCL),例如:COMMIT、ROLLBACK等語句。
SQL語言包括四類種主要程序設計語言類別的語句:數據定義語言(DDL),數據操作語言(DML)及數據控制語言(DCL)還有事務控制語言(TCL)。
2 管理數據庫
2.1 查看所有數據庫
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | 數據庫的元數據 | mysql | 數據庫用戶信息或軟件配置信息 | performance_schema | 數據庫軟件運行的性能數據 | test | 測試數據庫 +--------------------+ 4 rows in set (0.00 sec) |
2.2 創建新的數據庫
create database user;
指定字符集 create database user default character set gbk;
2.3 修改數據庫
修復數據庫的字符集 alter database user default character set utf8;
2.4刪除數據庫
drop database admin_user;
3 管理表
操作表之前,需要切換數據庫: use 數據庫名稱 例如 use admin_user;
3.1 創建新的表(create table)
create table student(id int,name varchar(20),age int);
create table 表名(字段名稱 字段類型,字段名稱 字段類型.....);
3.2 修改表(alter table)
添加字段:alter table student add column gender varchar(1);
修改字段類型:alter table student modify column gender varchar(2);
修改字段名稱:alter table student change column gender sex varchar(2);
刪除字段:alter table student drop column age;
修改表名稱:alter table student rename to teacher;
3.3 查看表
desc student;
show tables: 查看當前數據庫的所有表
3.4 刪除表
drop table teacher;
4 管理數據
1.1插入數據(insert into)
需求: 往學生表插入數據
INSERT INTO student VALUES(1,'張三',20);
1)插入的字段值順序一定是按照表的字段順序
INSERT INTO student VALUES('張三',1,20);報錯
2)字段的數據一定要和值的數量要一致
INSERT INTO student VALUES(2,20); 報錯
3)插入部分字段
INSERT INTO student(id,NAME) VALUES(2,'李四');
1.2 修改數據(update)
需求: 修改學生表
1)批量操作(不建議經常使用這種)
UPDATE student SET NAME='張三';
2)按條件修改,修改一個字段
需求: 修改id為2的學生姓名
UPDATE student SET NAME='李四' WHERE id=2;
需求: 修改id為1的學生姓名和年齡
3)修改多個字段
UPDATE student SET NAME='王五',age=40 WHERE id=1;
1.3 刪除數據(delete from)
1) 全表數據刪除
DELETE FROM student;
2)按條件刪除數據
DELETE FROM student WHERE id=2;
3)truncate table也可以刪除全表數據
TRUNCATE TABLE student;
注意:delete from 和 truncate table 的區別?
1)delete from刪除全部,也可以按條件刪除,但是truncate table只能全表刪除,不能按條件刪除
2)delete from刪除的數據可以回滾,truncate table刪除的數據不能回滾。
3)delete from不可以把自增長約束(auto_increment)重置,truncate table可以把自增長約束(auto_increment)重置
truncate table student where id=1; 錯誤的語法
1.4 查看所有數據(重點中的重點)
SELECT * FROM student;
5 查詢數據(重點)
5.1 查詢所有字段 SELECT * FROM student;
5.2 查詢指定的字段 SELECT id,NAME FROM student;
5.3 查詢時指定別名(AS可以省略) SELECT id AS '編號',NAME AS '姓名' FROM student;
5.4 查詢時添加常量列
臨時使用的列可以通過查詢時動態添加進去
需求: 查詢學生數據時添加一個"班級"列。值為“java就業班”
SELECT id AS '編號',NAME AS '姓名','java就業班' AS '班級' FROM student;
5.5 查詢時合並列
需求: 查詢每個學生的總分。
SELECT NAME AS '姓名',(servlet+mysql) AS '總成績' FROM student;
注意: 合並列的字段必須是數值類型的字段。非數值類型合並沒有效果
SELECT NAME AS '姓名',(servlet+NAME) FROM student;
5.6 查詢去除重復記錄
需求: 查詢有哪些的地區學生
SELECT DISTINCT address FROM student;
另一種語法
SELECT DISTINCT(address) FROM student;
5.7 條件查詢
1)邏輯條件: and(與) or(或)
當出現兩個或兩個以上的條件,那么這兩個條件直接一定會存在邏輯關系。要么是與關系,要么或關系
需求:查詢學生的id為1,且姓名為張三的學生
SELECT * FROM student WHERE id=1 AND NAME='張三'; -- (交集,結果數小於或等於任何一個條件的結果數)
需求:查詢學生的id為2,或姓名為張三的學生
SELECT * FROM student WHERE id=2 OR NAME='張三'; -- (並集,結果數一定會大於或等於任何一個條件的結果數)
2)比較條件: > < >= <= = <> (between and)
需求: 查詢servlet分數大於80分的學生
SELECT * FROM student WHERE servlet>80;
需求:查詢mysql分數小於或等於85分的學生
SELECT * FROM student WHERE mysql<=85;
SELECT * FROM student WHERE mysql<85 OR mysql=85;
需求: 查詢servlet分數大於或等於80分,且小於或等於85分的學生
SELECT * FROM student WHERE servlet>=80 AND servlet<=85;
上面sql代替的語法
SELECT * FROM student WHERE servlet BETWEEN 80 AND 85; -- 在..。之間(包前包后)
需求:查詢年齡不等於30歲的學生
SELECT * FROM student WHERE age<>30;
3)判空條件: is null , is not null, ='' , <>''
null: 表示沒有數據 is null =''
空字符:有數據 is not null <>''
需求:查詢沒有性別數據的學生(數據‘男’或‘女’)
SELECT * FROM student WHERE gender IS NULL OR gender='';
需求: 查詢有性別數據的學生
SELECT * FROM student WHERE gender IS NOT NULL AND gender<>'';
4)模糊條件: like
模糊替代符號:
%: 替代任意個字符
_: 替代一個字符
需求: 查詢姓‘李’的學生
SELECT * FROM student WHERE NAME LIKE '李%';
需求: 查詢姓名中包含‘四’字的學生
SELECT * FROM student WHERE NAME LIKE '%四%';
需求:查詢姓‘李’,全名只有兩個字的學生
SELECT * FROM student WHERE NAME LIKE '李_';
5.8 聚合查詢
用於統計結果
max() min() avg() count()
需求: 查詢servlet的最高分
max() 取最大值
SELECT MAX(servlet) FROM student;
需求: 查詢mysql的最低分
min(): 取最小值
SELECT MIN(mysql) FROM student;
需求: 查詢servlt的平均分
avg(): 平均函數
SELECT AVG(servlet) FROM student;
需求:查詢當前有幾個學生
count(): 統計表的記錄數量
SELECT COUNT(*) FROM student;
count(id): 統計有值的id字段的數量(排除null的數據)
SELECT COUNT(id) FROM student;
使用count統計表的數據,不要使用存在null的字段
SELECT COUNT(gender) FROM student;
5.9 分頁查詢
limit 起始行數,查詢的行數
起始行數從0開始
SELECT * FROM student;
需求:學生共20條數據,每頁顯示5條,共4頁
看第3頁(第11到15條)的學生數據sql:select * from student limit 10,5;
看第4頁(第16到20條)的學生數據sql: select * from student limit 15,5;
知道: 當前頁碼,每頁顯示條數
結論分頁查詢當前頁數據的sql: select * from student limit (當前頁碼-1)*每頁顯示條數,每頁顯示條數;
需求: 查詢第1,2條數據
SELECT * FROM student LIMIT 0,2;
需求: 查詢第3,4條數據
SELECT * FROM student LIMIT 2,2;
需求:查詢第5,6條數據
SELECT * FROM student LIMIT 4,2;
5.10 查詢后排序(order by)注意:orderby一般都放在sql語句的最后
desc: 降序。數值從大到小,字母z-a
asc: 升序。數值從小到大,字母a-z
默認情況下,按照插入的順序排序
SELECT * FROM student;
需求:按照id的升序排序
SELECT * FROM student ORDER BY id ASC;
需求: 按照servlet成績降序排序
SELECT * FROM student ORDER BY servlet DESC;
多個排序條件的情況:先按照前面的條件排序,當出現重復記錄,再按照后面的條件排序
需求: 按照age升序,按照servlet成績升序排序
SELECT * FROM student ORDER BY age ASC,servlet ASC;
select * from student order by username asc;
5.11 分組查詢(group by)
需求: 查詢每個地區有多少人
預期結果:
男 3
女 1
SELECT address,COUNT(*) FROM student;
1)對地區進行分組 2)在分組的基礎可以進行統計,統計的是每組的數據
SELECT address,COUNT(*) FROM student GROUP BY address;
需求: 統計男女的人數
注意:order by 必須放在分組之后; where條件必須放在group by分組之前
SELECT gender,COUNT(*) FROM student WHERE gender IS NOT NULL AND gender<>'' GROUP BY gender;
5.12 分組查詢后篩選(having)
需求: 查詢哪些地區的人數大於2個的地區
1)查詢哪些地區多少人 2)篩選人數大於2的地區
注意: having使用在group by分組之后的,對分組后的條件進行篩選
SELECT address,COUNT(*) FROM student GROUP BY address HAVING COUNT(*)>2 ;
6、字段類型
char(20) vs varchar(20)
char(20): 固定長度的字符串。不管實際存儲的數據的大小,一定占用20個字符空間
varchar(20): 可變長度的字符串。占用的空間大小就是實際存儲的數據大小。
int vs int(4)
int: 默認最多11位,長度根據實際存儲的數值的長度
int(4): 固定的數組長度
CREATE TABLE test(
id1 INT,
id2 INT(4) ZEROFILL -- zerofill: 零填充
)
INSERT INTO test VALUES(1,1);
SELECT * FROM test;
date vs datetime vs timestamp
date: 日期
datetime: 日期+時間
timestamp: 時間戳,用於記錄當前數據的插入或更新的時間
CREATE TABLE test_date(
date1 DATE,
date2 DATETIME,
date3 TIMESTAMP
)
INSERT INTO test_date(date1,date2) VALUES('2018-06-17 17:35:45','2018-06-17 17:35:45');
SELECT * FROM test_date;
UPDATE test_date SET date2='2018-06-17 17:40:45';
分類 |
數據類型 |
說明 |
數值類型 |
BIT(M) bit bit(8) TINYINT [UNSIGNED] [ZEROFILL] byte BOOL,BOOLEAN boolean SMALLINT [UNSIGNED] [ZEROFILL] short INT [UNSIGNED] [ZEROFILL] int BIGINT [UNSIGNED] [ZEROFILL] long FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] float DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] double |
位類型。M指定位數,默認值1,范圍1-64 帶符號的范圍是-128到127。無符號0到255。 使用0或1表示真或假 2的16次方 2的32次方 2的64次方 M指定顯示長度,d指定小數位數 表示比float精度更大的小數 |
文本、二進制類型 |
CHAR(size) char(20) max—255 abc VARCHAR(size) varchar(20) 65535 abcde String BLOB LONGBLOB 大的二進制數據 TEXT(clob) LONGTEXT(longclob) 大文本數據 |
固定長度字符串 可變長度字符串 二進制數據 大文本 |
時間日期 |
DATE/DATETIME/TimeStamp |
日期類型(YYYY-MM-DD) (YYYY-MM-DD HH:MM:SS),TimeStamp表示時間戳,它可用於自動記錄insert、update操作的時間 |