初識數據庫

數據庫的引入 

在我們之前的學習中,我們可以用集合來存儲數據,IO流來存儲數據 
他們都各自有各自的特點 : 

1:集合存儲數據的特點:
優點:效率高 。 

弊端:不能持久化的存儲數據 
2:IO流存儲數據的特點: 
優點:可以將數據存儲到文本中,能得到永久化的存儲。 
弊端:在使用的時候,要頻繁地進行IO操作,效率會比較低。 
3.數據庫的優點:可以得到數據的永久化存儲,數據管理比較方便,使用時的效率會更高, 

數據庫的種類 

SQL Server: 微軟的產品。與.net平臺兼容比較好 
Oracle:甲骨文公司的產品。 與Java平臺兼容性最好 
收購Sun公司: java 
收購MySQL: mysql 數據庫軟件 
中大型企業(中大型應用) 
mysql: 開源產品。與java平臺兼容性最好!! 
中小企業(中小應用) 
對於我們目前的知識,我們選擇mysql數據庫 

數據庫的結構

這裏寫圖片描述

我們在數據庫的客戶端利用sql語句向mysql數據庫服務端發送指令,進行數據的增刪改查。

數據庫的基本SQL語句

1.創建庫,exercise

CREATE DATABASE exercise DEFAULT CHARACTER SET utf8;
  • 1
  • 1

查詢所有表: 
USE exercise; – 使用exercise這個數據庫 
SHOW TABLES; – 查詢exercise這個庫中的所有的表

2.創建學生表(id,name,age)

CREATE TABLE student(
-- 字段名稱 字段類型
id INT,
NAME VARCHAR(20),
age INT
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

查詢表中的數據

SELECT * FROM student;  
  • 1
  • 1

查詢一個表結構

DESC student;  
  • 1
  • 1

3.刪除表: 

DROP TABLE student; – 刪除student表

4.修改表 

ALTER TABLE student ADD COLUMN gender VARCHAR(2); – 添加一個地址字段(gender varchar(2))

ALTER TABLE student MODIFY COLUMN gender VARCHAR(3); – 修改gender字段類型爲varchar(3)

ALTER TABLE student CHANGE COLUMN gender sex VARCHAR(2); – 將gender字段修改爲sex字段 varchar(2)

ALTER TABLE student ADD COLUMN address VARCHAR(20); – 添加一個地址字段

ALTER TABLE student DROP COLUMN sex,DROP COLUMN address; – 刪除sex和address字段

ALTER TABLE student RENAME TO stu; – 將student這個表的表名改爲stu

5.數據增刪修改查詢操作: 

(1)查看錶的數據: 

select 字段名稱(如果查詢所有字段*) from student;

SELECT * FROM student; – 查看student表數據

(2)插入數據 

– 給表中插入3條數據(插入所有字段)

INSERT INTO student VALUES(1,'張三',50,'西安');
INSERT INTO student VALUES(2,'李四',40,'上海');
INSERT INTO student VALUES(3,'王五',50,'廣州');
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

– 當需要插入所有字段的時候我們可以直插入部分字段嗎?插入不了

INSERT INTO student VALUES(1,'趙六',60,'中國香港');  --這種語法是不對的,插入不了數據
  • 1
  • 1

– 只想給表中只想插入id字段和name字段,請問怎麼辦?

INSERT INTO student(id,NAME) VALUES(4,'郭德綱');
  • 1
  • 1

(3)修改數據: 

– 將所有學生的年齡改爲50歲,修改所有學生的年齡,用的非常少

UPDATE student SET age=50;  
  • 1
  • 1

– 將id爲3的學生姓名改爲張七

UPDATE student SET NAME='張七' WHERE id=3; 
  • 1
  • 1

– 修改多個字段,修改id爲2的學生姓名爲張學友,年齡改爲60

UPDATE student SET NAME='張學友',age=60 WHERE id=2;
  • 1
  • 1

(4)刪除數據 

– 刪除全表數據,本質上是一條一條進行刪除的,效率比較慢

DELETE FROM student;  --效率較慢
  • 1
  • 1

– 刪除id爲3的數據

DELETE FROM student WHERE id=3;
  • 1
  • 1

– 使用truncate table 表名,刪除全表數據,並不是一條條刪,而是直接將全表數據刪除,效率比較快

TRUNCATE TABLE student;  --效率較快
  • 1
  • 1

– delete fromtruncate table 這兩種刪除全表的方式有什麼區別呢? 
第三:delete from一條條刪除,truncate table直接將全表數據刪掉; 
第二:delete from可以按條件刪除一條數據,truncate table只能刪除全表數據,不能按照條件刪除; 
第三:delete from無法重置自增長主鍵,truncate table可以重置自增長主鍵。

(5) 查詢數據: 

5.1查詢所有列

SELECT * FROM student;
  • 1
  • 1

5.2 查詢指定列(多個列之間以逗號分隔)

SELECT NAME,gender FROM student;
  • 1
  • 1

5.3 查詢時指定別名(AS)

SELECT NAME AS '姓名',gender AS '性別' FROM student;  -- AS可以省略
SELECT NAME '姓名',gender '性別' FROM student;
  • 1
  • 2
  • 1
  • 2

5.4 合併列查詢 
– 添加servet,jsp成績列

ALTER TABLE student ADD servlet INT,ADD jsp INT;
SELECT * FROM student;
UPDATE student SET servlet=86,jsp=75 WHERE id=1;
UPDATE student SET servlet=90,jsp=65 WHERE id=2;
UPDATE student SET servlet=78,jsp=50 WHERE id=3;
UPDATE student SET servlet=85,jsp=80 WHERE id=4;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

– 需求: 查詢每個學生的servlet和jsp的總成績 
– 注意: 必須是數值類型

SELECT NAME '姓名',(servlet+jsp) '總成績'  FROM student;
  • 1
  • 1

– 注意:和數值以外合並沒有意義

SELECT NAME '姓名',(gender+jsp)  FROM student;
  • 1
  • 1

5.5 查詢時添加常量列 
– 需要: 在查詢學生表時都帶上一個班級列,內容爲”Java就業班”

SELECT NAME '姓名',gender '性別',age '年齡','java就業班' AS '班級' FROM student;
  • 1
  • 1

5.6 查詢去除重複數據 
– 需求: 統計學生都來自於哪裏

SELECT DISTINCT remark2 FROM student;  
-- 這種語法也可以
SELECT DISTINCT(remark2) FROM student;
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

5.7 條件查詢(where) 
SELECT * FROM student; 
– 1) 邏輯條件: and or 
– 需求: 查詢id值爲3,且性別爲男的學生(交集:兩個條件同時滿足)

SELECT * FROM student WHERE id=3 AND gender='男';
  • 1
  • 1

– 需求:查詢id爲3,或性別爲男的學生(並集: 兩個條件其中一個滿足)

SELECT * FROM student WHERE id=3 OR gender='男';
  • 1
  • 1

– 2)比較條件: > < >= <= = between and 
– 需求: 查詢servlet分數大於80分的學生

SELECT * FROM student WHERE servlet>80;
  • 1
  • 1

– 需求:查詢jsp分數小於或等於80分的學生

SELECT * FROM student WHERE jsp<=80;
SELECT * FROM student WHERE jsp<80 OR jsp=80;
  • 1
  • 2
  • 1
  • 2

– 需求: 查詢servlet成績大於等於80,且小於等於88的學生

SELECT * FROM student WHERE servlet>=80 AND servlet<=88;
  • 1
  • 1

– 等價於上面

SELECT * FROM student WHERE servlet BETWEEN 80 AND 88; -- (包前包後)
  • 1
  • 1

– 需求:查詢年齡不等於30歲的學生

SELECT * FROM student WHERE age<>30;
  • 1
  • 1

– 3)判空條件: =” is null <>” is not null

UPDATE student SET remark2="" WHERE id=1;
UPDATE student SET remark2=NULL WHERE id=4;
  • 1
  • 2
  • 1
  • 2

– 需求: 查詢remark字段爲空的學生(包含null,也包含字符串) 
null 和 空字符串的區別: 
null: 沒有數據。 判斷null: is null,判斷不爲null: is not null 
空字符: 有數據,數據就是空字符串。判斷空字符: =”; 判斷不爲空字符串: <>”

SELECT * FROM student WHERE remark2 IS NULL;
SELECT * FROM student WHERE remark2='';

SELECT * FROM student WHERE remark2 IS NULL OR remark2='';
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

– 需求:查詢remark字段不爲空的學生(空串或者null都被視爲空)

SELECT * FROM student WHERE remark2 IS NOT NULL AND remark2<>'';
  • 1
  • 1

– 4) 模糊條件: like 
– like後面跟上符號 
– %: 表示任意多個字符(0-多個) 
– _: 表示一個字符 
– 需求: 查詢姓張的學生

SELECT * FROM student WHERE NAME LIKE '張%';
  • 1
  • 1

– 需求: 查詢姓名中包含’張’字的學生

SELECT * FROM student WHERE NAME LIKE '%張%';
  • 1
  • 1

– 需求: 查詢姓張,且姓名只有兩個字的學生

SELECT * FROM student WHERE NAME LIKE '張__';
  • 1
  • 1

5.8聚合函數

SELECT * FROM student;
  • 1
  • 1

– 需求: 查詢所有學生servlet的總分 (SUM: 求和函數)

SELECT SUM(servlet) FROM student;
  • 1
  • 1

– 需求: 查詢所有學生servlet的平均分(AVG; 平均函數)

SELECT AVG(servlet) FROM student;
  • 1
  • 1

– 需求:查詢最高的servlet分數(MAX:最大值函數)

SELECT MAX(servlet) FROM student;
  • 1
  • 1

– 需求:查詢最低的servlet分數(MIN:最小值函數)

SELECT MIN(servlet) FROM student;
  • 1
  • 1

– 需求: 一共幾個學生(COUNT: 統計數量函數)

SELECT COUNT(*) FROM student;
SELECT COUNT(id) FROM student; -- 效率會比count(*)效率稍高
  • 1
  • 2
  • 1
  • 2

注意: 聚合函數,會排除null值的數據,根據某一個字段求取學生表中的數據條數,當一個字段數值爲null的時候,是不予計算的

SELECT COUNT(remark2) FROM student;
  • 1
  • 1

5.9分組查詢

– 求取本班中香港和河北的學生分別有多少人 
– 1.給學生使用address這個字段進行分組(group by) 
– 2.求取每一組中的學生人數 
– address count

SELECT address,COUNT(*) FROM student GROUP BY address;
  • 1
  • 1

5.10分組篩選 
– 查詢人數大於1的地域(group by 分組字段 having 篩選條件)

SELECT address,COUNT(*) FROM student GROUP BY address HAVING COUNT(*)>1;
  • 1
  • 1

5.11分頁查詢 
limit 起始行數,查詢的條數 注意:起始行數從0開始 
– 假設我的表中有20條數據,分爲4也顯示 
– 第一頁:limit 0,5 
– 第二頁:limit 5,5 
– 第三頁:limit 10,5 
– 第四頁:limit 15,5 
– 結論:查詢某一頁要現實的數據的時候可以利用如下公式 limit (當前頁數-1)*每頁顯示的條數,每頁現實的條數

– student表中目前有4條數據,分爲2頁顯示,每頁顯示2條 
– 查詢第一頁的顯示數據:

SELECT * FROM student LIMIT 0,2;
  • 1
  • 1

– 查詢第二頁現實的數據

SELECT * FROM student LIMIT 2,2;
  • 1
  • 1

5.12查詢後排序 
– 按照id字段的升序進行排序 
– asc,升序,數字從小到大,字母a-z 
– desc,降序,數字從大到小,字母z-a

SELECT * FROM student ORDER BY id DESC;
  • 1
  • 1

– 按照servlet的成績的降序進行排序

SELECT * FROM student ORDER BY servlet DESC;
  • 1
  • 1

– 當有多個排序條件的時候,先按照第一個條件排序,如果第一個條件相同則按照第二個條件進行排序 
– 先按照學生的年齡升序進行排序,年齡相同按照學生的servelt成績的升序進行排序

SELECT * FROM student ORDER BY age ASC,servlet ASC;
  • 1
  • 1

6.字段類型: 

char(20) vs varchar(20) 
– char(20): 固定長度的字符串。不管實際存儲的數據的大小,一定佔用20個字符空間 
– varchar(20): 可變長度的字符串。佔用的空間大小就是實際存儲的數據大小。

int vs int(4) 
– int: 默認最多11位,長度根據實際存儲的數值的長度 
– int(4): 固定的數值長度




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章