數據庫的引入
在我們之前的學習中,我們可以用集合來存儲數據,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 from和truncate 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): 固定的數值長度