1.SQL簡介
SQL:Structured Query Language 的縮寫(操作關係數據庫中的數據)
中文名稱:結構化查詢語言
作用:是一種定義、操作、管理關係數據庫的句法。大多數關係型數據庫都支持。
結構化查詢語言的工業標準由ANSI(美國國家標準學會,ISO的成員之一)維護。
組成:
DDL:數據定義語言
DML:數據操作語言
DCL:數據控制語言
DQL:數據查詢語言(sql最難的部分就是查詢)
數據庫管理軟件 可以幫我們隔離具體的物理數據存儲的方式,通過邏輯結構,來操作物理數據。
即我們操作的都是 二維表,所有的數據都是以二維表的形式存在。
那麼二維表是如何組織起來的呢?
一個數據庫管理軟件中,可以存在多個數據庫;一個數據庫類中可以有多個二維表。
通過二維數據表,將數據庫的數據組織起來
區分兩個概念:
數據庫管理系統:用於管理數據的軟件和工具。
數據庫系統:上層應用,數據庫管理系統,數據,DBA(database administer)
數據庫管理軟件 工作過程 簡介,見圖:
常用的數據庫(軟件)
Oracle(只做數據庫和數據服務) / DB2(IBM)/ informix(專注於數據庫中的事務處理)
/ Sybase(發明了一個power desgin,輔助軟件)/ SQLServer2000,2005 /
MySQL(開源免費) / Access(office中) / SQLite(Android)等
MySQL 的安裝和配置:
5.5版本要設置兩個目錄:服務的安裝目錄,數據的安裝目錄(Innodb)
此目錄需要記住
還要記住root的賬號密碼。
見教程。
數據庫服務器、數據庫軟件、數據庫和表的關係:
1.所謂安裝數據庫服務器,只是在機器上裝了一個數據庫管理程序,這個管理程序可以管理多個數據庫,一般開發人員會針對每 一個應用創建一個數據庫。
爲保存應用中實體的數據,一般會在數據庫創建多個表,以保存程序中實體的數據。
2.一個user對象的數據,在表中可能就是一行數據記錄(bean類),一行中有多列。
表與表之間的區別就在於:表結構的不同,即每個表所對應的數據的 屬性的 個數/屬性名/類型等不同
DDL語言就是用來定義表的結構的(增加、刪除一列或者一行)。
MySQL常見數據類型:
VARCHAR、BLOB和TEXT類是變長類型。每個類型的存儲需求取決於列值的實際長度。
在整數類型中,我們要注意bit類型,bit類型,是指位類型,bit(M),表示數據用多少個二進制位來表示
範圍:
DDL語言
Data Definition Language
概述:
作用:
用於描述數據庫中要存儲的現實世界實體的語言。即創建數據庫和表的結構 管理數據庫和表的結構。
創建/管理 :數據庫(的操作) 和 表結構(增刪改查).
常用關鍵字:
CREATE ALTER DROP
使用流程:
1.進入數據庫:cmd 打開DOS窗口,輸入mysql -uroot -p密碼
2.會跳轉到 mysql>
對數據的操作:
3.查看數據庫軟件中所有數據庫: show databases;
4.創建一個數據庫mydb1 : create database mydb1;
創建時加入額外信息:
//創建使用指定字符集的數據庫:
create database mydb1 character set gbk;
//創建一個帶有校對規則的指定字符集的數據庫:
create database mydb1 character set gbk collate gbk_chinese_ci;
5.查看數據庫:
show databases ; ——查看當前服務中有哪些數據庫。
show create database mydb2; —— 查看之前創建的數據庫的基本信息
6.修改數據庫:
對數據庫的修改:
只能修改 字符集 和 校對集。
alter database mydb2 character set utf8;
7.刪除數據庫:
drop database mydb3; ——刪除之前創建的數據庫。
對錶的操作:
首先表長什麼樣子?
------------------------------------------------------
Field | type | Null | Key | Default | Extra |
id | int(11) | YES | | NULL | |
name |varchar(30) | YES | | NULL | |
------------------------------------------------------
基本語法:create table
1.創建數據表:
先創建一個數據庫
create database sql01;
use sql01; 進入這個數據表
顯示當前處在哪個數據庫: select database();
1. 向表中添加數據:
create table t_employee(id int, name varchar(10),gender varchar(3), birthday date, entry_data date,
resume text);
2.加入到數據表中
insert into t_employee value(97);
select keng from t_employee; 默認的取出方法
//取出一個a;
select keng+0 form t_employee;
//取出一個97;
select oct(keng) form t_employee;取出97的八進制表示
select hex(keng) from t_employee;取出97的十六進制表示
顯示錶:
****顯示全表:desc t_employee;
顯示數據表中添加的所有項目的信息:
2.修改表結構:alter table ....
添加一列:add
alter table t_employee add 列名 類型;
alter table t_employee add image blog;
修改一列的長度爲60:modify
alter table t_employee modify Field列的屬性名 varchar(60)
(只能修改列的數據類型,不能修改其列名Field)
eg. alter table t_employee modify name int;
刪除某一列:drop
later table t_employee drop image;
修改表名:rename
rename table t_employee to user;(重新命名錶,爲user)
查看一個數據庫中有多少張表:
show tables;
設置表的字符集:character set gbk;
alter table user character set gbk;
(一般直接設置set names gbk;就行了)
修改列名:change
alter table user change 列名 新列名 新數據類型;
alter table user change name username varchar(20);
設置默認值:default
alter table 表名 modify 列名 對應的類型 default '修改的默認值';
alter table user modify username varchar(20) default ''; //設置username的Type屬性爲空串
DML語言和DQL語言:
這兩個語言需要放在一起配合使用:
作用:操作表中數據。(DQL專門進行數據查詢)
1.DML:Data Manipulation Language
作用:
用於向數據庫表中插入、刪除、修改數據。
常用關鍵字:
INSERT 、UPDATE 、 DELETE(insert,update,delete)
在修改表結構的時候,修改的是某一列。而表中的數據是以行爲單位的。
DML 則是以行爲單位進行數據修改。
DML語句基本操作:
插入數據:insert
可以選擇在一行中的某幾個位置插入數據,其他位置會自動補null;
數據類型要相同,長度不能超過原本的長度。
字符串和日期型數據應該包含在單引號中。
可以插入null;
語句:insert into table(column1,column2,...) value(value1 , value2,....)
eg. create table employee(id int,name varchar(20),sex bit,birthday date,...);
//創建所有屬性列,並給每個屬性列創建值,
insert into employee(id,name,sex,birthday,...)values(1,'zs',0,'2000-01-01');
//如果所有數據都要初始化的話,可以簡便寫法:
**insert into employee(id,name,sex,birthday,...)values(1,'王五',1,'1999-01-01');
插入時還可以:
insert into employee values(1,'lisi',1,'1999-01-01'),(2,'zs','1999-02-03'),(...);
(不過這樣是默認對這一行的每一個屬性列都進行插入)
但是————會報錯,因爲編碼的問題,見後面,這裏需要設置 set names gbk; 就可以解決這個問題了;
修改(更新)表中數據:update
將id 修改:(所有行/特定行)
1.update employee set id=10; —— (沒有where指定行)則會修改 id 所在列的所有元素,都改爲10;
2.update employee set id=10 where name='zs'; ——指定了行(where),修改其原本的id爲10;
(where 某行的屬性鍵值對)
類比:java中的name.equals("zs")
3.在原有基礎上加減
update employee set id=id+10 where name='zs';
刪除表中數據:delete
刪除的單位是:行
delete from employee where id=1; //刪除定位的行
delete from employee; //不使用where,直接刪除這個表中所有數據
它只能刪除表中數據,不能刪除表本身,如果要刪除表,要使用drop table
DQL語句:
1. select語句:
基本select語句:
查詢表中所有列:select * from 表名;
(*相當於一個通配符,可以選擇某幾行屬性來輸出,select name,id,.. from student;)
查詢表中某些屬性列的值: select 屬性列1,屬性列2 * from 表名;
在查詢時 過濾 表中重複數據:select distinct * from 表名;
可對 列通過 表達式進行運算:
select name,math+10 from 表名; //對math列的所有值都加了10
查詢成績的總分:
select name,chinese+english+mash from 表名;
但是列的名字叫:chinese+english+mash
可以通過起別名的方式: as 別名
select name,chinese+english+mash as score from 表名;
查詢某個姓名爲李的信息:
select * from 表名 where name like'李%';
在where中經常使用的操作符:
1.like : 模糊查詢
Like語句中,pattern 爲 % 代表零個或多個任意字符,_ 代表一個字符,
例first_name like ‘_a%’;
2.between and : 表示數據在某一個區間範圍內(閉區間)。
select * from 表名 where id between 80 and 100;
3.isnull: 如果表中數據有null時,那麼在向找到某個屬性值是否爲null,不能通過=null,而是isnull;
select * from 表名 where id isnull;
4.in(set) 表示判斷屬性值是否在集合中存在。
select * from 表名 where math in(55,77,100);找出具有這幾個元素的行。
5.邏輯運算符: and / or / not
and : 表示多個條件同時成立
or: 表示其中一個條件成立的;
not : 不成立(where not(salary > 1000))
(select name from student where math not in(50,70));
—— 表示math的成績不是50和70的學生的姓名;
6.關係運算符:< > = <= .. 不等於:<>
查詢的過程:
通過篩選滿足條件的數據,然後將這些數據放在一張臨時表中,顯示出來。
重命名也是在臨時表中進行重命名。
eg. select name,math+chinese from 表名 as score where score>100;//這樣找不到socre
那麼就要用到 order by :
select name,math+chinese as score from 表名 order by socre;
基本語法:select * from table where ... order by column1 desc(ASC是默認,升序,DESC爲降序), column2 asc(desc), column3 asc(desc)...;
(實現同一個表下的多種排序)
mysql的中文亂碼:
查看所有地方的字符編碼:show variables like 'character%'
確定字符編碼的地方一共有六處:client——>connection——>數據庫服務器內部(database/)——>results
內部字符集不會出錯,則只需要關注 client、connection、results
但是還需要注意:客戶端(console命令行)只支持GBK,編碼模式。
****做法:
set names gbk;(將client/connection/result的編碼格式改爲gbk)只要這三個編碼一致,就不會出現亂碼
查看mysql所使用的字符集:show variables like 'character';
set character_set_result=utf8;設置某一個的字符集:中文就會出現亂碼;
(轉換流程見下圖):
約束
概述:
約束作用:
(1)定義規則
(2)確保完整性:包括數據的精確性、可靠性。以確保數據不會出錯,或者儘量減少出錯。
約束的類型:
(1)非空約束
(2)主鍵約束
(3)外鍵約束(右外鍵約束)(左外鍵約束)
(4)唯一約束
(5)檢查約束
1.數據完整性約束:
數據完整性是爲了保證插入到數據中的數據是正確的,它防止了用戶輸入的錯誤。
1.實體完整性(唯一性)
規定表中的一行記錄在表中是唯一的實體,通過表的 主鍵 來約束。
主鍵:一個或多個 可以唯一表示 一個實體的屬性或屬性集合。(如果不能在本列中唯一,則不是主鍵)
tid(主鍵) name age (name也可能重名,所以不能作爲主鍵)
1 'zx' 18
2 'lisi' 18
設置主鍵約束:
1.primary :
primary id int primary key;
主鍵有兩層含義:
1.實體存在:
不能給主鍵設置爲null,因爲這樣就表示這個記錄不存在,那麼就沒有意義。
2.實體在表中唯一:
如果沒有設置主鍵約束,那麼可以隨意向表中添加 重複記錄。
如果設置了主鍵,那麼表中如果再插入同樣的記錄,則不會插入成功。
2.域完整性約束:
指數據庫表的列(即字段)必須符合某種 特定的數據類型 或 約束
not null; //非空約束 : 字段名 數據類型 not null;
unique; // 唯一性約束 :字段名 數據類型 unique;
設置了某列的兩個約束 not null unique的時候,那麼相當於給此列變成主鍵;
***一個表中可以有多個unique聲明,但是隻能有一個主鍵primary key 聲明。
3.參照完整性約束(外鍵):
在顯示生活當中,存在很多實體,實體之間存在着聯繫。
在數據庫中通過表的實體數據的引用 在關係表中表示他們之間的關係。
在一個數據庫中:
有兩個實體表(主鍵表)(學生表,選課表),和一張關係表(選課表),可以表示不同學生的選課的信息。
在關係表中,如果,一個學生選擇了一個不存在的課程,或者一個不存在的學生,選擇了一個存在的課程,這些都是不合理的數據。
在參照完整性中,你所引入的必須是存在的實體數據。
課程表(sid) | 學生表(tid) | (關係表)選課表
classid(主鍵) name | studentid(主鍵) name age | classid studentid score
1 java | 1 'zs' 18 | 1 2 100
2 c++ | 2 'lisi' 20 | 1 1 80
3(這就是一個不存在的數據項)
也就是說在進行inter into 關係表 values(3,1,90);將無法插入,因爲3無法在對應的主鍵中找到列表項。
但是insert into 關係表 values(1,1,100);可以插入。
添加參照完整性約束的語法:
(學生表 :create table st(sid int premary key;)
課程表 :create table coures(tid int )
create table cs(ssid int,ttid int,score int,
constraint sid_st_fk foreign key(ssid) reference st(sid); //引用了外界的sid,
constraint tid_course_fk foreign key(ttid) reference course(tid);
)
外鍵約束的語法:
constraint 外鍵名 foreign key(字段名1,字段名2..) reference 主表名(主鍵列1,主鍵列2,...);
外鍵名:定義的外鍵約束的名稱,一個表中不能有相同的外鍵名;
字段名:表示子表需要添加外鍵約束的字段列;
主表名:表示被子表外鍵所依賴的表的名稱(主鍵所在的表);
主鍵列:表示主表中定義的 主鍵列或列組合;
什麼是外鍵?
首先它是表中的一個字段,,它可以不是本表的主鍵,但對應另外一個表的主鍵。
作用:外鍵用來保證數據引用的完整性
2.多表設計
主鍵可以是一個組合(所有設置了主鍵的屬性就是主屬性,主屬性不能爲null)
多對多關係:
例如學生選課:
一個學生可以選擇多門課;多門課可以被多個同學選擇
現在要存儲選課學生的數據:
tid(主鍵) | name | pointdis(主鍵) | name | age
1 | java | 2 | zs | 18
1 | c | 1 | zs | 18
2 | c | 2 | lisi | 20
有幾個異常:
插入異常
有些學生還沒有選課,那麼他在選課表中沒有數據,那麼就加入不進
刪除異常:
刪除幾個選課信息之後,發現某些課程沒了
更新異常:
修改一個名字,需要修改相關的所有學生的姓名(同一個數據需要修改很多次)
解決方案:將所有數據分散到不同的表當中,那麼修改相應的主鍵屬性就可以達到目的了。
(消除數據的冗餘)
將 多對多的關係:
放入多張表中存儲:三張表中兩張實體表,一張關係表
一對多的關係:
例如:一個學生和所在的省份
一個省可以包含多個學生,一個學生只能選擇一個省份
兩種存法:
1.也是三張表,省份一張表,學生一張表,關係一張表
2.兩張表:一張存省份(多的實體),一張存學生(一的實體),並有一個外界引用 prevince_id
一對一的關係:
一表即可。
多表設計的規範:
範式等。