數據庫入門
數據庫概念
存數據的一個倉庫(大量的數據),其實底層還是使用文件來進行存
理解中的數據庫:
數據庫: 是一個文件夾 => 數據表在數據庫 ==》數據由數據庫進行管理,存放
數據表: 文件夾裏的文件
實際可視化中的數據表:
數據表:顯示就是一個二維的表格
包含三大要素: 表名 行 與列
在數據庫的操作:
就是增刪改查 (不需要去關鍵底層如何實現,只需要關注一些指令)
作用:使對數據的操作更加高效,相對於java原始的操作數據流。
在沒有數據的情況時候我們操作數據的方式:
我們操作數據,都是使用java通過流的形式對數據進行操作,但是過程繁雜,代碼量龐大
在有數據庫的時候我們操作數據的方式:
我們只需使用java代碼對數據庫發送相應的指令給數據,處理數據的這個過程交給數據庫就可以獲取我們想要的結果。
數據庫的組成:
數據庫的組成: 一個是客戶端 一個是服務器
客戶端 : dos , sqlyarn , 類似於 眼睛 耳朵
作用:1.發送指令 2.接受數據,顯示數據
服務器:(主要是由空間,可以連接外網,都可以當做一臺服務器)電腦 或主機,類似人的大腦
作用: 1.接受指令 2.處理指令 3.返回相應的數據
數據庫管理系統(DBMS):
DBMS:管理數據庫的系統
1.更好的去管理數據以及數據庫
2.對指令的處理
3.數據庫:只需要做數據存儲: 減輕數據庫服務器的壓力
實體類和數據庫表的關係:
實體類和數據庫表的關係:實體類就是數據庫表在代碼中實際映射,實體類是和數據庫表一一對應的
表名 =>類名
列=>屬性
每一行數據對應一個對象
傳統數據庫(關係型數據庫):表與表之間是存在關係
mysql: 1.免費 2.開源 3. 輕量級 (學習的重點)
orcle 收費的,性能非常好,保證數據安全,數據快(學習重點)
DB2 收費,性能好
sqlserver c# 微軟
sqlite 移動端的數據庫 存數據比較少
非關係型數據庫:
hbase(列族來存) ,redis(以鍵值對來進行存)==>表與表之間不存在關係 ,可以存的數據量比關係型數據庫更大
mysql的學習
mysql數據庫連接的方式:
1.dos(系統自帶) 2.sqlyarn (可視化工具)等
mysql 安裝:
注意問題:
1.要注意端口號3306
2.注意設置編碼格式 utf-8
3.記住root的密碼(root用戶是超級用戶,權限基本上都有)
連接數據庫的方式:今天主要使用shell窗口
普通的shell窗口:
1.本地連接的方式 :mysql -u用戶名 -p密碼
2.遠程連接的方式: mysql -hIP地址 -u用戶名 -p密碼 (公司一般遠程連接)
- 手動關閉數據庫服務指令:(都必須使用管理員shell窗口)
net stop (數據庫名) 如 MYSQL57
- 手動啓動數據庫服務指令:
net start (數據庫名)如MYSQL57
注意點: 都需要開啓mysql服務(mysql一般是自動開啓) 快捷鍵:ctrl+alt+delete
修改mysql密碼:
1.進入mysql中
2.切換到mysql
3.修改語句 update user set passwrod =“修改的密碼” where user=“用戶名”
對數據庫的操作
- 對數據庫的操作:寫sql語句(結構化查詢語言(就類似於普通,基本數據庫都能夠使用))
sql語句分類:
- DDL :對庫,表結構進行操作,不會修改表裏的數據 常用的關鍵件 alter rename …
- DML:對數據庫的操作:數據庫的數據會發生變化 insert(增加) update(修改) delete(刪除) 不包含查詢
- DQL : 查詢數據庫的數據==>數據庫的數據是不會發生改變==>相當於形成了一張僞表
- DCL : 對權限,以及用戶的增加與刪除的控制,(管理員)
數據庫中的數據類型:(部分)
- int(整數)
- double(小數)
- char(類似String)=>固定的字節
- varchar(長度可變,類似於Stringbuffer)
- Text(大文本) 文章
- blob 存二進制(圖片,視頻) java一般圖片都存的是地址
- date : yyyy–MM-dd
- time: HH:mm:ss
- dateTime: yyyy–MM-dd HH:mm:ss
DDL:對數據庫表的操作
創建數據庫 :create database + 數據庫的庫名
mysql> create database student;
Query OK, 1 row affected (0.00 sec)
創建數據庫的時候設置其編碼格式 :create database + 數據庫的庫名 + character set +編碼格式
mysql> create database student character set utf8;
Query OK, 1 row affected (0.00 sec)
查看數據庫的編碼格式: show create database+數據庫的庫名
mysql> show create database student;
+----------+------------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------------+
| student | CREATE DATABASE `student` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+------------------------------------------------------------------+
1 row in set (0.03 sec)
刪除數據庫: drop database +數據庫庫名(不要把數據庫默認的庫刪除了)
mysql> drop database student;
Query OK, 0 rows affected (0.00 sec)
查看所有的數據庫:show databases;
mysql> show databases;
使用數據庫:use +庫名(在創建表格前要確認使用哪個數據庫)
mysql> use student;
Database changed
創建表:create table +表名(
列名1 數據類型(長度),
列名2 數據類型(長度),
列名…n 數據類型(長度)
);
1.注意點:最後一個列名不需要加逗號
2.要切換到具體的庫
mysql> create table user(
-> u_id int (10),
-> u_sex char(2),
-> u_tel varchar(20)
-> );
Query OK, 0 rows affected (0.02 sec)
在表中增加一列 :alter table 表名 add 列名(長度)
mysql> alter table user add u_age int(100);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
查看錶結構: desc 表名
mysql> desc user;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| u_id | int(10) | YES | | NULL | |
| u_sex | char(2) | YES | | NULL | |
| u_tel | varchar(20) | YES | | NULL | |
| u_age | int(100) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.04 sec)
修改具體列的類型的約束:alter table + 表名 modify 列名(長度)
mysql> alter table user modify u_age varchar(50);
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
修改整個列名: alter table +表名 change 舊的列名 新的列名(長度);
mysql> alter table user change u_age new_age varchar(15);
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
刪除列: alter table 表名 drop 列名
mysql> alter table user drop new_age;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
修改表的名稱:alter table 表名 rename +新的表名 || rename table +舊錶名 to +新的表名
mysql> alter table user rename new_user;
Query OK, 0 rows affected (0.01 sec)
mysql> rename table new_user to user;
Query OK, 0 rows affected (0.01 sec)
查看當前庫裏的所有的表: show tables
mysql> show tables;
+-------------------+
| Tables_in_student |
+-------------------+
| user |
+-------------------+
1 row in set (0.03 sec)
設置表的編碼格式: alter table +表名 character set 編碼格式
mysql> alter table user character set utf8;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
查看錶的編碼格式: show create table + 表名
mysql> show create table user;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| user | CREATE TABLE `user` (
`u_id` int(10) DEFAULT NULL,
`u_sex` char(2) DEFAULT NULL,
`u_tel` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.05 sec)
mysql使用總結:
- 創建一個庫,查詢所有的庫
- 給庫設置編碼格式(查看庫的編碼格式)
- 切換具體庫
- 創建一張表
- 新建一個字段
- 修改字段的約束
- 修改一列
- 刪除這一列
- 查看錶結構
- 修改表名
- 查看所有的表
- 給表設置編碼格式
- 查看錶的編碼格式
DML:對數據的操作,增加 刪除 修改
增加:
第一種寫法: insert into 表名(“列名1”,“列名2”,“列名3”)values(值1,值2,值3); (寫列名)
mysql> insert into user(u_id,u_sex,u_tel) values(1,"男","123456789");
Query OK, 1 row affected (0.01 sec)
第二種寫法:(不用列名)insert into 表名 values(值1,值2,值3,值n); 默認插入所有的數據,從第一列開始
mysql> insert into user values(2,"女","123457777789");
Query OK, 1 row affected (0.01 sec)
插入多條數據:insert into 表名 values(值1,值2,值3,值n),(值1,值2,值3,值n),n個();
mysql> insert into user values(4,"女","123457777789"),(3,"男","1123132132");
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
注意事項: 1.列與插入值的對應上
2.插入值的範圍不能超過其設置的長度
3.數字類型不用加引號,字符串類型加雙引號或單引號, 時間類型加單引號
刪除:
-
delete from 表名 where 條件 ==>刪除指定條件的數據
mysql> delete from user where u_id=1; Query OK, 1 row affected (0.00 sec)
-
delete from 表名 ==》全部刪除表的內容,但是如果有自增的索引不會被重置爲0
mysql> delete from user; Query OK, 3 rows affected (0.01 sec)
-
truncate 表名 =>刪除清空數據,並且會刪除表結構 ==>也就等同於先刪除這張表,再重新構建一張表,如果有設置自增,則會把自增的索引重置爲0
修改:update 表名 set 列名1=“值1”,列名=“值2” where 條件
mysql> update user set u_sex ="女" where u_id=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
注意事項:
- 一定要指定條件,否則就回修改所有
- 要修改的列與值要對應
- 修改值的範圍不能超過其長度
- 數字類型用加引號,字符串類型加雙引號, 時間類型加單引號
DQL:查詢後回形成僞表,並不會改變數據
對單表的查詢操作:
#創建商品表:
CREATE TABLE product(
pid INT PRIMARY KEY,#主鍵ID
pname VARCHAR(20),#商品名稱
price DOUBLE,#商品價格
category_name VARCHAR(32)#商品分類名稱
);
INSERT INTO product(pid,pname,price,category_name) VALUES(1,'聯想電腦',5000,'電腦辦公');
INSERT INTO product(pid,pname,price,category_name) VALUES(2,'海爾電腦',3000,'電腦辦公');
INSERT INTO product(pid,pname,price,category_name) VALUES(3,'雷神電腦',5000,'電腦辦公');
INSERT INTO product(pid,pname,price,category_name) VALUES(4,'JACK JONES',800,'服裝');
INSERT INTO product(pid,pname,price,category_name) VALUES(5,'真維斯',200,'服裝');
INSERT INTO product(pid,pname,price,category_name) VALUES(6,'花花公子',440,'服裝');
INSERT INTO product(pid,pname,price,category_name) VALUES(7,'勁霸',2000,'服裝');
INSERT INTO product(pid,pname,price,category_name) VALUES(8,'香奈兒',800,'女士用品');
INSERT INTO product(pid,pname,price,category_name) VALUES(9,'相宜本草',200,'女士用品');
INSERT INTO product(pid,pname,price,category_name) VALUES(10,'麪霸',5,'女士用品');
INSERT INTO product(pid,pname,price,category_name) VALUES(11,'雪碧',56,'飲料飲品');
INSERT INTO product(pid,pname,price,category_name) VALUES(12,'香飄飄奶茶',1,'飲料飲品');
INSERT INTO product(pid,pname,price,category_name) VALUES(13,'iPhone9',8000,NULL);
#查詢product表中所有記錄 所有的使用*
語法: select * from 表名
select * from product
#查詢product表中pid和pname字段
語法:select 列名,列名 from 表名
select pid,pname from product;
#查詢product表中所有的電腦辦公記錄
語法:select * from 表名 where 條件
select * from product where categroy_name="電腦辦公";
#查詢結果是表達式(運算查詢):將所有商品的價格+10元進行顯示.
語法:select 列名+10 from 表名
select price+10 from product;
#設置別名關鍵字 按as(可以不寫) ==>設置別名可以給表設置,也可以給列設置別名(表與表之間存在關係,使用的比較多)
給表設置別名 :select * from 表名 as s
去除重複的關鍵字是: distinct
去除價格重複
select distinct price from product;
#======================== 根據條件來進行查詢=====================
#查詢商品名稱爲“花花公子”的商品所有信息:
select * from product where pname="花花公子";
#查詢價格爲800商品
select * from product where price=800;
#查詢價格不是800的所有商品
1.第一種寫法:select * from product where price !=800;
2.第二種寫法:select * from product where not(price=800);
#查詢商品價格大於60元的所有商品信息
select * from product where price>60;
#查詢商品價格在200到1000之間所有商品
1. select * from product where price>=200 and price<=1000;
2.使用的關鍵字是 between ... and ==> select * from product where price between 200 and 1000(包頭包尾)
3.select * from product where price>=200 && price<=1000;
#查詢商品價格是200或800或者2000的所有商品
1.select * from product where price=200 || price =800||price=2000;
2.select* from product where price=200 or price =800 or price=2000; ==>使用的關鍵字是or
3.select * from product where price in(200,800,2000); ==>使用的關鍵字是in
#查詢含有'霸'字的所有商品 模糊查詢的兩個符號 %==》匹配一個或者是多個 _匹配一個字符 like(像)
select * from product where pname like "%霸%"
#查詢以'香'開頭的所有商品
select * from product where pname like "香%";
#查詢第二個字爲'想'的所有商品
select * from product where pname like "_想%";
#商品沒有分類的商品 注意點 is null ="" 不一樣
select * from product where category_name=""; is null 表示插入的時候,沒有插入數據
select * from product where category_name is null
#查詢有分類的商品
select * from product where category_name is not null;
#分頁查詢 limit?,? ==>? 表示數據的索引這個索引是從0 開始, (當前頁-1)*頁量 ?每頁顯示的頁量 ,算法分頁limit的兩個參數的算法:第一個參數:(當前頁-1)*頁量 ,第二個參數:頁量
select * from product limit0,2;
#排序:關鍵字order by ASC升序 desc降序==> 淘寶店的銷售量
#1.使用價格排序(降序)
select * from product order by price desc;
#2.在價格排序(降序)的基礎上
#若價格相同,相同價格的數據以pid降序排序
select * from product order by price desc, pid desc;
#查詢出 價格(去掉重複的) 以價格進行降序排列
select distinct price from product order by price desc;
#聚合函數:
#count(* 或者是 1 或者列名)==>查詢出總記錄數
#MAX(列名)==>最大值
#MIN(列名)==>最小值
#SUM(列名)==>總和
#AVG(列名)==>平均數
#1 查詢商品的總條數
select count(1) from product;
#查看商品總價格、最大價格、最小价格、價格的平均值
select SUM(price),MAX(price),MIN(price),AVG(price) from product;
#2 查詢價格大於200商品的總條數
select count(1) from product where price>200
#3 查詢分類爲'電腦辦公'的所有商品的總記錄
select count(1) from product where category_name="電腦辦公";
#4 查詢分類爲'服裝'所有商品的平均價格
select avg(price) as "平均數" from product where category_name="服裝";
#分組:group by +分組的條件
# 統計各個分類下商品的個數
select category_name,count(1) from product group by category_name;
#統計各個分類商品的個數,有且 只顯示分類名稱不爲空值的數據
select category_name,count(1) from product group by category_name having category_name is not null;
#統計各個分類商品的個數,有且只顯示分類名稱不爲空值的數據 降序排列 + 加分頁取前兩條數據
select category_name,count(1) as s from product group by category_name having category_name is not null order by s desc limit 0,2;
#分組的條件關鍵字having
#where ===相同點都是用於過濾
# 區別: having 是在分組的後面進行過濾(group by 一般having進行搭配使用)
# where 是在分組的前面的過濾
#查詢語句書寫的規範: select * from + 表名 +where 條件 +group by(分組)+having(過濾)+order by(排序)+limit(分頁)
#備份: 1.通過sql語句備份 dos 窗口 mysqldump -u用戶名 -p密碼 數據庫的苦命>路徑(d:/aa.sql); 1.一點不要加分號 2.不能進mysql進行備份
#還原 : 2. mysql -u用戶名 -p密碼 數據庫<路徑(d:/aa.sql); 1.數據庫在存在 2.一點不要加分號 3.不能進mysql進行備份
sql語句的規範:
1.可以存在多行,每一行sql以分號結尾
2.不區別大小寫(html 但是一般建議小寫) 關鍵字一般建議大寫,其它的小寫
3.數據庫的命名一般以db結尾 stuent_db
分頁查詢原理:
-- 查詢練習 1------------
CREATE TABLE stu (
sid CHAR(6),
sname VARCHAR(50),
age INT,
gender VARCHAR(50)
);
INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);
-- 查詢性別爲女,並且年齡大於等於50的記錄
SELECT * FROM stu WHERE age>=50 AND gender="female"
-- 查詢學號爲S_1001,或者姓名爲liSi的記錄
SELECT * FROM stu WHERE sid="S_1001" OR sname="liSi"
-- 查詢學號爲S_1001,S_1002,S_1003的記錄
SELECT * FROM stu WHERE sid="S_1001" OR sid="S_1002" OR sid="S_1003"
-- 查詢學號不是S_1001,S_1002,S_1003的記錄
SELECT * FROM stu WHERE sid NOT IN ("S_1001","S_1002","S_1003")
-- 查詢年齡爲null的記錄
SELECT * FROM stu WHERE age IS NULL
-- 查詢年齡在20到40之間的學生記錄
SELECT * FROM stu WHERE age>=20 AND age<=40
-- 查詢性別非男的學生記錄
SELECT * FROM stu WHERE NOT gender="male"
-- 查詢姓名不爲null的學生記錄
SELECT * FROM stu WHERE sname IS NOT NULL
-- 查詢姓名由5個字母構成的學生記錄
SELECT * FROM stu WHERE sname LIKE "_____"
-- 查詢姓名由5個字母構成,並且第5個字母爲“i”的學生記錄
SELECT * FROM stu WHERE sname LIKE "____i"
-- 查詢姓名以“z”開頭的學生記錄
SELECT * FROM stu WHERE sname LIKE "z%"
-- 查詢姓名中第2個字母爲“i”的學生記錄
SELECT * FROM stu WHERE sname LIKE "_i%"
-- 查詢姓名中包含“a”字母的學生記錄
SELECT * FROM stu WHERE sname LIKE "%a%"