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來對多個字段進行去重數據庫