資料庫及相關知識詳解大全
友情提示以下內容是對資料庫以及相關知識所做的一個闡述,內容較多需多花費些各位看官寶貴時間,不過全是乾貨以及一些小的例項,我相信各位點進來的看官都會有所收穫。
資料庫介紹
什麼是資料庫?
資料庫(Database)是按照資料結構來組織、儲存和管理資料的倉庫,
每個資料庫都有一個或多個不同的API用於建立,訪問,管理,搜尋和複製所儲存的資料。
RDBMS即關係資料庫管理系統(Relational Database Management System)的特點:
- 1.資料以表格的形式出現
- 2.每行為各種記錄名稱
- 3.每列為記錄名稱所對應的資料域
- 4.許多的行和列組成一張表單
- 5.若干的表單組成database
RDBMS 術語
在我們開始學習MySQL 資料庫前,讓我們先了解下RDBMS的一些術語:
- 資料庫: 資料庫是一些關聯表的集合。.
- 資料表: 表是資料的矩陣。在一個數據庫中的表看起來像一個簡單的電子表格。
- 列: 一列(資料元素) 包含了相同的資料, 例如郵政編碼的資料。
- 行:一行(=元組,或記錄)是一組相關的資料,例如一條使用者訂閱的資料。
- 冗餘:儲存兩倍資料,冗餘降低了效能,但提高了資料的安全性。
- 主鍵:主鍵是唯一的。一個數據表中只能包含一個主鍵。你可以使用主鍵來查詢資料。
- 外來鍵:外來鍵用於關聯兩個表。
- 複合鍵:複合鍵(組合鍵)將多個列作為一個索引鍵,一般用於複合索引。
- 索引:使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構。類似於書籍的目錄。
資料庫是用來存放資料的。
資料庫使用一個一個的表來存放資料。
資料庫表與表之間的資料是有關係的。
現在的資料庫都是關係型資料庫。
主流的資料庫:oracle、mysql、sqlserver、db2
Mysql安裝
Win32的安裝
注意選擇編碼為utf-8和把mysql的bin目錄加入path,其他的一律下一步。
安裝完成後,開啟控制面板—管理工具—服務,可以檢視mysql服務狀態。
mysqld.exe是mysql服務啟動程式
1G=1024M=1024*1024KB=1024*1024*1024B(byte)
Mysql服務屬性中的啟動型別
自動—計算機啟動後自動啟動mysql服務
手動—需要自己去啟動mysql服務
Mysql bin目錄下的MySQLInstanceConfig.exe可以重新修改配置
啟動服務 net start 服務名
停止服務 net stop 服務名
註冊服務 程式 –install
解除安裝服務 sc delete 服務名 (sc == service)
進入mysql控制檯,mysql -uroot -p (u==username) (p==password)
退出mysql控制檯, exit;
Mysql解除安裝
刪除mysql安裝版資料庫的方法
1、執行mysql bin 目錄下的MySQLInstanceConfig.exe刪除資料庫例項和服務
2、執行安裝包,刪除mysql資料庫程式。
3、刪除c盤Program Files中的mysql目錄
4、刪除c盤隱藏資料夾Program Data中的mysql目錄
Mysql常用命令
建立資料庫
create database 資料庫名稱;
刪除資料庫
drop database 資料庫名稱;
show databases;//檢視有幾個資料庫。
use 資料庫名;//使用某個資料庫。
show tables;//檢視有幾個表
desc 表名字;//查看錶結構
命令列輸入ipconfig可以檢視本機ip地址
Ip地址是用來區分主機的
埠號是用來區分應用的
Sql介紹
Structured query language結構化查詢語言
SQL 對大小寫不敏感
SQL 以分號結尾
可以把 SQL 分為兩個部分:資料操作語言 (DML) 和 資料定義語言 (DDL)。
查詢和更新指令構成了 SQL 的 DML 部分:
- SELECT - 從資料庫表中獲取資料
- UPDATE - 更新資料庫表中的資料
- DELETE - 從資料庫表中刪除資料
- INSERT INTO - 向資料庫表中插入資料
SQL 中最重要的 DDL 語句:
-
- CREATE DATABASE - 建立新資料庫
- ALTER DATABASE - 修改資料庫
- CREATE TABLE - 建立新表
- ALTER TABLE - 變更(改變)資料庫表
- DROP TABLE - 刪除表
- CREATE INDEX - 建立索引(搜尋鍵)
- DROP INDEX - 刪除索引
sql作用:
- SQL 面向資料庫執行查詢
- SQL 可從資料庫取回資料
- SQL 可在資料庫中插入新的記錄
- SQL 可更新資料庫中的資料
- SQL 可從資料庫刪除記錄
- SQL 可建立新資料庫
- SQL 可在資料庫中建立新表
- SQL 可在資料庫中建立儲存過程
- SQL 可在資料庫中建立檢視
- SQL 可以設定表、儲存過程和檢視的許可權
RDBMS
Relational database management system關係資料庫管理系統
建立表
create table 表名稱(
列名稱 列型別,
列名稱 列型別,
列名稱 列型別
) ;
插入資料
insert into 表名稱 values(值1, 值2, 值3);
刪除所有資料
delete from 表名稱 ;
查詢表的所有資料
select * from 表名稱;
刪除表
drop table 表名稱;
表的約束
非空約束
create table stu(
no int not null,#規定no不能為空
name char(10),
age int
);
唯一約束
兩種型別的唯一約束
unique key uk_no (no) 為no新增唯一約束,約束名稱是uk_no
unique key uk_no_age (no, age) 為no和age新增唯一約束,約束的名字是uk_no_age,no和age放在一起不能與另外一條記錄重複
注意unique key uk_no_age (no, age)和
unique key uk_no (no)
unique key uk_no (age)
有很大的區別
記錄是指資料庫表中的一行資料
為欄位新增預設值
gender CHAR (1) DEFAULT '男'
主鍵是能夠唯一標識一條記錄的欄位。
主鍵有兩個特點,非空和唯一
任何一張表都有一個主鍵
主鍵是某一列
主鍵的作用是唯一標識一條記錄
主鍵的使用方式:
PRIMARY KEY (NO)
可以設定某一列不為負值
age INT UNS IGNED NOT NULL
CREATE TABLE stu (
NO INT auto_increment,
NAME CHAR (10) NOT NULL,
age INT UNSIGNED NOT NULL,
gender CHAR (1) DEFAULT '男',
PRIMARY KEY (NO)
);
CREATE TABLE if not exists stu ( #如果不存在此表就建立表
插入資料時可以向指定列插入
insert into stu (name, age, gender) values('李四', 26, '女');
查詢資料時可以只查詢指定列的資料
select name,age from stu;
where條件查詢
#查詢編號為5的名稱
select name from stu where no = 5;
#查詢性別為'男'的學生
select * from stu where gender='男';
#查詢性別不是男的學生
select * from stu where gender!='男';
#查詢年齡小於20的學生
select * from stu where age<20;
#查詢年齡大於20的女生
select * from stu where age >20 and gender='女';
更新資料
update stu set age = 20;#修改所有記錄的年齡為20
update stu set age = 20 where name = '趙小四';#將姓名為趙小四的記錄的年齡修改為20
update stu set age = 21,gender = '男';#修改所有記錄的年齡為21,性別為男。
delete from stu where name='趙小四';#刪除名稱為趙小四的記錄
select distinct(jg) from stu;#查詢籍貫,去掉重複資料
select * from stu where age >=18 and age <=30; #查詢年齡介於18到30歲之間的記錄
select * from stu where age between 18 and 30;#查詢年齡介於18到30歲之間的記錄
select * from stu where age not between 18 and 30;#查詢年齡不在18到30歲之間的記錄
select * from stu where jg IS NULL;#查詢籍貫是空的記錄
select * from stu where jg IS NOT NULL;#查詢籍貫不是空的記錄
select * from stu where jg = '河北' or jg = '哈爾濱';#查詢籍貫是河北和哈爾濱的記錄
select * from stu where age in (18, 20, 21);#查詢年齡為18,20,21的記錄
select * from stu where age not in (18, 20, 21);#查詢年齡不是18,20,21的記錄
模糊查詢
#%代表任意長度(0個、1個、多個)字元
#_匹配一個字元
name like '趙%';趙四 #以趙開頭的
name like '%趙';小趙#以趙結尾的
name like '%趙%';趙四 小趙四 小趙 # 包含趙的
name like '趙_'; #以趙開頭的兩個字元的名字
排序
select * from stu order by age desc;降序 #按照年齡降序排列
select * from stu order by age asc;升序 #按照年齡升序排列
select * from stu order by claz asc,age asc; #先按照班級升序排列,班級內按照年齡升序排列。
分頁查詢
select * from stu order by no asc limit 5;#取前五條資料
select * from stu order by no asc limit 10,5;#從第十一條開始,向後取5條,能取多少是多少
select * from stu order by no asc limit 1;#取第一條資料
select * from stu order by no desc limit 1;#取最後一條資料
統計函式
select min(age) from stu;#查詢欄位的最小值
select max(age) from stu; #查詢欄位的最大值
select avg(age) from stu; #查詢欄位的平均值
select sum(age) from stu; #查詢欄位的總和
select count(*) from stu;#查詢記錄的條數
select count(jg) from stu;#查詢欄位的條數,忽略NULL值
分組查詢
select jg, count(jg) from stu group by jg;#統計各籍貫學生數
select claz '班級',jg '籍貫', count(no) from stu group by claz,jg; #統計各班級各籍貫學生數
select claz '班級', gender '性別', count(no) from stu group by claz,gender;#統計各班級男生數和女生數
select gender '性別', count(no) '人數' from stu where claz = '1班' group by gender;#統計一班的男生數和女生數
select claz,count(no) from stu group by claz order by claz desc;#統計各班的學生數,按照班級名稱降序排列
select claz '班級', count(claz) '班內人數' from stu group by claz
having count(claz) >= 5;#統計人數超過5的班級
having和where的區別:
having和where都是限定條件
where限定的是欄位,having限定的是統計函式
where只能限定欄位,having只能使用統計函式
where跟分組沒有關係,而要是用having必須要先分組
外來鍵和多表連線查詢
在表中與另外一張表相關聯的欄位叫做外來鍵
外來鍵的資料來源於與之關聯的表的主鍵
兩個表關聯總是通過外來鍵來關聯的
關聯查詢是把兩個表先關聯起來,組成一張新表,這張表包含了兩個表的內容,然後就像查單表一樣查這個新表。
一個張表可以有多個外來鍵,只能有一個主鍵。
一張表的主鍵可以被多張表的外來鍵來參照。
一張表的外來鍵只能參照一張表的主鍵。
外來鍵可以起到約束資料的作用。
查詢persons表中的前兩條記錄
select * from persons limit 2;
查詢年齡比較小的兩個人
select * from persons order by age asc limit 10;
查詢地址中包含“北”字的人
%代表0個或多個字元
這種查詢叫做模糊查詢
select * from persons where address like '%北%';
查詢年齡是20或者25的人
select * from persons where age = 21 or age = 25;
select * from persons where age in(21,25);
查詢年齡大於等於21並且小於等於25的人
select * from persons where age >= 21 and age <= 25;
select * from persons where age between 21 and 25;
查詢年齡是22的人
select p.firstName from persons p where p.age = 22;
select firstName 姓氏,lastName 名字 from persons where age = 22;
主鍵:
主鍵(Primary Key)是一個列,在
這個列中的每一行的值都是唯一的。
主鍵的作用是為了唯一標識一條記錄
主鍵必須是非空、唯一的。
orders表中的id_p列的資料來源於persons表的id_p
id_p是persons表的主鍵,id_o是orders表的外來鍵
一個表的外來鍵參照另外一個表的主鍵,從而將兩個表建立起關係
外來鍵所在的表叫做從表,被外來鍵參照的主鍵所在的表叫做主表。
查詢所有人的姓名和訂單資訊
只有orders表的id_p和persons表的id_p相同的資料才有意義
連線查詢
select p.firstName,p.lastName, o.orderNumber
from persons p,orders o
where p.id_p = o.id_p
連線查詢
select p.*, o.*
from persons p,orders o
where p.id_p = o.id_p;
內連線
只有左表和右表匹配的資料才會顯示
select p.*,o.* from persons p
inner join orders o on p.id_p = o.id_p;
左外連線,左邊表的資料必須顯示在結果集中
如果右邊表沒有物件的資料,就補NULL
select p.*,o.* from persons p
left join orders o on p.id_p = o.id_p;
右外連線,右邊表的資料必須顯示在結果集中
如果左邊表沒有物件的資料,就補NULL
select p.*,o.* from persons p
right join orders o on p.id_p = o.id_p;
select p.*, o.* from orders o left join persons p on
p.id_p = o.id_p;
約束(Constraint)是Microsoft SQL Server 提供的自動保持資料庫完整性的一種方法,定義了可輸入表或表的單個列中的資料的限制條件
將中國員工表和美國員工表的資料聯合到一起
union去掉重複,union all不去重
請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。
列也必須擁有相似的資料型別。
select * from employees_china union
select * from employees_usa;
select * from employees_china union all
select * from employees_usa;
對persons表進行備份
mysql不支援select into
select p.* into persons_copy from persons p;
建表語句
在列的宣告上使用唯一約束
create table stu(
s_id int(10),
s_first_name varchar(255) unique not null,
s_last_name varchar(255) not null,
s_age int(10),
s_gender char(1)
);
單獨使用唯一約束
姓和名在一起使用唯一約束
create table stu(
s_id int(10),
s_first_name varchar(255) not null,
s_last_name varchar(255) not null,
s_age int(10),
s_gender char(1),
unique(s_first_name,s_last_name)
);
使用CONSTRAINT 關鍵字加約束
create table stu(
s_id int(10),
s_first_name varchar(255) not null,
s_last_name varchar(255) not null,
s_age int(10),
s_gender char(1),
CONSTRAINT xmwy unique(s_first_name,s_last_name)
);constraint 約束名約束型別具體的約束說明
刪除約束
alter table stu drop index xmwy;
主鍵
在列的宣告上使用主鍵
create table stu(
s_id int(10) PRIMARY key,
s_first_name varchar(255) unique not null,
s_last_name varchar(255) not null,
s_age int(10),
s_gender char(1)
);
主鍵
單獨加主鍵
create table stu(
s_id int(10),
s_first_name varchar(255) unique not null,
s_last_name varchar(255) not null,
s_age int(10),
s_gender char(1),
PRIMARY key (s_id)
);
使用constraint關鍵字加主鍵
create table stu(
s_id int(10),
s_first_name varchar(255) unique not null,
s_last_name varchar(255) not null,
s_age int(10),
s_gender char(1) default '男',
CONSTRAINT pk PRIMARY key(s_id)
);constraint 約束名約束型別 具體的約束說明。
刪除主鍵
alter table stu drop primary key;
給訂單表加外來鍵
alter table orders
add constraint fk
FOREIGN key(id_p) REFERENCES persons(id_p);
刪除外來鍵
alter table orders drop FOREIGN key fk;
default 約束
alter table persons alter city set default '北京';
撤銷default約束
alter table persons alter city drop default;
建立索引
create index fn on persons (firstName);
如果建立了索引,在執行查詢語句時
資料庫會自動的翻看索引
select * from persons where firstName='張';
刪除索引
drop index fn on persons;
刪除stu表
drop table stu;
刪除表中資料
delete * from stu;
刪除資料庫
drop database aaa;
刪除全表的資料
truncate table stu;
stu表加一列
alter table stu
add column tel varchar(255);
刪除一列
alter table stu
drop column tel;
自動增長,自動增長只能給主鍵加
create table stu(
s_id int(10) PRIMARY key auto_increment,
s_first_name varchar(255) not null,
s_last_name varchar(255) not null,
s_age int(10),
s_gender char(1)
);
查詢性別是NULL的學生
select * from stu where s_gender is NULL;
select * from stu where s_gender is not NULL;
檢視一個虛擬的表,它的資料來源於真實的表
對資料來源表的資料的改變,會反映到檢視上
create view dd as
select p.firstName,p.lastName,o.orderNumber
from persons p inner join orders o
on p.id_p = o.id_p;
檢視的作用:簡化查詢
select * from dd where orderNumber = 77895;
drop view dd;
日期函式
當前的日期和時間
select now();
當前的日期
select curdate();
當前的時間
select curtime();
格式化日期
select date_format(now(), '%Y-%m-%d %k:%i:%s');
計算perons表中人的平均年齡
select avg(age) from persons;
查詢persons表中年齡高於平均值的人
子查詢(一個查詢中嵌套了一個查詢)
select * from persons
where age > (select avg(age) from persons);
查詢表中有多少條資料
select count(*) from persons;
count(column_name)不包括NULL
select count(lastName) from persons;
查詢一共有幾種居住地
select count(distinct address) from persons;
找出最大年齡
select max(age) from persons;
找出年齡最大的人
select * from persons
where age = (select max(age) from persons);
最小 MIN(age)
計算年齡的和
select sum(age) from persons;
分組查詢每個人訂單總金額
分組查詢的結果只能是統計函式的結果,或者是
分組的欄位
select id_p, sum(order_price) from orders
group by id_p;
統計各個地區的人數
select city, count(*) from persons
group by city;
統計查詢人數大於等於2的地區
select city, count(*) cc from persons
group by city
having cc >=2;
統計查詢人數大於等於2的地區
select city from persons
group by city
having count(*) >=2;
查詢各個地區的男同學的人數
select city, count(*) from persons
where gender = '男'
group by city;
查詢男同學人數大於等於2的地區
select city from persons
where gender = '男'
group by city
having count(*) >=2;
where是對單個屬性進行限制
having是對統計結果進行限制
資料庫是關係型資料庫
一對多
多對一
一對一
多對多
一個人有多個訂單,一個訂單屬於一個人,人員表和訂單表是一對多的關係
訂單表和人員表是多對一
一對多和多對一,外來鍵是多的表上
mysql為資料庫,MySQL是服務,可以理解為mysql資料庫服務(注意:重點強調“服務”),sql是資料庫的查詢語言
目前使用最流行的兩種後臺資料庫即為MySQL and SQL Server。這兩者最基本的相似之處在於資料儲存和屬於查詢系統。你可以使用SQL來訪問這兩種資料庫的資料,因為它們都支援ANSI-SQL。還有,這兩種資料庫系統都支援二進位制關鍵詞和關鍵索引,這就大大地加快了查詢速度。同時,二者也都提供支援XML的各種格式。
二者所遵循的基本原則是它們的主要區別:開放vs保守。SQL伺服器的狹隘的,保守的儲存引擎與MySQL伺服器的可擴充套件,開放的儲存引擎絕然不同。
發行費用:MySQL不全是免費,但很便宜,而SQL費用就要高一些。
1. MySQL 是一個關係型資料庫管理系統,由瑞典 MySQL AB 公司開發,目前屬於 Oracle 旗下公司。MySQL 最流行的關係型資料庫管理系統,在 WEB 1應用方面 MySQL 是最好的 RDBMS (Relational Database Management System,關係資料庫管理系統) 應用軟體之一。
2. SQL Server (Microsoft SQL Server)是Microsoft 公司推出的關係型資料庫管理系統。具有使用方便可伸縮性好與相關軟體整合程度高等優點。
3. 結構化查詢語言(Structured Query Language)簡稱SQL,是一種特殊目的的程式語言,是一種資料庫查詢和程式設計語言,用於存取資料以及查詢、更新和管理關係資料庫系統。
JDBC(Java Database Connection 也就是Java資料庫連線)是如何實現Java程式和JDBC驅動的鬆耦合的?
JDBC API使用Java的反射機制來實現Java程式和JDBC驅動的鬆耦合。
什麼是JDBC連線,在Java中如何建立一個JDBC連線?
JDBC連線是和資料庫伺服器建立的一個會話。
建立JDBC連線很簡單,只需要兩步:
- 註冊並載入驅動:Class.forName()
- 用DriverManager獲取連線物件
JDBC的DriverManager是用來做什麼的?
JDBC的DriverManager是一個工廠類,我們通過它來建立資料庫連線。
在Java程式中,如何獲取資料庫伺服器的相關資訊?
使用DatabaseMetaData可以獲取到伺服器的資訊。
JDBC的Statement是什麼?
Statement是JDBC中用來執行資料庫SQL查詢語句的介面。通過呼叫連線物件的getStatement()方法我們可以生成一個Statement物件。我們可以通過呼叫它的execute(),executeQuery(),executeUpdate()方法來執行靜態SQL查詢。
JDBC的PreparedStatement是什麼?
PreparedStatement物件代表的是一個預編譯的SQL語句。用它提供的setter方法可以傳入查詢的變數。
相對於Statement,PreparedStatement的優點是什麼?
它和Statement相比優點在於:
- PreparedStatement有助於防止SQL注入,因為它會自動對特殊字元轉義。
- PreparedStatement可以用來進行動態查詢。
- PreparedStatement執行更快。尤其當你重用它或者使用它的拼量查詢介面執行多條語句時。
- 使用PreparedStatement的setter方法更容易寫出面向物件的程式碼,而Statement的話,我們得拼接字串來生成查詢語句。
PreparedStatement的缺點是什麼?
PreparedStatement的一個缺點是,我們不能直接用它來執行in條件語句
JDBC的ResultSet是什麼?
在查詢資料庫後會返回一個ResultSet,它就像是查詢結果集的一張資料表。
JDBC通過Statement和PreparedStatement中的addBatch和executeBatch方法來支援批處理。
如何回滾事務?
通過Connection物件的rollback方法可以回滾事務。它會回滾這次事務中的所有修改操作,並釋放當前連線所持有的資料庫鎖。
觸發器是一中特殊的儲存過程,主要是通過事件來觸發而被執行的。它可以強化約束,來維護資料的完整性和一致性,可以跟蹤資料庫內的操作從而不允許未經許可的更新和變化。可以聯級運算。