原生mysql

mysql數據庫練習:html

數據庫三範式: [推薦博客](https://www.cnblogs.com/knowledgesea/p/3667395.html)
        1FN每一列屬性都不能再分(字段不可再分),原子性,亦不冗餘
        2FN每一行的數據只能與其中一列相關,一行數據只作一件事,
        3FN數據不能存在傳遞關係,每一個屬性都和主鍵有之間關係而不是間接關係
展現數據庫  show databases;
建立數據庫   create database xxx;
刪除數據庫   drop database xxx;
選擇數據庫   use xxx;

展現數據表   show tables;
建立數據表   create table student(id int)
            create table if not exists `teacher`(
                  `id`  int unsigned auto_increment,
                 `name` varchar(32) not null,
                 `time` date ,
                 primary key(`id`)
            )engine=innodb default charset=utf8;    
刪除數據表  drop table xxx;

插入數據    insert into teacher (id,name,time) values(1,'alex','2018-2-9');
查詢語句    select * from  teacher
修改語句    update teacher set name='wusir' where id =1;
刪除行     delete from teacher where id =2;

其餘查詢:
    like    select * from teacher where name like 'al%';
            模糊匹配
            '%a'     //以a結尾的數據
            'a%'     //以a開頭的數據
            '%a%'    //含有a的數據
            '_a_'    //三位且中間字母是a的
            '_a'     //兩位且結尾字母是a的
            'a_'     //兩位且開頭字母是a的
    union      用於將不一樣表中相同列中查詢的數據展現出來(不包括重複數據)
    union all  用於將不一樣表中相同列中查詢的數據展現出來(包括重複數據)
       使用形式以下
       SELECT 列名稱 FROM 表名稱 UNION SELECT 列名稱 FROM 表名稱 ORDER BY 列名稱;
       SELECT 列名稱 FROM 表名稱 UNION ALL SELECT 列名稱 FROM 表名稱 ORDER BY 列名稱;
    order by  select * from teacher order by id asc / desc ; 升序/降序
    group by  分組
    inner join / left join / right join
    A表5行數據,B表10條數據;則  A left join B 最多行數爲 14行(B表中的數據所有重複對應A表的一行數據),最少行數爲5行(B表和A表沒有對應關係)
    null值處理 is null / is not null 
    
    case語句的查詢
    推薦博客:https://blog.csdn.net/u013514928/article/details/80969949
    select case when state='1' then '成功' when state='2' then '失敗' else '其餘' end from student
    或者
    select state case when '1' then '成功' when '2' then '失敗' else '其餘' end from student;
    case語句的修改
    update student set name=case when name='a' then 'aa' when name='b' then 'bb' else 'cc' end where ...
    
    rlike 正則匹配
    事務
        原子性 一致性 隔離性 持久性
        控制語句
            begin / start transaction
            commit  / commit work
            rollback  / rollback work 
            savepoint identifiler 在事務中建立一個保存點
            release savepoint identifier 把事務回滾到標記點
            set transaction 設置事務的隔離級別,innodb存儲引擎提供事務的隔離級別有read uncommitted、read commmitted、depeatable read 和serlalizable
        mysql事務處理主要有兩種方法
            1,begin開始一個事務
            1,begin開始一個事務
              操做語句 for update
              rollback事務回滾
              commmit事務確認
            2,直接使用set來改變mysql的自動提交模式
              set autocommit = 0 禁止自動提交
              set autocommit = 1 開啓自動提交
    alter命令,修改數據表名或修改數據表字段
        展現表的字段類型            show columns from 表名
        展現表的各類信息(引擎等)   show table status like 'course'
        增 alter table 表名 add 字段名 字段類型
        刪 alter table 表名 drop 字段名
        改 alter table 表名 modify 字段名 新的字段類型
           或 alter table 表名 change 原字段名 新字段名 新字段類型
        alter table默認設置字段爲空值,也能夠設置默認值 在上邊的語句後面加上 not null default 100
        修改字段默認值
            alter table 表名 alter 字段名 set default 默認值;
        刪除字段默認值
            alter table 表名 alter 字段名 drop default
        修改表類型,如將表的類型有innodb修改成myisam
            alter table 表名 engine = myisam
        修改表名
            alter table 表名 rename to 新表名
        刪除外鍵約束
            alter table 表名 drop foreign key keyName(keyName是外鍵別名)
        修改字段的相對位置(這裏name1爲想要修改的字段,type1爲該字段原來類型,first和after二選一,這應該顯而易見,first放在第一位,after放在name2字段後面)
            alter table 表名 modify name1 type1 first|after name2;
            
        還能夠用來建立及刪除mysql數據表的索引
        
    觸發器 基於行觸發
        建立觸發器
            CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_stmt
            trigger_name:觸發器的名稱
            tirgger_time:觸發時機,爲BEFORE或者AFTER
            trigger_event:觸發事件,爲INSERT、DELETE或者UPDATE
            tb_name:表示創建觸發器的代表,就是在哪張表上創建觸發器
            trigger_stmt:觸發器的程序體,能夠是一條SQL語句或者是用BEGIN和END包含的多條語句
            六種觸發器
                BEFORE INSERT,BEFORE DELETE,BEFORE UPDATE
                AFTER INSERT,AFTER DELETE,AFTER UPDATE
            建立多個執行語句的觸發器
                CREATE TRIGGER 觸發器名 BEFORE|AFTER 觸發事件
                ON 表名 FOR EACH ROW
                BEGIN
                    執行語句列表
                END
            通常狀況下,mysql默認是以 ; 做爲結束執行語句,與觸發器中須要的分行起衝突

   爲解決此問題可用DELIMITER,如:DELIMITER ||,能夠將結束符號變成||
   當觸發器建立完成後,能夠用DELIMITER ;來將結束符號變成;mysql

在BEGIN...END語句中也能夠定義變量,可是隻能在BEGIN...END內部使用:
            DECLARE var_name var_type [DEFAULT value] #定義變量,可指定默認值
            SET var_name = value  #給變量賦值
            
            數據
                NEW.columnname:新增行的某列數據
                OLD.columnname:刪除行的某列數據
                
            示例
                user表
                    CREATE TABLE `users` (
                      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
                      `name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,
                      `add_time` int(11) DEFAULT NULL,
                      PRIMARY KEY (`id`),
                      KEY `name` (`name`(250)) USING BTREE
                    );
                logs表
                    CREATE TABLE `logs` (
                    `Id` int(11) NOT NULL AUTO_INCREMENT,
                    `log` varchar(255) DEFAULT NULL COMMENT '日誌說明',
                    PRIMARY KEY (`Id`)
                    );
                建立觸發器   
                    DELIMITER $
                    CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROW
                    BEGIN
                    DECLARE s1 VARCHAR(40)character set utf8;
                    DECLARE s2 VARCHAR(20) character set utf8;#後面發現中文字符編碼出現亂碼,這裏設置字符集
                    SET s2 = " is created";
                    SET s1 = CONCAT(NEW.name,s2);     #函數CONCAT能夠將字符串鏈接
                    INSERT INTO logs(log) values(s1);
                    END $
                    DELIMITER ;
                而後就能夠發現當咱們在user表中插入新值後,log表就會增長相應字段,如插入 user.name = aaa,則log.log = aaa is created
            
            


    函數
        定義變量(推薦博客:https://www.cnblogs.com/EasonJim/p/7966918.html)
        1,在set 或select直接賦值,變量名以@開頭
            例如 set @var = 1; (注意select中要使用 :=)
        2,以declare關鍵字聲明的變量,只能在存儲過程當中使用,稱爲存儲過程變量
            例如 declare var1 int default 0;
        菜鳥教程地址:http://www.runoob.com/mysql/mysql-functions.html
        字符串相關
            ascii char_length charaacter_length concat concat_WS field  find_in_set  format  insert locate lcase left locate lower lpad ltrim mid  ....
            可使用 select char_length('abc') as 長度 ,這樣的查詢形式來輸出函數結果
            set @s="runoob";
            select char_length(@s) as 測試;
        數字相關
            abs acos asin atan atan2 avg ceil ceiling cos cot count degrees div exp greatest least  max ...
        日期相關
            adddate addtime courdate current_date current_time date day 
        高級函數
            bin binary    case when  then when then end   cast  coalesce connection_id conv convert 
    運算符
        算術運算符
            + - * / %  select 1+2
        比較運算符
            = <> != > <   between  not between in  not in <=> like rlike is null  is not null   
        邏輯運算符
            not ! and or xor(異或)
        位運算符
            &(按位與) |(按位或) ^(按位異或) !(取反) <<左移 >>右移
        運算符優先級
            由低到高
            :=
            || or xor
            && and
            not
            between case when then else
            = <=> >= > <= < <> != IS like regexp in
            |
            &
            << >>
            - +
            * / div % mod
            ^
            -(一元減號)  ~(一元比特反轉)
            ! binary collate


數據類型
    數值
    https://blog.csdn.net/shenziheng1/article/details/79471340
        類型          大小      範圍(有符號)             範圍(無符號)   用途
        tinyint         1字節      (-128,127)             (0,255)         小整數值
        smallint        2字節      (-32768,32767)         (0,65535)       大整數值
        mediumint       3字節      (-8388608,8388607)     (0,16777215)    大整數值
        int或integer     4字節      以此類推,2的32次方                        大整數值
        bigint          8字節      以此類推,2的64次方                        極大整數值
        float           4字節(指數位8位,尾數位有23位,符號位1位)-2^128 ~ +2^128 單精度/浮點數值
        double          8字節(指數位11位,尾數位有52位,符號位1位)-2^1024 ~ +2^1024  雙精度/浮點數值
        decimal  對decimal(M,D),若是M>D,爲M+2不然爲D+2                     小數值
    字符串類型
        char           0-255字節     定長字符串
        varchar        0-65535字節       變長字符串
        tinyblob       0-255字節     不超過255個字符的二進制字符串
        tinytext       0-255字節     短文本字符串
        blob           0-65535字節       二進制形式的長文本數據
        text           0-65535字節       長文本數據
        mediumblob     0-16777215字節 二進制形式的中等長度文本數據
        mediumtext     0-16777215字節 中等長度文本數據
        longblob       0-4294967295字節    二進制形式的極大文本數據
        longtext       0-4294967295字節    極大文本數據
        
    日期和時間類型
        類型          大小(字節)      範圍                格式                用途
        database        3       1000-01-01/9999-12-31       YYYY-MM-DD          日期值
        time            3       '-838:59:59'/'838:59:59'    HH:MM:SS            時間值或持續時間
        year            1       1901/2155                   YYYY-MM-DD          年份值
        datatime        8       1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS  混合日期和時間值
        timestamp       4       1970-01-01 00:00:00/2038    YYYYMMDDHHMMSS      混合日期和時間值,時間戳

時間相關函數:https://www.cnblogs.com/ggjucheng/p/3352280.html
查詢2011的數據:select * from 表 where year(date)='2011';
查找月份爲12的數據:select * from 表 where month(date)='12';
查找天數爲本年次日的數據:select * from 表 where dayofyear(date)='2';
select * from 表 where 這是必須的
year,month,dayofyear是mysql的函數,分別是取得年,月,和當前時間在本年是第幾天的3個函數
date就是你保存時間的字段sql

sql可使用group by來對多個字段進行去重數據庫

相關文章
相關標籤/搜索