數(shù)據(jù)庫(kù)三范式
- 1.保持每列字段的原子性
保存用戶(hù)的地址不用一個(gè)字段address來(lái)保存,而是用幾個(gè)字段組成,比如:country,province,city,location
- 2.在第一范式基礎(chǔ)上,確保表中的每列都和主鍵相關(guān)(保持表的純粹,即保持表的原子性)
一個(gè)表中只能保存一類(lèi)數(shù)據(jù),不可以把多類(lèi)數(shù)據(jù)保存在同一張數(shù)據(jù)庫(kù)表中,比如,學(xué)生信息表里不應(yīng)該有成績(jī)字段
- 3.在第二范式基礎(chǔ)上,每列字段都和主鍵直接關(guān)系,而不是間接關(guān)系
字段之間不能相互依賴(lài)
jdbc連接Url格式:
jdbc:mysql://[host:port]/[database]
jdbc:mysql://localhost:3306/DBTest
jdbc驅(qū)動(dòng)下載
連接代碼
jdbc.properties文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/DBTest
user=masaike
pwd=馬賽克
JDBCUtil Class
/**
* 描述:JDBCUtil.
* <p>
*
* @author yanwenqiang.
* @date 2018/11/12
*/
public class JDBCUtil {
private String driver;
private String url;
private String user;
private String password;
private Connection connection;
public JDBCUtil() {
Properties prop = new Properties();
//加載配置文件
try {
prop.load(this.getClass().getResourceAsStream("jdbc.properties"));
} catch (IOException e) {
e.printStackTrace();
}
this.driver = prop.getProperty("driver");
this.url = prop.getProperty("url");
this.user = prop.getProperty("user");
this.password = prop.getProperty("pwd");
try {
long start = System.currentTimeMillis();
Class.forName(driver);
long end = System.currentTimeMillis();
System.out.println("反射耗時(shí):" + (end - start));
} catch (Exception e) {
e.printStackTrace();
}
}
public Connection getConnection() throws SQLException {
connection = DriverManager.getConnection(url, user, password);
return connection;
}
public void closeConn() throws SQLException {
if (this.connection != null) {
this.connection.close();
}
}
}
為什么不直接new一個(gè)Driver?源代碼Driver中靜態(tài)代碼塊里就在注冊(cè)一個(gè)Driver,如果采用傳統(tǒng)new方式,會(huì)兩次new Driver.
上源碼:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.mysql.cj.jdbc;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
}
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
}
Command Line
mysql -u root -p 登錄
show full processlist; 顯示完整的進(jìn)程列表
show processlist; 顯示簡(jiǎn)單進(jìn)程列表
sql語(yǔ)句
left outer join (outer可省略)
理解: 左連接. 以左邊表為基準(zhǔn),右邊表數(shù)據(jù)可能為空
格式: select * from [左表] [左表別名] left join [右表] [右表別名] on [左表別名].[左表關(guān)聯(lián)字段] = [右表別名].[右表關(guān)聯(lián)字段]
例子: select * from student s left join stuSubject b on s.id = b.sid;
right outer join (outer可省略)
與left outer join 相反
inner join
理解: 內(nèi)連接. 兩張關(guān)聯(lián)表都有數(shù)據(jù)的才會(huì)被查出
格式: select * from [左表] [左表別名] inner join [右表] [右表別名] on [左表別名].[左表關(guān)聯(lián)字段] = [右表別名].[右表關(guān)聯(lián)字段]
例子: select * from student s inner join stuSubject b on s.id = b.sid;
group by
理解: 從英文上理解 就是分組的意思。需要和 聚合函數(shù)(例如:max(),count(),avg()等)
配合使用,使用時(shí)至少有一個(gè)分組標(biāo)識(shí)字段(例如某一列的列名)
格式: select [聚合函數(shù)],[分組字段] from [表名] group by [分組字段];
例子: select count(id),subject_name from stuSubject group by subject_name;
order by
理解: 從英文上理解就是排序。一般后面跟上某一列的列名,然后查詢(xún)到的數(shù)據(jù)會(huì)以該列的
大小順序進(jìn)行排序顯示,默認(rèn)的是ASC(從小到大排列),desc(大到小排列)
格式: select * from [表名] order by [要排序的字段];
例子: select * from student order by age;
where
理解: 對(duì)查詢(xún)到的內(nèi)容進(jìn)行篩選,where后面跟上限定條件,where使用在分組和排序之后.
簡(jiǎn)單理解:用在非分組限定條件
例子: select * from student where sname='張三';
having
理解: 作用是篩選滿足條件的分組,即在分組之后過(guò)濾數(shù)據(jù),條件中包含聚組函數(shù),
使用having條件顯示特定的組,也可以使用多個(gè)分組標(biāo)準(zhǔn)進(jìn)行分組.
簡(jiǎn)單理解:用在分組限定條件
例子: select min(id),subject_name from stuSubject group by subject_name having subject_name!='語(yǔ)文';
mysql語(yǔ)句示例
create database DBTest;
use DBTest;
create table student(
id int primary key,
sname nvarchar(50) not null,
age int,
class nvarchar(50)
);
create table stuSubject(
id int primary key,
sid int,
subject_name nvarchar(100) not null,
foreign key(sid) references student(id) on delete cascade on update cascade
);
-- 插數(shù)據(jù)
use DBTest;
insert student values (1,'張三',20,'一年級(jí)');
insert student values (2,'李四',23,'一年級(jí)');
insert student values (3,'王五',25,'一年級(jí)');
insert stuSubject values (1,1,'語(yǔ)文');
insert stuSubject values (2,1,'數(shù)學(xué)');
insert stuSubject values (3,1,'化學(xué)');
insert stuSubject values (4,2,'語(yǔ)文');
insert stuSubject values (5,2,'物理');
insert stuSubject values (6,3,'語(yǔ)文');
insert stuSubject values (7,3,'歷史');
-- 簡(jiǎn)單查詢(xún)
select * from student;
select * from stuSubject;
select * from student where sname='張三';
select * from student order by age;
-- 查詢(xún)按照學(xué)科分組后,每組最大的id
select max(id),subject_name from stuSubject group by subject_name;
select min(id),subject_name from stuSubject group by subject_name having subject_name!='語(yǔ)文';
-- 查詢(xún)每個(gè)學(xué)科有多少
select count(id),subject_name from stuSubject group by subject_name;
-- select min(id),sid,subject_name from stuSubject group by subject_name order by sid;
-- 全表左連接
select * from student s left join stuSubject b on s.id = b.sid;
-- 選擇字段左連接
select s.*,b.sid,b.subject_name from student s left join stuSubject b on s.id = b.sid;
-- 選擇字段左連接 & 子查詢(xún)
select * from
(select s.*,b.sid,b.subject_name from student s left join stuSubject b on s.id = b.sid)
as m where id=1;
-- 測(cè)試外鍵關(guān)聯(lián)字段的級(jí)聯(lián)更新
select * from student where id=3;
select * from stuSubject where sid=3;
update student set id=3 where id=6;
select * from student where id=6;
select * from stuSubject where sid=6;