Mysql知識點記錄一

一、數據庫簡單介紹

1、 按照數據庫的發展時間順序,主要出現了以下類型數據庫系統:

Ø 網狀型數據庫

Ø 層次型數據庫

Ø 關係型數據庫

Ø 面向對象數據庫

上面4中數據庫系統中,關係型數據庫使用最爲廣泛。面向對象數據庫則是由面嚮對象語言催生的新型數據庫,目前的一些數據庫系統,如:SQL Server 2005、Oracle10g等都開始增加面向對象的特性。

 

二、常用基本SQL語句/語法

Ø SQL語句基礎理論

SQL是操作和檢索關係型數據庫的標準語言,標準SQL語句可用於操作然後關係型數據庫。

標準的SQL語句通常劃分爲以下類型:

查詢語句:主要由於select關鍵字完成,查詢語句是SQL語句中最複雜,功能最豐富的語句。

DML(Data Munipulation Language,數據操作語言)語句,這組DML語句修改後數據將保持較好的一致性;操作表的語句,如插入、修改、刪除等;

DDL(Data Definition Language,數據定義語言)語句,操作數據對象的語言,有create、alter、drop。

DCL(Data Control Language,數據控制語言)語句,主要有grant、revoke語句。

事務控制語句:主要有commit、rollback和savepoint三個關鍵字完成

DDL語句

DDL語句是操作數據庫對象的語句,包括創建create、刪除drop、修改alter數據庫對象。

常見數據庫對象

對象名稱

對應關鍵字

描述

table

表是數據庫存儲的邏輯單元,以行和列的形式存在;列是字段,行就是一條數據記錄

數據字典

 

就是系統表,存儲數據庫相關信息的表,系統表裏的數據通常有數據庫系統維護。系統表結構和數據,開發人員不應該手動修改,只能查詢其中的數據

視圖

view

一個或多個數據表裏的數據的邏輯顯示,視圖就是一張虛擬的表,並不真正存儲數據

約束

constraint

執行數據檢驗規則,用於保證數據完整性的規則

索引

index

用於提高查詢性能,相當於書的目錄

函數

function

用於完成一個特定的計算,具有返回值和參數

存儲過程

procedure

完成某項完整的業務處理,沒有返回值,但可通過傳出參數將多個值傳個調用環境

觸發器

trigger

相當於一個事件的監聽器,當數據庫發生特定的事件後,觸發器被觸發,完成響應處理

上面的對象都可以通過用create、alter、drop完成相關的創建、修改、刪除操作。

常用數據類型

列類型

說明

tinyint/smallint/mediumint int(integer)/bigint

1字節、2字節、3字節、4字節、8字節整數,又可分有符號和無符號兩種。這些整數類型的區別僅僅表現範圍不同

float/double

單精度、雙精度浮點類型

decimal(dec)

精確小數類型,相當於float和double不會產生精度丟失問題

date

日期類型,不能保存時間。當Java裏的Date對象保存到該類型中,時間部分丟失

time

時間類型,不能保存日期。當Java的Date對象的保存在該類型中,日期部分丟失

datetime

日期、時間類型

timestamp

時間戳類型

year

年類型,僅保存年份

char

定長字符串類型

varchar

可變長度字符串類型

binary

定長二進制字符串類型,它以二進制形式保存字符串

varbinary

可變長度的二進制字符串類型,二進制形式保存字符串

tingblob/blob

mediumblob/longblob

1字節、2字節、3字節、4字節的二進制大對象,可存存儲超圖片、音樂等二進制數據,分別可存儲:255/64K/16M/4G的大小

tingtext/text

mediumtext/longtext

1字節、2字節、3字節、4字節的文本對象,可存儲超長長度的字符串,分別可存儲:255/64K/16M/4G的大小的文本

enum(‘val1’, ‘val2’, …)

枚舉類型,該列的值只能是enum括號中出現的值的之一

set(‘value1’, ‘value2’, …)

集合類型,該列的值可以是set中的一個或多個值

Ø 常用查詢

MySQL結束符是“;”結束。
 
1、    顯示所有數據庫
show databases;
 
2、    刪除數據庫
drop database dbName;
 
3、    創建數據庫
create database [if not exists] dbName;
中括號部分可選的,判斷該數據不存在就創建
 
4、    切換、使用指定數據庫
use dbName;
 
5、    顯示當前使用數據庫所有的表對象
show tables;
 
6、    顯示錶結構describe(desc
desc tableName;
 
7、    創建一張表
create table user (
        --int 整型
        uId int,
        --小數
        uPrice decimal,
        --普通長度文本,default設置默認值
        uName varchar(255) default ‘zhangsan’,
        --超長文本
        uRemark text,
        --圖片
        uPhoto blob,
        --日期
        uBirthday datetime
);
 
8、    子查詢建表方法
部分列名匹配模式:
create table userInfo (
name varchar(20),
sex char
) 
as 
select name, sex from user;
上面的列名和子查詢的列名以及類型要對應
 
全部列名模式:
create table userInfo
as
select * from user;
直接將整個表的類型和數據備份到新表userInfo中
 
9、    添加表字段
添加單列
alter table user add tel varchar(11) default ‘02012345678’;
 
添加多列
alter table user 
add ( 
photo blob,
birthday date
);
上面就同時增加了多列字段
 
10、    修改表字段
修改tel列
alter table user modify tel varchar(15) default ‘02087654321’;
修改tel列的位置,在第一列顯示
alter table user modify tel varchar(15) default '02087654321' first;
修改tel列的位置,在指定列之後顯示
alter table user modify tel varchar(15) default '02087654321' after age;
注意:alter modify不支持一次修改多個列,但是Oracle支持多列修改
但是MySQL可以通過多個modify的方式完成:
alter table user 
modify tel varchar(15) default '02087654321' first, 
modify name varchar(20) after tel;
 
11、    刪除指定字段
alter table user drop photo;
 
12、    重命名錶數據
表重命名
alter table user rename to users;
 
字段重命名
alter table users change name u_name varchar(10);
alter table users change sex u_sex varchar(10) after u_name;
如果需要改變列名建議使用change,如果需要改變數據類型和顯示位置可以使用modify

13、 刪除表

drop table users;
drop刪除表會刪除表結構,表對象將不存在數據中;數據也不會存在;表內的對象也不存在,如:索引、視圖、約束;
 
truncate刪除表
truncate都被當成DDL出來,truncate的作用就是刪除該表裏的全部數據,保留表結構。相當於DDL中的delete語句,
但是truncate比delete語句的速度要快得多。但是truncate不能帶條件刪除指定數據,只會刪除所有的數據。如果刪除的表有外鍵,
刪除的速度類似於delete。但新版本的MySQL中truncate的速度比delete速度快。

Ø 約束

MySQL中約束保存在information_schema數據庫的table_constraints中,可以通過該表查詢約束信息;

約束主要完成對數據的檢驗,保證數據庫數據的完整性;如果有相互依賴數據,保證該數據不被刪除。
 
常用五類約束:
not null:非空約束,指定某列不爲空
unique: 唯一約束,指定某列和幾列組合的數據不能重複
primary key:主鍵約束,指定某列的數據不能重複、唯一
foreign key:外鍵,指定該列記錄屬於主表中的一條記錄,參照另一條數據
check:檢查,指定一個表達式,用於檢驗指定數據
MySQL不支持check約束,但可以使用check約束,而沒有任何效果;
 
根據約束數據列限制,約束可分爲:
單列約束:每個約束只約束一列
多列約束:每個約束約束多列數據
 
MySQL中約束保存在information_schema數據庫的table_constraints中,可以通過該表查詢約束信息;
1、    not null約束
非空約束用於確保當前列的值不爲空值,非空約束只能出現在表對象的列上。
Null類型特徵:
所有的類型的值都可以是null,包括int、float等數據類型
空字符串“”是不等於null,0也不等於null
create table temp(
        id int not null,
        name varchar(255) not null default ‘abc’,
        sex char null
)
上面的table加上了非空約束,也可以用alter來修改或增加非空約束
增加非空約束
alter table temp
modify sex varchar(2) not null;
 
取消非空約束
alter table temp modify sex varchar(2) null;
 
取消非空約束,增加默認值
alter table temp modify sex varchar(2) default ‘abc’ null;
 
2、    unique
唯一約束是指定table的列或列組合不能重複,保證數據的唯一性。雖然唯一約束不允許出現重複的值,但是可以爲多個null
同一個表可以有多個唯一約束,多個列組合的約束。在創建唯一約束的時候,如果不給唯一約束名稱,就默認和列名相同。
唯一約束不僅可以在一個表內創建,而且可以同時多表創建組合唯一約束。
MySQL會給唯一約束的列上默認創建一個唯一索引;
create table temp (
        id int not null,
        name varchar(25),
        password varchar(16),
        --使用表級約束語法,
        constraint uk_name_pwd unique(name, password)
);
表示用戶名和密碼組合不能重複
添加唯一約束
alter table temp add unique(name, password);
alter table temp modify name varchar(25) unique;
刪除約束
alter table temp drop index name;
 
3、    primary key
主鍵約束相當於唯一約束+非空約束的組合,主鍵約束列不允許重複,也不允許出現空值;如果的多列組合的主鍵約束,
那麼這些列都不允許爲空值,並且組合的值不允許重複。
每個表最多隻允許一個主鍵,建立主鍵約束可以在列級別創建,也可以在表級別上創建。MySQL的主鍵名總是PRIMARY,
當創建主鍵約束時,系統默認會在所在的列和列組合上建立對應的唯一索引。
列模式:
create table temp(
    /*主鍵約束*/
    id int primary key,
    name varchar(25)
);
 
create table temp2(
    id int not null,
    name varchar(25),
    pwd varchar(15),
    constraint pk_temp_id primary key(id)
);
 
組合模式:
create table temp2(
    id int not null,
    name varchar(25),
    pwd varchar(15),
    constraint pk_temp_id primary key(name, pwd)
);
 
alter刪除主鍵約束
alter table temp drop primary key;
 
alter添加主鍵
alter table temp add primary key(name, pwd);
 
alter修改列爲主鍵
alter table temp modify id int primary key;
 
設置主鍵自增
create table temp(
        id int auto_increment primary key,
        name varchar(20),
        pwd varchar(16)
);
auto_increment自增模式,設置自增後在插入數據的時候就不需要給該列插入值了。
 
4、    foreign key 約束
外鍵約束是保證一個或兩個表之間的參照完整性,外鍵是構建於一個表的兩個字段或是兩個表的兩個字段之間的參照關係。
也就是說從表的外鍵值必須在主表中能找到或者爲空。
當主表的記錄被從表參照時,主表的記錄將不允許刪除,如果要刪除數據,需要先刪除從表中依賴該記錄的數據,
然後纔可以刪除主表的數據。還有一種就是級聯刪除子表數據。
注意:外鍵約束的參照列,在主表中引用的只能是主鍵或唯一鍵約束的列,假定引用的主表列不是唯一的記錄,
那麼從表引用的數據就不確定記錄的位置。同一個表可以有多個外鍵約束。
創建外鍵約束:
主表
create table classes(
        id int auto_increment primary key,
        name varchar(20)
);
從表
create table student(
        id int auto_increment,
        name varchar(22),
        constraint pk_id primary key(id),
        classes_id int references classes(id)
);
 
通常先建主表,然後再建從表,這樣從表的參照引用的表才存在。
表級別創建外鍵約束:
create table student(
        id int auto_increment primary key,
        name varchar(25),
        classes_id int,
        foreign key(classes_id) references classes(id)
);
上面的創建外鍵的方法沒有指定約束名稱,系統會默認給外鍵約束分配外鍵約束名稱,命名爲student_ibfk_n,
其中student是表名,n是當前約束從1開始的整數。
 
指定約束名稱:
create table student(
        id int auto_increment primary key,
        name varchar(25),
        classes_id int,
        /*指定約束名稱*/
        constraint fk_classes_id foreign key(classes_id) references classes(id)
);
 
多列外鍵組合,必須用表級別約束語法:
create table classes(
        id int,
        name varchar(20),
        number int,
        primary key(name, number)
);
create table student(
        id int auto_increment primary key,
        name varchar(20),
        classes_name varchar(20),
        classes_number int,
        /*表級別聯合外鍵*/
        foreign key(classes_name, classes_number) references classes(name, number)
);
 
刪除外鍵約束:
alter table student drop foreign key student_ibfk_1;
alter table student drop foreign key fk_student_id;
 
增加外鍵約束
alter table student add foreign key(classes_name, classes_number) references classes(name, number);
 
自引用、自關聯(遞歸表、樹狀表)
create table tree(
        id int auto_increment primary key,
        name varchar(50),
        parent_id int,
        foreign key(parent_id) references tree(id)
);
 
級聯刪除:刪除主表的數據時,關聯的從表數據也刪除,則需要在建立外鍵約束的後面增加on delete cascade
或on delete set null,前者是級聯刪除,後者是將從表的關聯列的值設置爲null。
create table student(
        id int auto_increment primary key,
        name varchar(20),
        classes_name varchar(20),
        classes_number int,
        /*表級別聯合外鍵*/
        foreign key(classes_name, classes_number) references classes(name, number) on delete cascade
);
 
5、    check約束
MySQL可以使用check約束,但check約束對數據驗證沒有任何作用。
create table temp(
        id int auto_increment,
        name varchar(20),
        age int,
        primary key(id),
/*check約束*/
check(age > 20)
);
上面check約束要求age必須大於0,但沒有任何作用。但是創建table的時候沒有任何錯誤或警告。
 
 

Ø 索引

索引是存放在模式(schema)中的一個數據庫對象,索引的作用就是提高對錶的檢索查詢速度,
索引是通過快速訪問的方法來進行快速定位數據,從而減少了對磁盤的讀寫操作。
索引是數據庫的一個對象,它不能獨立存在,必須對某個表對象進行依賴。
提示:索引保存在information_schema數據庫裏的STATISTICS表中。
 
創建索引方式:
自動:當表上定義主鍵約束、唯一、外鍵約束時,該表會被系統自動添加上索引。
手動:手動在相關表或列上增加索引,提高查詢速度。
 
刪除索引方式:
自動:當表對象被刪除時,該表上的索引自動被刪除
手動:手動刪除指定表對象的相關列上的索引
索引類似於書籍的目錄,可以快速定位到相關的數據,一個表可以有多個索引。
 
創建索引:
create index idx_temp_name on temp(name);
 
組合索引:
create index idx_temp_name$pwd on temp(name, pwd);
 
刪除索引:
drop index idx_temp_name on temp;

 

Ø 視圖

視圖就是一個表或多個表的查詢結果,它是一張虛擬的表,因爲它並不能存儲數據。
視圖的作用、優點:
限制對數據的訪問
讓複雜查詢變得簡單
提供數據的獨立性
可以完成對相同數據的不同顯示
    
創建、修改視圖
create or replace view view_temp
as
    select name, age from temp;
通常我們並不對視圖的數據做修改操作,因爲視圖是一張虛擬的表,它並不存儲實際數據。如果想讓視圖不被修改,可以用with check option來完成限制。
create or replace view view_temp
as
    select * from temp
with check option;
 
修改視圖:
alter view view_temp
as
    select id, name from temp;
 
刪除視圖:
drop view view_temp;
 
顯示創建語法:
show create view v_temp;

 

Ø DML語句

DML主要針對數據庫表對象的數據而言的,一般DML完成:
插入新數據
修改已添加的數據
刪除不需要的數據
1、    insert into 插入語句
insert into temp values(null, ‘jack’, 25);
主鍵自增可以不插入,所以用null代替
 
指定列
insert into temp(name, age) values(‘jack’, 22);
在表面後面帶括號,括號中寫列名,values中寫指定列名的值即可。當省略列名就表示插入全部數據,
注意插入值的順序和列的順序需要保持一致。
Set方式插入,也可以指定列
insert into temp set id = 7, name = 'jason';
 
MySQL中外鍵的table的外鍵引用列可以插入數據可以爲null,不參照主表的數據。
 
使用子查詢插入數據
insert into temp(name) select name from classes;
 
多行插入
insert into temp values(null, ‘jack’, 22), (null, ‘jackson’ 23);
 
2、    update 修改語句
update主要完成對數據的修改操作,可以修改一條或多條數據。修改多條或指定條件的數據,需要用where條件來完成。
修改所有數據
update temp set name = ‘jack2’;
所有的數據的name會被修改,如果修改多列用“,”分開
update temp set name = ‘jack’, age = 22;
修改指定條件的記錄需要用where
update temp set name = ‘jack’ where age > 22;
 
3、    delete 刪除語句
刪除table中的數據,可以刪除所有,帶條件可以刪除指定的記錄。
刪除所有數據
delete from temp;
刪除指定條件數據
delete from temp where age > 20;

 

Ø select 查詢、function 函數

select查詢語句用得最廣泛、功能也最豐富。可以完成單條記錄、多條記錄、單表、多表、子查詢等。
1、    查詢某張表所有數據
select * from temp;
*代表所有列,temp代表表名,不帶條件就查詢所有數據
 
2、    查詢指定列和條件的數據
select name, age from temp where age = 22;
查詢name和age這兩列,age 等於22的數據。
 
3、    對查詢的數據進行運算操作
select age + 2, age / 2, age – 2, age * 2 from temp where age – 2 > 22;
 
4、    concat函數,字符串連接
select concat(name, ‘-eco’) from temp;
concat和null進行連接,會導致連接後的數據成爲null
 
5、    as 對列重命名
select name as ‘名稱’ from temp;
as也可以省略不寫,效果一樣
如果重命名的列名出現特殊字符,如“‘”單引號,那就需要用雙引號引在外面
select name as “名’稱” from temp;
 
6、    也可以給table去別名
select t.name Name from temp as t;
 
7、    查詢常量
類似於SQL Server
select 5 + 2;
select concat('a', 'bbb');
 
8、    distinct 去掉重複數據
select distinct id from temp;
多列將是組合的重複數據
select distinct id, age from temp;
 
9、    where 條件查詢
大於>、大於等於>=、小於<、小於等於<=、等於=、不等於<>
都可以出現在where語句中
select * from t where a > 2 or a >= 3 or a < 5 or a <= 6 or a = 7 or a <> 0;
 
10、    and 並且
select * from temp where age > 20 and name = ‘jack’;
查詢名稱等於jack並且年齡大於20的
 
11、    or 或者
滿足一個即可
select * from tmep where name = ‘jack’ or name = ‘jackson’;
 
12、    between v and v2
大於等於v且小於等於v2
select * form temp where age between 20 and 25; 
 
13、    in 查詢
可以多個條件 類似於or
select * from temp where id in (1, 2, 3);
查詢id在括號中出現的數據
 
14、    like 模糊查詢
查詢name以j開頭的
select * from temp where name like ‘j%’;
 
查詢name包含k的
select * from temp where name like ‘%k%’;
 
escape轉義
select * from temp where name like ‘\_%’ escape ‘\’;
指定\爲轉義字符,上面的就可以查詢name中包含“_”的數據
 
15、    is nullis not null
查詢爲null的數據
select * from temp where name is null;
查詢不爲null的數據
select * from temp where name is not null;
 
16、    not
select * from temp where not (age > 20);
取小於等於20的數據
select * from temp where id not in(1, 2);
 
17、    order by
排序,有desc、asc升序、降序
select * from temp order by id;
默認desc排序
select * from temp order by id asc;
多列組合
select * from temp order by id, age;

發佈了13 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章