數據庫簡介
- IO流數據存儲弊端
- 效率低
- 存取都麻煩
- 一般只能保存小量數據
- 只能保存文本數據
什麼是DB
- Database:數據庫
- 數據庫本質上就是一個文件集合 數據庫就是存儲數據的倉庫,本質上是一個文件系統,數據會按照特定的格式保存到文件中,用戶可以對數據庫中的數據進行增刪改查操作
什麼是DBMS
- Database Management System: 數據庫管理系統
- DBMS就是管理數據庫文件的軟件
- 常見的DBMS有: MySQL、oracle、sqlserver、DB2、Sqlite
DBMS是指一種管理數據庫的大型軟件,用於創建、管理、維護數據庫文件,對數據庫文件進行統一的管理和控制,用戶通過數據庫管理系統
訪問數據庫中的數據
數據庫軟件的分類
- 關係型數據庫: 經過數學理論驗證,可以將現實生活中任意關係保存關係型數據庫中,關係型數據庫中以表爲存儲單位
- 非關係型數據庫: 用來解決一些特定場景,比如解決緩存問題,解決高併發問題 Redis數據庫(以鍵值對的形式保存數據)
主流關係型數據庫介紹
- MySQL: 08年被Sun收購 09年Sun被Oracle收購,開源 ,由於被Oracle收購後性能大幅提升導致MySQL用戶量大增,Oracle用戶減少,公司計劃把MySQL閉源,原MySQL程序員離開Oracle公司,創建了MariaDB數據庫(Maria是公司老闆的女兒名字) 市場排佔有率第一
- Oracle: Oracle公司,最貴,性能最高,市場佔有率排第二,閉源,拉里艾莉森32
- SQLServer:微軟公司,閉源,市場佔有率第三,主要應用在.net開發的網站中
- DB2:IBM公司產品,閉源
- sqlite:輕量級數據庫 只有幾十k,應用在嵌入式設備中(包括移動設備)
開源和閉源
- 開源:開放源代碼 免費,盈利方式靠賣服務 用戶多,有大牛程序員會無償的維護和升級
- 閉源:源代碼私有 盈利方式靠賣軟件+服務 來錢快,會有大牛們攻擊,但是公司內部會花錢僱人維護升級
安裝數據庫軟件
- 端口號使用默認的3306
- 字符編碼選擇utf8
什麼是SQL
- Structured(結構化) Query(查詢) Language(語言):結構化查詢語言
- 用於用戶和數據庫軟件(DBMS)交流的語言,不管是增刪還是改查都需要使用SQL語言和DBMS交流
- SQL是寫在客戶端中或Java代碼中,發送給DBMS,由DBMS解析執行
數據庫服務器
- 服務器是高配置的電腦
- 數據庫服務器就是在電腦上安裝了DBMS
- DBMS(mysql) 具備網絡訪問能力
如何連接MySQL數據庫 Linux下打開終端 Windows裏面打開命令行
- 在終端或命令行中輸入 mysql -uroot -p 然後回車 ,有密碼的寫密碼 如果沒有密碼的直接敲回車
- 退出命令 exit
SQL規範
- 以;結尾
- 關鍵字之間要有空格 可以有多個空格
- SQL語句中可以1個或多個換行
- 關鍵字不區分大小寫
1. 數據庫相關sql
- 查看所有數據庫:
show databases;
- 創建數據庫:
create database db1;
- 刪除數據庫:
drop database db1;
- 查看單個數據庫詳情:
show create database db1;
- 指定字符集:
create database db1 character set utf8/gbk;
- 使用數據庫:
use db1;
2. 表相關sql
- 創建表:
create table t1(id int,name varchar(10));
- 查看所有表:
show tables;
- 刪除表:
drop table t1;
- 查看單個表:
show create table t1;
- 創建表指定引擎和字符集:
create table t1(id int) engine=myisam/innodb charset=utf8/gbk;
- 查看錶字段信息:
desc t1;
- 修改表:
修改表名 rename table t1 to t2;
- 修改表字符集和引擎:
alter table t1 engine=myisam/innodb charset=utf8/gbk;
- 添加表的字段:
alter table t1 add age int first/(after xxx)
- 刪除表字段:
alter table t1 drop age;
- 修改表字段名稱和類型:
alter table t1 change age abc int;
- 修改表的類型和位置:
alter table t1 modify age int first/(after xxx);
3. 數據相關sql
- 插入數據:
insert into t1 values(值1,值2),(值1,值2),(值1,值2)
insert into t1 (字段名1,字段名2) values (值1,值2),(值1,值2);
- 查詢數據:
select * from t1; select name from t1;
select name,age from t1 where id<100;
- 修改數據:
update t1 set age=100 where id=10;
- 刪除數據:
delete from t1 where id<10;
主鍵約束
什麼是主鍵:表示表中數據唯一性的字段稱之爲主鍵(主鍵只有一個)
什麼是約束: 約束就是創建表的時候給表中字段添加的限制條件
主鍵約束:添加了主鍵約束的字段,保存的數值必須唯一而且非空
- 格式:
create table t1(id int primary key,name varchar(10));
- 測試唯一: 以下代碼會報錯 主鍵值不能重複
insert into t1 values(1,'劉備');
insert into t1 values(1,'張飛');
- 測試非空:
insert into t1 values(null,'關羽');
主鍵+自增約束
- 格式:
create table t2(id int primary key auto_increment,name varchar(10));
- 測試自增:
insert into t2 values(null,'關羽');
insert into t2 values(null,'悟空');
insert into t2 values(10,'八戒');
insert into t2 values(null,'沙僧');
delete from t2 where id>5;
insert into t2 values(null,'二郎神');
- 自增的特點:
- 值爲null時會自動賦值
- 以表中曾出現的最大值基礎上+1;
- 刪除數據自增值不減
- delete清空表 自增數值不變
- 如何讓自增數值清零? 使用truncate關鍵字 ,相當於:
drop+create truncate table t2;
註釋 comment
- 創建表的時候可以通過comment關鍵字對字段進行描述
- 格式: create table t3(id int primary key auto_increment comment ‘這個字段是主鍵’,ename varchar(10),sal int comment ‘這是工資’);
- 通過 show create table t3; 查看字段的註釋
`和’的區別
- `的作用:是用來修飾表名和字段名的,可以省略
- '的作用:是用來修飾字符串的
數據冗餘
由於表設計不夠合理,出現大量的重複數據,稱爲數據冗餘。可以通過拆分表的形式,把可能重複的數據保存到一張新的表中,在原表中只需要通過一個id建立關係即可。這種建立關係的字段稱之爲外鍵。
練習一: 保存商品的信息包括(商品id,商品名稱,商品價格,庫存,分類名稱,上級分類)
- 創建商品表(item):商品id, 商品名稱(name),商品價格(price),庫存(num),分類id(category_id)
create table item(id int primary key auto_increment,name varchar(10),price int,num int,category_id int);
- 創建分類表(category):分類id ,分類名稱(name),上級分類
create table category(id int primary key auto_increment,name varchar(10), parent_id int);
- 以上表中插入數據:
一、電器分類下的電視機分類下的康佳電視價格4480,庫存38
二、第二條數據 鞋分類下的男鞋分類下的男運動鞋分類下的耐克運動鞋價格380,庫存99
- 插入第一條數據:
insert into category values(null,'電器',null);
insert into category values(null,'電視機',1);
insert into item values(null,'康佳電視',4480,38,2);
- 插入第二條數據:
insert into category values(null,'鞋',null);
insert into category values(null,'男鞋',3);
insert into category values(null,'男運動鞋',4);
insert into item values(null,'耐克運動鞋',380,99,5);
練習二:請設計表保存以下數據:保存教學部下java教研部的老師信息:蒼老師工資200 年齡18歲,然後再保存集團總部下銷售部,銷售A部的員資50,年齡28歲工李白工
- 創建部門表:
create table dept(id int primary key auto_increment,name varchar(10),parent_id int);
insert into dept values(null,'集團總部',null);
insert into dept values(null,'教學部',1);
insert into dept values(null,'Java教研部',2);
insert into dept values(null,'銷售部',1);
insert into dept values(null,'銷售A部',4);
- 創建員工表:
create table emp(id int primary key auto_increment,name varchar(10),sal int,age int,dept_id int);
insert into emp values(null,'蒼老師',200,18,3),(null,'李白',50,28,5);
事務
什麼是事務:事務是數據庫中執行sql語句的最小工作單元,把多條sql語句放在事務中可以保證多條sql要麼全部成功,要麼全部失敗。
- 測試事務:
- 創建person表::
create table person(id int primary key auto_increment,name varchar(10),money int);
- 插入數據:
insert into person values(null,'超人',200),(null,'鋼鐵俠',1000);
- 查看數據庫的自動提交狀態
show variables like '%autocommit%';
- 關閉自動提交 0 打開自動提交 1
set autocommit=0;
轉賬驗證過程
- 把自動提交關掉:
set autocommit=0;
- 讓超人+300 :
update person set money=500 where id=1;
- 此時打開另外一個終端
use db2;
查詢數據select * from person;
(數據庫中的數據此時並沒有修改) - 回到第一個終端窗口,讓鋼鐵俠
300 update person set money=700 where id=2;
(當前窗口查詢數據時因爲查詢的是內存中的數據,所以數據變了,但是此時去第二個窗口查看數據庫中的數據並沒有發生改變) - 在第一個窗口中執行手動提交
commit;
此時會把內存中的多次SQL在內存中的執行結果 同時提交到數據庫中(此時兩個終端全部發生改變)
is null
- 查詢獎金爲null的所有員工信息
select * from emp where comm is null;
- 查詢沒有上級領導(mgr)的員工信息
select * from emp where mgr is null;
is not null
- 查詢emp表中有獎金的員工信息
select * from emp where comm is not null;
別名
- 查詢emp表中所有的姓名,把ename改成姓名
select ename as '姓名' from emp;
select ename '姓名' from emp;
select ename 姓名 from emp;
去重:distinct
- 查詢所有員工從事的工作
select distinct job from emp;
比較運算符 >,<,>=,<=,=,!=和<>
emp
:comm獎金、job工作職位、sal工資、mgr領導編號、deptno部門編號t_item
:price單價、num庫存
- 查詢工資小於等於1600的所有員工姓名和工資
select ename,sal from emp where sal<=1600;
- 查詢部門編號是20的所有員工姓名、職位job、部門編號
select ename,job,deptno from emp where deptno=20;
- 查詢職位是manager的所有員工的姓名和職位
select ename,job from emp where job='manager';
- 查詢部門不是10號部門的所有員工的姓名和部門編號 使用兩種寫法
select ename,deptno from emp where deptno!=10;
select ename,deptno from emp where deptno<>10;
- 查詢t_item表中單價等於23的商品名稱和價格
select title,price from t_item where price=23;
- 查詢單價不等於8443的商品信息
select * from t_item where price!=8443;
and 和 or
and
和java中的&&效果一樣or
和java中的||效果一樣
- 查詢不是10號部門並且工資小於3000的員工信息
select * from emp where deptno!=10 and sal<3000;
- 查詢部門編號是30或者上級領導爲7698的員工姓名,職位,上級領導編號和部門編號
select ename,job,mgr,deptno from emp where deptno=30 or mgr=7698;
in
- 查詢工資等於5000,1500,3000的員工信息
select * from emp where sal=5000 or sal=1500 or sal=3000;
select * from emp where sal in (5000,1500,3000);
between x and y 查詢x和y之間的數值(包含x和y)
- 查詢工資在2000和4000之間的員工信息
select * from emp where sal>=2000 and sal<=4000;
select * from emp where sal between 2000 and 4000;
like
- like:用於模糊查詢
- _: 代表單個未知字符
- %:代表0個或多個未知字符
- 舉例
- 包含字符a:%a%
- 以a開頭:a%
- 以a結尾:%a
- 第二個字符是a:_a%
- 倒數第三個字符是a:%a__
- 第二個字符是a 最後一個字符是b:_a%b
like案例
- 查詢標題中出現筆記本的商品標題
select title from t_item where title like '%筆記本%';
- 查詢單價在50到200之間的得力商品(title中出現得力)
select * from t_item where price between 50 and 200 and title like '%得力%';
- 查詢有圖片的得力商品(image字段不爲null)
select * from t_item
where image is not null and title like '%得力%';
- 查詢標題中不包含得力的商品信息
select * from t_item
where title not like '%得力%';
- 查詢有贈品的的商品信息(在sell_point字段中包含贈字)
select * from t_item
where sell_point like '%贈%';
排序
- order by寫在where的後面
- order by後面寫排序的字段名,可以寫一個或多個
- 默認排序規則爲升序,也可以指定規則: 升序(asc)降序(desc)
- 舉例:
select name,money from person where money>5000 order by money asc/desc;
分頁查詢:limit
-
limit x,y
x代表跳過的條數 y代表查詢的條數(每頁的條數) -
limit,寫在最後
-
舉例1:查詢第一頁的10條數據
limit 0,10
-
舉例2:查詢第五頁的8條數據
limit 32,8
-
舉例3:查詢第三頁每頁3條數據
limit (3-1)*3,3
-
查詢所有商品的價格,價格升序,顯示第二頁,每頁7條數據
select price from t_item order by price limit 7,7;
- 查詢工資前三名的員工信息
select * from emp order by sal desc limit 0,3;
- 查詢20部門中工資最高的員工信息
select * from emp where deptno=20 order by sal desc limit 0,1;
- 查詢dell商品中價格最便宜的商品名稱和價格
select title,price from t_item where title like '%dell%' order by price limit 0,1;
日期相關函數
select 'helloworld';
- 獲取當前日期+時間 now()
select now();
- 獲取當前的日期
select curdate();
- 獲取當前時間
select curtime();
- 從年月日時分秒中提取年月日 和提取時分秒
select date(now());
select time(now());
- 從年月日時分秒中提取年,月,日,時,分,秒
select extract(year from now());
select extract(month from now());
select extract(day from now());
select extract(hour from now());
select extract(minute from now());
select extract(second from now());