1. 程式人生 > >資料庫部分(MySql)_1

資料庫部分(MySql)_1

SQL規範

  以 “ ; ” 結尾;關鍵字之間要有空格(可以由多個空格);SQL語句中可以一個或多個換行;關鍵字不區分大小寫。

資料庫相關SQL

  查詢所有數庫庫:  

    show databases;

  建立資料庫:   

    create database 資料庫名稱;

  檢視單個數據庫詳情

    show create database 資料庫名稱;

  刪除資料庫

    drop database 資料庫名稱;

  建立資料庫時制定字符集

    create database 資料庫名稱 character set gbk/utf8; 

  使用資料庫

    use 資料庫名稱;

表相關SQL

  什麼是表:在關係型資料中儲存資料庫的單元,類似於Excel中表,建立表的時候需要指定表的欄位資訊。

  建立表

    create table 表名 (欄位名 欄位型別,欄位名 欄位型別...);

  檢視所有表

    show tables;

  檢視單個表資訊

    show create table  表名;

  刪除表

    drop table 表名;

  建立表指定字符集和引擎

    charset engine create table 表名 (欄位名 欄位型別,欄位名 欄位型別) engine=myisam/InnoDB charset=gbk/utf8;(InnoDB:支援資料庫的感激操作,如事務、外來鍵等;MyIsam:只支援資料基礎的增刪改查)

  查看錶欄位資訊

    desc 表名;

修改表相關SQL

  修改表名

    rename table 原名 to 新名;

  修改表的引擎和字符集

    alter table 表名 engine=innodb/myisam charset=utf8/gbk;

  新增表字段(在表的最後位置新增)

    alter table 表名 add chinese int;

  在表的最前面新增

    alter table 表名 add chinese int first;

  在某個欄位的後面新增

    alter table 表名 add 新欄位名 新欄位表名 after 老欄位名;

  刪除表字段

    alter table 表名 drop 欄位名;

  修改表字段的名稱和型別

    alter table 表名 change 老欄位表明 新欄位表名 欄位型別;

  修改欄位型別和欄位的位置

    alter table 表名 modity 欄位名 新型別 first/after XXX;

表的增刪改查

  全表插入格式

    insert into 表名 values (資料1,資料2,資料3);

  指定欄位插入

    insert into 表名 (欄位名1,欄位名2...) values (資料1,資料2);

  批量插入資料格式

    insert  into 表名 values (資料1,資料2,資料3),(資料1,資料2,資料3);

  指定欄位批量格式

    insert into 表名 (欄位名1,欄位名2) values ((資料1,資料2),(資料1,資料2);

  所有欄位查詢

    select * from 表名;

  指定欄位查詢

    select 欄位名,欄位名 from 表名;

  條件查詢格式

    select * from 表名 where 條件;

  修改資料

    update 表名 set 欄位名=新的資料 where id=位置;

  刪除資料

    delete from 表名 (表內所有的資料) where 條件;

去重(distinct)

  select distinct XX from 表名;

編碼問題

  在連線資料庫後執行set names gbk;把資料庫的解碼字符集修改成gbk。

主鍵約束

  主鍵:表示表中資料唯一性的欄位稱為主鍵。

  約束:約束就是建立表的時候給表中欄位新增的限制條件。

  主鍵約束:添加了主鍵約束的欄位,儲存的數值必須唯一而且非空

    create table 表名 (欄位名 型別 primary key,欄位名 型別);

  主鍵自增約束

    create table 表名 (欄位名 型別 primary key auto_increment,欄位名 型別);

自增的特點

  值為null時會自動賦值;以表中曾出現的最大值基礎上+1;刪除資料自增數值不減少;delete清空表,自增數值不變。

如何讓自增數值清零

  使用truncate關鍵字,相當於drop+create。

    truncate table 表名;

註釋

  建立表的時候可以通過 comment 關鍵字對欄位進行描述

    create table 表名 (欄位名 型別 primary key auto_increment comment'這個欄位是主鍵',name varcher(20) comment '姓名'); 

` 和 ' 的區別

  `的作用是用來修飾表名和欄位名(可以省略);

    create table `表名` (id int ,name varchar(20));

  ' '是作用是用來修飾字符串。

資料冗餘

  由於表設計不夠合理,出現大量的重複資料,成為冗餘資料;可以通過拆分表的形式,把可能重複的資料儲存到一張新的表中,在原表中只需要通過一個id建立關係即可,這種建立關係的欄位稱之為外來鍵;

  create table T1(id int primary key auto_increment,name varchar(20));

  create table T2(id int primary key auto_increment,name varchar(20),T1_id int (上級分類));

事務

  事務是資料庫中執行SQL語句的最小工作單位,把多條SQL語句放在事務中可以保證多條SQL要麼全部成功,要麼全部失敗。

  檢視資料庫的提交狀態

    show variables like '%autocommit%';

  關閉/開啟自動提交

    set autocommit = 0/1;

  事務回滾

    rollback;此關鍵字會把資料庫記憶體中的資料回滾到上一次commit的點;

    savepoint 設定回滾點

      savepoint 標識(隨便起);

  指定的回滾到某個回滾點

    rollback to 標識;

事務的應用場景

  當執行某一件事需要多行SQL語句時,並且要求多行SQL要麼全部成功,要麼全部失敗,此時必須使用事務,不然就會出現多行SQL部分成功部分失敗的情況。

SQL分類

  DDL: (Deta Definition Language)資料定義語言,包括create、drop、alter、truncate;不支援事務。

  DML: (Deta Manipulation Language)資料操作語言,包括insert、delete、update、select(DQL);支援事務。

  DQL: (Data Query Language)資料查詢語言,只包括select;不支援事務。

  TCL: (transaction Control Language)事務控制語言,包括commit、rollback、savepoint、rollback to等。

  DCL: (Data Control Language)資料控制語言;分配使用者許可權相關的SQL。

資料型別

  整數:

    int(m):四個位元組,和JAVA中的int一致;

    bigint(m):八個位元組,和JAVA中的long一致;

    m代表顯示長度,但是必須和zerofill關鍵字結合使用  create table 表名(num int(10) zerofill);

  浮點數型別

    double(m,d):m代表總長度,d代表小數點後面的長度;

    decimal(m,d):超高精度小數,需要涉及高精度運算時使用;

  字串型別

    char(m):長度不可變,執行效率高,最大長度255;

    varchar(m):長度可變,節省空間,最大長度65535(超255建議使用text);

    text:長度可變,通常儲存長度大於255的文字資料,最大值65535;

  日期型別

    date:只儲存年月日;

    time:只儲存時分秒;

    datetime:年月日時分秒,預設值為null,最大值9999-12-31;

    timestamp(時間戳):年月日時分秒,預設為當前時間,最大值為2038-01-19。

別名

  查詢表中所有的欄位名   並把原欄位名改成XXX   以下有三種方法:

    select 原欄位名 as '別名' from 表名

    select 原欄位名 '別名' from 表名

    select 原欄位名 別名 from 表名

and  or  in

  and 和 java中的&&效果一樣

  or 和 java中的||效果一樣

  select * from 表名 where sal=1500 and deptno=10;

  select * from 表名 where sal=1500 or sal=3000 or sal=5000;

  select * from 表名 where sal in (5000,1500,3000);

between X and Y 查詢X和Y之間的資訊  (包括X和Y)

    select * from 表名 where job between X and Y;

查詢

    用於模糊查詢

  _:代表單個未知字元   包含字元a: _a%

  %:代表0個或多個位置字元  以a開頭: a%;以a結尾: %a

  不包含XXX

    select * from 表名 where 欄位名 not like '%啪啪%';

  包含XXX

    select * from 表名 where 欄位名 like '%啪啪%';

排序

  order by 寫在 where 的後面;沒有 where && limit 寫在後面;

  order by 後面寫排序的欄位名,可以寫一個或多個,預設排序規則為升序,也可以指定規則:升序(asc) 降序(desc)。

分頁查詢(limit)

  limit X,Y :x代表跳過的條數;y代表查詢的條數(每頁的條數)。

    案例:查詢第n頁沒頁m條資料     limit (n-1)*m,m;
日期及相關函式

  select 'Hello World';

  now() 獲取當前日期+時間         select now();

  獲取當前日期        select curdate();

  獲取當前時間        select curtime();

  從年月日時分秒提取年月日 和提取時分秒   select date(now());        select time(now());

  從年月日時分秒中提取年,月,日,時,分,秒
    select extract(year from now());

    select extract(month from now());

    select extract(day from now());

    select extract(hour from now());

    select extract(minute from now());

    select extract(second from now());

  日期的格式化        格式:date_format(日期,格式);

  %Y 代表四位年 %y 兩位年

  %m 兩位月     %c 一位月

  %d 日       

  %H 24小時     %h 12小時

  %i 分            %s 秒

  改變格式

    select date_format(now(),'%Y年%m月%d日 %H點%i分%s秒');

  把非標準格式的時間轉成標準格式

    str_to_date(非標準格式的時間,格式);

  轉成標準格式

    select str_to_date ('15.08.2016 08:00:00','%d.%m.%Y %H:%i:%s');

ifnull函式

  age=ifnull(x,y) 如果x的值為null 則 age=y, x不為null則age=x
        update emp set comm=ifnull(comm,0);

聚合函式

  對多條資料進行統計查詢

    求平均值 avg(欄位名)  select avg(欄位名) from 表名;

    最大值 max(欄位名)   select max(欄位名) from 表名;

    最小值 min(欄位名)  select min(欄位名) from 表名;

    總和 sum(欄位名)    select sum(欄位名) from 表名;

    查詢符合條件的條數     select count(*) from 表名 where 欄位名=XX;

字串相關函式

  字串拼接 concat(s1,s2) 結果為    s1s2   

    select 欄位名,concat(欄位名,拼接資料) from 表名;

  獲取字串的長度 char_length(欄位名)

    select 欄位名,char_length(欄位名) from 表名;

  獲取字串在另一個字串中出現的位置

    格式一:instr(str,substr);  select instr('asdfg','d');  //3

    格式二:locate(substr,str);  select locate('d','asdfg');  //3

  轉換大小寫  

    select upper('abc');select lower('NBA');

  去兩端空白 

    字串中間的空白不能去  select trim('  ab c   ');

  擷取字串

    從左邊擷取:    select left('abcdefg',2);

    從右邊擷取:    select right('abcdefg',3);

    從某個位置擷取:    select substring('abcdefg',2,3);//從第二個資料開始擷取三個資料

  重複

    select repeat('ab',3);

  反轉

    select reverse('abc');

  替換

    select replace('abcdefg','c','m');

  插入

    select insert('abcdefg',3,2,'m');//把從第三個位置開始的兩個資料替換成‘m’。