天天看點

SQL快速入門

關系化資料庫

儲存關系模式資料的容器

關系模式是對業務對象實體,屬性以及關系的抽象,提煉需求的名詞是建立實體關系模型常用的方法。要了解E-R實體關系圖的繪制。

常用關系資料庫

Microsoft SQL Server;微軟公司産品,中等規模資料庫,運作在window平台,一般結合.net開發平台使用

Oracle;甲骨文公司産品,大型商業資料庫,可以運作在任何作業系統上,經常與java一起使用。

MySQL;最初是一個開源免費的資料庫産品,中小型資料庫,輕便,網際網路行業主流資料庫

SQLITE;嵌入式資料庫,安卓内部主要資料庫。

資料庫的連接配接與組成

連接配接網絡上的資料庫

mysql -h ip -P port -u root -p 回車 輸入密碼

show databases; 檢視所有資料庫

安裝mysql後會自帶兩個資料庫mysql,test

mysql存放一些資料庫的核心資料,使用者權限密碼等

test用來測試的資料庫

在一個伺服器上,可以使用多個資料庫database,一個資料庫内部建立對個資料表table

在資料庫中存在多個使用者,每個用後都有相應的操作權限,預設有個root使用者,是超級管理者具有所有權限

table表的一行稱為一條記錄,一般對應着java程式中的一個對象

SQL語言

結構化查詢語言

特性

1,非過程性語言,每一條SQL語句獨立執行沒有先後的依賴關系

2,官方提供的資料庫标準語言,任何資料庫都必須支援SQL語言文法

3,SQL是用來存取關系型資料庫的語言,具有查詢,操縱,定義和控制關系型資料的四方面功能。

為加強SQL的語言能力,各廠商增強了過程性語言的特征,提供SQL語言的擴充

SQL語言分類

DDL;資料定義語言,用來定義資料庫的對象,如資料表,視圖,索引

DML;資料操縱語言,在資料庫表中更新,增加和删除記錄,如update,insert,delete

DCL;資料控制語言,使用者設定使用者權限和控制事務語句,如grant,revoke,if else,while,begin transaction

DQL;資料查詢語言,資料查詢語言,如select

SQL語句的使用

建立資料庫

CREAT DATABASE[IF NOT EXISTS] db_name;

character set 編碼表 collate比較方式;//為資料庫指定字元集合比較方式,如果不指定使用預設的編碼集和比較方式

檢視資料庫

show creat database db_name;檢視目前資料庫編碼集

select database();檢視目前使用的資料庫

删除資料庫

drop database db_name;

修改資料庫編碼

alter database db_name character set 編碼表

切換資料庫

use db_name;如果想要對資料庫進行操作,需要切換到指定的資料庫

建立資料表

create table table_name(列名 類型(長度),列名 類型(長度))character set編碼表

如果沒有指定編碼表會使用資料庫預設的

如 create table user(

id int,

name varchar(40),

password varchar(40),

birthday date

);

java資料類型與資料庫資料類型的對應關系,除了字元串類型必須要指定長度之外其他的都可以使用預設長度

字元串 VARCHAR,CHAR對應string,前者是長度可變經常使用,後者是長度固定的性能好些

大資料類型 BLOB,TEXT;前者主要存些位元組檔案,後者存儲字元檔案

數值型 TINYINT,SMALLINT,INT,BIGINT,FLOAT,DOUBLE分别對應byte,short,int,long,float,double

邏輯型 BIT

日期型 DATE,TIME,DATETIME,TIMESTAMP

建立表明之後可以通過desc 表名檢視表結構

單表的限制

定義主鍵限制;主鍵限制唯一辨別一條記錄,主鍵不能為空不能重複,主鍵如果為數字類型一般設定主鍵自動增長auto_increment

primary key

唯一限制;該字段内容不允許重複

unique

定義非空限制;值不能為空

not null

如 create table employee(

id int primary key not null auto_increment,

name varchar(40) unique not null

gender varchar(10) not null,

entry_date date not null,

birthday date not null,

job varchar(20) not null,

resume longtext not null

salary double not null,

);

資料表修改

alter table使用該語句增加,修改或删除列的文法

alter table 表名 add 列名 類型(長度) 限制;//增加

alter table 表名 modify 列名 類型(長度) 限制;//修改

alter table 表名 drop 列名 //删除

修改已有資料表一列的名稱

alter table 表明 change 舊列名 新列名 類型(長度) 限制

修改表名 rename table 舊表名 to 新表名

修改表的字元集 alter table 表名 charater set utf8;要注意表的編碼集與資料庫的編輯不是同一個

show tables 檢視目前資料庫中的所有表

alter primary修改主鍵

資料庫CRUD語句

Insert語句

Insert into 表名(列名,列名。。。) values(值,值,。。。)

要注意列與值的互相對應。

Insert into employee(id,name,gender,entry_date,birthday,job,resume,salary) values(null,'zs','mall','2012-10-10','1990-01-10','hr',3000,'he is a man');

值中除了數字不用加單引号之外,其他所有值都要加單引号

在插入資料時,如果有些列存在預設值或者可以為null,插入可以省略這些列,隻需要關注不能為空的列就好

另外在插入資料的時候,也可以省略所有列名,但是必須按照表的順序插入所有列的值

要注意SQL的編碼問題。

Update語句

update 表名 set 列名=值,列名=值 where 條件語句

注意如果沒有寫where語句限制條件,則會将該列的所有資料都進行更改

update employee set salary=5000;//這句話把所有員工的新水都改為5000

update emploee set salary=5000 where name='zs';将zs的薪水改為5000,要注意此處算是SQL語句的餓一個bug條件比較時可能不區分大小寫,如果ZS的薪水存在也會更改,需要再name前加入關鍵字binary使比較更精确

update employee set salary=5000 where binary name='zs';

update employee set salary=salary+1000 where binary name='zs';在原先的擠出上增加

Delete語句

delete from 表名 where 條件語句

删除不能删除某一列的值,隻能删除一行記錄,如果不增加where條件語句會将表中的所有記錄删除,但是不會删除表,

表的删除使用drop語句

另外truncate 表名 語句也可以删除所有表記錄,但是不可恢複,

truncate語句原理是将表删除,然後重建立張表,不可恢複資料,而delete語句可以删除一行記錄,也可以删除整個表的所有記錄,他的原理是将所有行的記錄删除,并不會将表删除,在一個事務中是可以復原rollback恢複的。删除整表時truncate語句性能好些,不會占用資源。

select語句

select *|指定列名 from 表名

select * from employee 檢視表中所有的資料

select gendet from employee 檢視表中的gender列資料

select distinct gender from employee 檢視表中的gender列資料,不顯示重複,distinct關鍵字就是去重的。

該使用什麼語句應該根據具體的需求,插入語句insert 删除語句delete 都是對整行的操作 update,select是對列的操作,update可以對整列也可以加入限制條件對列的一部分操作,select隻能對整列進行操作。

查詢時進行運算

select 列名運算表達式 from 表名

select 列名 as 列别名 from 表名

select name,english+10 from scores;英語成績列都加十分

select name,english +math+chinese as 總分 from scores;注意as可以省略,該語句的作用是查詢并求總分,總分顯示列english +math+chinese更改為别名總分

查詢時進行過濾查詢

使用where語句進行過濾查詢

select english+math+chinese as 總分 where name='zs'查詢zs的總分

select * from scores where english >80;查詢英語分數大于80的記錄

select語句中常用的運算符

> < <= >= = <>不等于

between...and...

select * from scores where chinese between 70 and 80;注意先寫小的後寫大的

in()在幾個固定值中取值。

select * from scorse where chinese in(70,80,90);查詢國文成績是70和80,90中的記錄

like 模糊查詢結合%通配符和_通配符使用,%代表任意長度字元串,_表示單個字元

select * from scores where name like '老%'查詢名字以老開頭的所有記錄

select * from scores where name like '老_'查詢名字以老開頭的兩字名字額所有記錄

is null ,is not null ,注意不可以寫=null,因為null本身就是一個值,代表1/2;0是false 1是true;

當and與or同時使用時,and的優先級大于or

查詢時進行排序order by語句

select * from 表名 where 條件語句 order by 列名 asc|dsc,列名asc|dsc

asc是升序,dsc是降序

分組函數---結合查詢分組進行資料統計

count(*)傳回查詢結果記錄的條數

select count(*) from scores where math>90;傳回資料成績大于90的記錄共有多少條

sum(列名)對一列的資料求和

select sum(match) from scores ;求數學總成績

select sum(match),sum(chinese) from scores 求國文數學各科的成績總和

select sum(match+chinese) from scores 求國文數學的總成績

avg對列資料求平均值

select avg(math) from scores 求數學的平均值,對于null值是不參與運算的

select avg(math+chinese) from scores 求總分的平均分,同樣有過有一條記錄有個null值他的其他成績也補參與運算

max,min對一列資料求最值。

分組

分組的目的是為了統計,分組的前提是有重複資料,按照重複資料進行分組歸類

如對不同部門按照部門分組,不同班級按照班級分組。

group by語句,要注意where是不能與group by同時使用的

having關鍵字,添加分組查詢的條件

select product,sum(price) from oders group by product having sum(price)>100

資料庫資料的備份和恢複

備份資料庫 mysqldump -u 使用者名 -p 資料庫名>備份檔案名.sql

資料庫恢複

首先建立一個空的資料庫然後 mysql -u 使用者名 p 資料庫名 < 檔案名.sql 在cmd中使用

外建限制的使用

多表設計

1,建立多張表

2,通過外建限制建立表之間的從屬關系表,

alter table employee add foreign key(dept_id) references dept(id);對員工表添加外建限制,将部門id列與部門表的id列相關聯。

添加了外建限制後,不能随便取值,取值是引用表存在主鍵值,也不能随便删除值。