JAVA EE-MYSQL
知識是人生旅途中的資糧。 —— 雨果
數據倉庫.就與我們之前學過的純文本,properties這些技術一樣.用來保存數據.並提供對數據進行增刪改查的操作.我們以後做項目時,項目中的數據都是保存在數據庫中的.
數據庫的優點?
1>實現數據共享
2>減少數據的冗餘度
3>數據實現集中控制
4>數據一致性,完整性和可維護性,以確保數據的安全性和可靠性
5>故障恢復
常見的數據庫?
常用數據庫
1>MySQL
MySQL是最受歡迎的開源SQL數據庫管理系統,它由 MySQL AB開發、發佈和支持。MySQL AB是一家基於MySQL開發人員的商業公司.MySQL是一個關係數據庫管理系統。MySQL是開源的。已經被Oracle收購。
2>SQL Server
SQL Server是由微軟開發的數據庫管理系統,它只能在Windows上運行.
3.Oracle
提起數據庫,第一個想到的公司,一般都會是Oracle(甲骨文)。該公司成立於1977年,最初是一家專門開發數據庫的公司。Oracle在數據庫領域一直處於領先地位。 Oracle數據庫成爲世界上使用最廣泛的關係數據系統之一。
4.Sybase(退隱) 配套的數據庫設計軟件。 power designer 數據庫設計軟件。建模工具。
1984年,Mark B. Hiffman和Robert Epstern創建了Sybase公司,並在1987年推出了Sybase數據庫產品。
5.DB2 IBM開發的。也是收費數據庫。
SQL
- DDL 數據庫定義語言 Data Definition Language || create alter drop
- DCL 數據庫控制語言 Data Control Language || grant rollback commit.
- DML 數據庫操縱語言 Data Manipulation Language || insert update delete select
- DQL 數據庫查詢語言 Data Query Language || select
SQL中的註釋
單行 : --
多行 : /* */
sql不區分大小寫嗎?
語句不區分大小寫.
數據區分大小寫.
mysql中sql的結束使用”;”號表示.
退出的命令 => exit
//——————————————————————————————
連接數據庫服務的命令
mysql -u root -p
根據提示輸入密碼 ,即可建立連接.
//—————————————————————————————-
數據庫定義語言(庫的操作) DDL
1.創建一個庫
create database 庫名稱 [character set 碼錶名稱 collate 字符校對集名稱]
create database day15;
1>看到Query OK, 1 row affected (0.00 sec) 表示執行成功.
2>sql語句語法: 結尾應使用";"號.
3>字符校對集: 決定數據排序的。
2.顯示mysql中都有哪些庫了.
show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| day13 |
| mysql |
| performance_schema |
| test |
+——————–+
可以看到除了自己創建的庫之外,還有一些其他庫。其他庫(除了test)不要亂動。因爲是保存mysql的配置信息,賬戶信息等等。
test庫 : 自動創建用於測試的。
3.刪除一個數據
drop database 數據庫名稱;
drop database day15;
4.修改數據庫碼錶和字符校對(不常用)
alter database 數據庫名稱 character set 數據庫碼錶 [collate 校對集名稱];
alter database day15 character set utf8 collate utf8_bin;
5.當前要使用的庫(重要)
use 庫名
use day15;
出現Database changed,說明切換完成.
6.查看當前選擇的數據庫
select database();
+————+
| database() |
+————+
| day15 |
+————+
7.顯示創建庫的語句.
show create database 數據庫名稱;
show create database day15;
| day15 | CREATE DATABASE `day15` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE
utf8_bin */ |
//——————————————————————————————————————–
創建庫
create database` 庫名 [character set 碼錶 collate 字符校對集
顯示所有庫 show databases;
刪除庫 drop database 庫名;
修改數據庫碼錶 alter database 庫名 character set 碼錶 collate 字符校對集
使用數據庫 use 庫名
查看當前使用的庫 select database();
顯示創建庫語句 show create database 庫名;
數據庫中
的數據類型 (瞭解,知道在什麼情況下應該使用什麼類型的數據)
一。數字型
整型
TINYINT 1字節 byte
SMALLINT 2字節 short
MEDIUMINT 3字節
(常用)INT 4字節 int
BIGINT 8字節 long
浮點型
FLOAT 單精度4字節 float
**DOUBLE 8字節 double
*DECIMAL 沒有精度損失
============================================
DOUBLE 和 DECIMAL 區別?
DOUBLE類型在運算時會有精度的缺失。
DECIMAL 就是解決精度缺失問題的。(底層使用字符串來保存數字)
單純想表示小數屬性時,使用double。
需要頻繁參與運算的小數,使用decimal。
============================================
二。字符串類型
注意: 字符串類型要使用單引號包裹.
短字符串類型
CHAR/VARCHAR (最大長度255字節)
====================================================
問題:char和varchar有什麼區別?
char定長字符串.varchar表示變長字符串.
同時指定長度爲10。當存儲 abc
char =》 ‘abc ’
varchar => ‘abc’
結論: 開發中varchar用的最多。 char只在表示固定長度的枚舉中使用。例如 :性別(用01,02表示)
====================================================
長字符串類型(流類型)
*TEXT/CLOB 保存文本(字符流) –> 當要保存的內容超過255字節時使用. java中的writer 字符
BLOB 保存字節(字節流) –> 開發中用不到 java中的stream 字節
Character Large Object
binary Large Object
區別:
text:只能存儲字符數據.
BLOB:可以存儲字符和多媒體信息(圖片 聲音 圖像)
//——————————————————————————————————————
三。日期和時間類型
date 只記錄日期 2015-01-14
time 只記錄時間 11:36:25
year 只記錄年 2015
datatime 又記錄日期 又記錄 時間 2015-01-14 11:36:25
**timestamp 同上 2015-01-14 11:36:25
問題: datatime 和 timestamp 區別?
這兩種類型記錄的數據是一模一樣.
區別在於插入的時候,如果插入datatime類型時,沒有 傳值,那麼該類型默認值就是null;
如果插入timestamp類型時,沒有 傳值,那麼該類型默認值就是當前時間;
//——————————————————
//————————————————————————–;—————————————-
與創建表相關的語句(DDL) (記住,能夠手寫)
CREATE TABLE table_name
(
field1 datatype 約束/主鍵約束 auto_increment,
field2 datatype 約束,
field3 datatype 約束
)[character set 字符集 collate 校對規則]
1.創建表
create table t_user(
id int,
name varchar(20),
sal double(4,3),
birthday datetime,
hiredate timestamp
);
varchar最好指定長度
整型一般不指定.
2.查看當前庫中有哪些表
show tables;
3.查看錶的結構
desc 表名; description
desc t_user;
4.刪除表
drop table 表名;
drop table t_user;
5.添加一列
alter table 表名 add 列名 類型;
alter table t_user add photo blob;
6.修改列的類型
alter table 表名 modify 列名 類型;
alter table t_user modify photo varchar(20);
7.修改列的名稱
alter table 表名 change 舊列名 新列名 數據類型;
將 photo這一列 改名爲 image
alter table t_user change photo image varchar(20);
8.刪除某列
alter table 表名 drop 列名;
alter table t_user drop image;
9.修改表的名稱
rename table 舊錶名 to 新名;
rename table t_user to user;
10(用的極少)修改表的字符集. (如果創建表時不指定,默認使用數據庫的字符集)
alter table 表名 character set 字符集 collate 校對集;
alter table t_user character set utf8 collate utf8_bin;
//————————————————————————————————-
//————————————————————————-
列的約束 (掌握)
保證數據的完整性的.
1.非空約束(not null) 指定非空約束的列, 在插入記錄時 必須包含值.
2.唯一約束(unique) 該列的內容在表中. 值是唯一的.
3.主鍵約束(primary key) 當想要把某一列的值,作爲該列的唯一標示符時,可以指定主鍵約束(包含 非空約束和唯一約束). 一個表中只能指定一個主鍵約束列.
主鍵約束 , 可以理解爲 非空+唯一.
注意: 並且一張表中只能有一個主鍵約束.
約束體現數據庫的完整性.
例如:創建帶有約束的表
create table t_user2(
id int primary key auto_increament, -- 員工編號
name varchar(10) not null, -- 員工姓名
loginname varchar(10) not null unique, -- 登陸名稱
password varchar(20) not null, -- 密碼
age int(3) not null, -- 年齡
birthday datetime not null, -- 生日
hiredate timestamp not null -- 入職日期
);
//—————————————————————————————————————————-
主鍵自動增長 (掌握)
注意:
1.前提某個表的主鍵是數字. 我們可以將該主鍵設置爲自增.
2.使用主鍵自增可能會造成主鍵的斷層。
3.mysql,sqlserver,sqllite這三個數據庫具有該功能.
4.主鍵自增只能給主鍵約束的列加。
自增就是 每次插入記錄時不需要指定值. 該字段自己維護自己的值.
維護方式就是每次加1;
語法:
create table t_user(
id int primary key auto_increment,
password varchar(30) not null,
age int not null,
birthday datetime not null,
hiredate timestamp not null,
number int unique
);
//——————————–創建修改表練習—————————————————
CREATE TABLE employee (
id INT(10),
NAME VARCHAR(10),
gender VARCHAR(10),
birthday DATETIME,
entry_date TIMESTAMP,
job VARCHAR(5),
salary DOUBLE(5,3),
RESUME TEXT
);
1在上面員工
表的基礎上增加一個image列。
alter table employee add image varchar(20);
2修改job列,使其長度爲60。
alter table employee modify job varchar(60);
3刪除gender列。
alter table employee drop gender;
4表名改爲user。
rename table employee to user;
5修改表的字符集爲utf8
6列名name修改爲username
alter table employee change name username varchar(20);
//--------------
——————–對錶中數據的增刪改(DML)——————————————————————-
create table t_user(
id int primary key auto_increment,
name varchar(20) not null,
email varchar(20) unique
)
//-
爲表添加記錄 (必須掌握)
insert into 表名[(列名1,列名2...)] values (值1,值2...);
1.插入一條數據
1>指定要插入那些列
insert into t_user(name,email) values('tom','[email protected]');
****注意: 數據類型爲字符串類型的.需要使用單引號包裹.
2>不指定插入哪些列, 需要指定每一列的值
insert into t_user values(null,'jerry','[email protected]');
insert into t_user(name,email) values('湯姆','[email protected]');
========
==================================================================================================
SHOW VARIABLES LIKE '%character%'; ==> 查看字符編碼配置
| character_set_client | gbk 客戶端的編碼 ***
|
| character_set_results | gbk 結果集的編碼 ***
|
| character_set_connection | utf8 客戶端連接的編碼
|
| character_set_database | utf8 數據庫默認使用的編碼
|
| character_set_filesystem | BINARY 文件系統存放時使用的編碼
|
| character_set_server | utf8 服務器編碼 安裝時指定的
|
| character_set_system | utf8 內部系統編碼
結論: 如果
使用cmd 命令控制檯操作 數據庫,
注意character_set_client 和 character_set_results 需要設置成GBK, 因爲我們的命令控制航使用gbk碼錶顯示中文.
使用如下命令設置:
方式:
set character_set_client=gbk
set character_set_results=gbk
注意:
每次重新連接數據庫都要重新設置.
如果使用的cmd窗口操作數據庫. 就修改如下的碼錶爲gbk(cmd窗口使用的是gbk碼錶).
這種做法影響的範圍只在你當前鏈接中.
//————————————————————————————
修改一條記錄 (必須掌握)
update 表名 set 列名1 = 值 , 列名2 = 值 ....[where 條件1,條件2...]
/—————————————–
create table t_user(
id int primary key auto_increment,
name varchar(20) not null,
email varchar(20) unique
)
//-
1.修改表中id爲3 的記錄, 將name修改爲rose;
update t_user set name='rose' where id=3;
update t_user set name='rose';
//—————————————————————————————————
CREATE TABLE employee (
id INT,
NAME VARCHAR(20),
gender VARCHAR(20),
birthday DATE,
entry_date DATE,
job VARCHAR(30),
salary DOUBLE,
RESUME LONGTEXT
);
INS INTO employee VALUES(1,'zs','male','1980-12-12','2000-12-12','coder',4000,NULL);
INSERT INTO employee VALUES(2,'ls','male','1983-10-01','2010-12-12','master',7000,NULL);
INSERT INTO employee VALUES(3,'ww','female','1985-03-08','2008-08-08','teacher',2000,NULL);
INSERT INTO employee VALUES(4,'wu','male','1986-05-13','2012-12-22','hr',3000,NULL);
– 要求
– 將所有員工薪水修改爲5000元。
– 將姓名爲’zs’的員工薪水修改爲3000元。
– 將姓名爲’ls’的員工薪水修改爲4000元,job改爲ccc。
– 將wu的薪水在原有基礎上增加1000元。
//————刪除表記錄相關————————————————————————————————————-
刪除記錄語句 (必須掌握)
DELETE FROM 表名 [WHERE 條件];
1. 刪除表中名稱爲’rose’的記錄。
DELETE FROM employee WHERE NAME='rose';
2. 刪除表中所有記錄。
DELETE FROM employee ;
3.使用truncate刪除表中記錄。
TRUNCATE TABLE employee;
DELETE 刪除 和 TRUNCATE刪除(瞭解) 兩者有什麼區別?
首先,這兩種都是刪除表中的記錄.
不同的是:
1. delete 是逐行標記刪除. TRUNCATE 是將整張表包括表結構都移除,然後將表重新創建.
2. delete DML語句。 TRUNCATE DDL語句。
3。delete 刪除的記錄可以被恢復,TRUNCATE 不能回覆。
4. delete 不釋放空間,TRUNCATE 釋放空間.
5. TRUNCATE 會提交事務. (還沒學)
//————————-以上就是 增加 修改 刪除 表記錄 相關語句 ,(DML)———————————————————–
//———————————————————————————————————————————-
DQL語句(DML) 查詢語句. (必須掌握)
語法:
SELECT selection_list /要查詢的列名稱/
FROM table_list /要查詢的表名稱/
WHERE condition /行條件/
GROUP BY grouping_columns /對結果分組/
HAVING condition /分組後的行條件/
ORDER BY sorting_columns /對結果排序/
LIMIT offset_start, row_count /結果限定/
//—————————————————————————————
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);
//-------
CREATE TABLE emp( -- 員工表
empno INT, -- 員工編號
ename VARCHAR(50), -- 員工姓名
job VARCHAR(50), -- 工作
mgr INT, -- 員工上司的編號
hiredate DATE, -- 入職日期
sal DECIMAL(7,2), -- 工資
comm DECIMAL(7,2), -- 獎金
deptno INT -- 部門編號
);
INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp VALUES(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp VALUES(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);
1.1 查詢所有行所有
列
select * from stu;
*號 是通配符.通配所有列. 上面語句與下面是一模一樣的
select sid,sname,age,gender from stu;
誰的效率更高?
下面的效率更高. *需要運算.
1.2 查詢所有行指定列
select sname from stu;
2.1 條件查詢介紹
條件查詢就是在查詢時給出WHERE子句,在WHERE子句中可以使用如下運算符及關鍵字:
? =、!=、<>、<、<=、>、>=;
? BETWEEN…AND;
? IN(SET)/NOT IN(SET)
? IS NULL/IS NOT NULL
//—條件連接符
? AND; &&
? OR; ||
? NOT; !
2.2 查詢性別爲女,並且年齡小於50的記錄
select * from stu where gender='female' and age<50;
2.3 查詢學號爲S_1001,或者姓名爲liSi的記錄
select * from stu where sid='S_1001' or sname='liSi';
數據庫中,sql語句不區分大小寫 ,但是 數據區分大小寫.
2.4 查詢學號爲S_1001,S_1002,S_1003的記錄
select * from stu where sid='S_1001' or sid='S_1002' or sid='S_1003';
select * from stu where sid in('S_1001','S_1002','S_1003');
2.5 查詢學號不是S_1001,S_1002,S_1003的記錄
select * from stu where not (sid='S_1001' or sid='S_1002' or sid='S_1003');
select * from stu where sid not in('S_1001','S_1002','S_1003');
2.6 查詢年齡爲null的記錄
select * from stu where age=null;
null的特性: null不等於null 所以判斷時應如下寫法:
select * from stu where age is null;
2.7 查詢年齡在20到40之間的學生記錄
select * from stu where age >= 20 and age <= 40;
select * from stu where age between 20 and 40;
2.8查詢性別非男的學生記錄
select * from stu where gender!= 'male';
select * from stu where not gender='male';
select * from stu where gender not in ('male');
2.9 查詢姓名不爲null的學生記錄
select * from stu where sname is not null;
select * from stu where not sname is null;
//————————————————————————————————–
where 字段 like ‘表達式’;
% => 通配 通配任意個字符.
_ => 通配 通配單個字符.
說明: LIKE 條件後 根模糊查詢表達式, “_”==> 代表一個任意字符
3.1查詢姓名由5個字母構成的學生記錄
select * from stu where sname like '_____';
3.2查詢姓名由5個字母構成,並且第5個字母爲“i”的學生記錄
select * from stu where sname like '____i';
3.3 查詢姓名以“z”開頭的學生記錄
說明: “%”該通配符匹配任意長度的字符.
select * from stu where sname like 'z%';
3.4查詢姓名中第2個字母爲“i”的學生記錄
select * from stu where sname like '_i%';
3.5 查詢姓名中包含“a”字母的學生記錄
select * from stu where sname like '%a%';
//—————————————————————–
4.1 去除重複記錄
關鍵詞: distinct => 去除重複查詢結果記錄.
select gender from stu; ==> 出現大量重複的記錄
select distinct gender from stu; =>去除重複的記錄
4.2查看僱員的月薪與佣金之和
select sal*12+comm from emp;
null與任何數字計算結果都是null.上面的寫法是錯誤的.
使用IFNULL(參數1,參數2) 函數解決. 判斷參數1的值是否爲null,如果爲null返回參數2的值.
select sal*12 + IFNULL(comm,0) from emp;
*這個函數在所有數據庫通用嗎?
不通用.
4.3 給列名添加別名
select sal*12 + IFNULL(comm,0) as '年收入' from emp;
** select sal*12 + IFNULL(comm,0) '年收入' from emp;
select sal*12 + IFNULL(comm,0) 年收入 from emp;
//——————————————————————————————————————————
5.1 查詢所有學生記錄,按年齡升序排序
asc: 升序
desc:降序
select * from stu order by age asc;
默認就是升序
select * from stu order by age;
5.2 查詢所有學生記錄,按年齡降序排序
select * from stu order by age desc;
5.3 查詢所有僱員,按月薪降序排序,如果月薪相同時,按編號升序排序
select * from emp order by sal desc , empno asc;
聚合函數
聚合函數是用來做縱向運算的函數:
? COUNT():統計指定列不爲NULL的記錄行數;
? MAX():計算指定列的最大值,如果指定列是字符串類型,那麼使用字符串排序運算;
? MIN():計算指定列的最小值,如果指定列是字符串類型,那麼使用字符串排序運算;
? SUM():計算指定列的數值和,如果指定列類型不是數值類型,那麼計算結果爲0;
? AVG():計算指定列的平均值,如果指定列類型不是數值類型,那麼計算結果爲0;
6.1 COUNT
當需要縱向統計時可以使用COUNT()。
? 1>查詢emp表中記錄數:
select count(*) from emp;
2>查詢emp表中有佣金的人數:
select count(*) from emp where comm is not null and comm >0;
3>查詢emp表中月薪大於2500的人數:
select count(*) from emp where sal > 2500;
4>統計月薪與佣金之和大於2500元的人數:
select count(*) from emp where sal+IFNULL(comm,0) > 2500;
5>查詢有佣金的人數並且有領導的人數:
select count(*) from emp where comm > 0 and mgr is not null;
6.2 SUM(計算總和)和AVG(計算平均值)
當需要縱向求和時使用sum()函數。
1>查詢所有僱員月薪和:
select sum(sal) from emp;
2>查詢所有僱員月薪和,以及所有僱員佣金和:
select sum(sal),sum(comm) from emp;
3>查詢所有僱員月薪+佣金和:
select sum(sal+IFNULL(comm,0)) from emp;
4>統計所有員工平均工資:
select avg(sal) from emp;
6.3 MAX和MIN
? 查詢最高工資和最低工資:
select max(sal),min(sal) from emp;
//—————————————————————————————————————————————
分組查詢
當需要分組查詢時需要使用GROUP BY子句,例如查詢每個部門的工資和,這說明要使用部分來分組。
? 1>查詢每個部門的部門編號和每個部門的工資和:
select deptno,sum(sal) from emp group by deptno;
2>查詢每個部門的部門編號以及每個部門的人數:
select deptno,count(ename) from emp group by deptno;
3>查詢每個部門的部門編號以及每個部門工資大於1500的人數:
select deptno,count(ename) from emp where sal>1500 group by deptno ;
HAVING子句
4>查詢工資總和大於9000的部門編號以及工資和:
select deptno,sum(sal) from emp group by deptno having sum(sal)>9000;
使用having在分組之後加條件.
where和having都可以加條件?
1.where在分組之前加條件.
2.having在分組之後加條件.
where的效率要遠遠高於having. 分組本身消耗資源非常大.
//———————————————–以上是查詢———————————————————————————
//———————————————-以下是分頁相關知識—————————————————————————————
LIMIT(MySQL方言) (必須掌握)
LIMIT用來限定查詢結果的起始行,以及總行數。
1>查詢5行記錄,起始行從0開始
select * from emp limit 0,5;
2> 查詢10行記錄,起始行從3開始
select * from emp limit 3,10;
3>如果一頁記錄爲5條,希望查看第3頁記錄應該怎麼查呢?
? 第一頁記錄起始行爲0,一共查詢5行;
select * from emp limit 0,5;
? 第二頁記錄起始行爲5,一共查詢5行;
select * from emp limit 5,5;
? 第三頁記錄起始行爲10,一共查詢5行;
select * from emp limit 10,5;
//—————————————————————————————————————————————-