關係型:如sqllite,db2,oracle,access,sql server,MySQL,注意:sql語句通用 非關係型:mongodb,redis,memcache
MySQL是一個關係型數據庫管理系統
MySQL是最好的 RDBMS (Relational Database Management System,關係數據庫管理系統) 應用軟件。
MySQL所使用的 SQL 語言是用於訪問數據庫的最經常使用標準化語言。MySQL 軟件採用了雙受權政策,分爲社區版和商業版,
因爲其體積小、速度快、整體擁有成本低,
尤爲是開放源碼這一特色,通常中小型網站的開發都選擇 MySQL 做爲網站數據庫。
mysql -uroot -p set password = password('root'); # 給當前數據庫設置密碼 create user 'eva'@'%' #指示全部機器均可以鏈接 show grants for 'eva'@'192.168.10.5';查看某個用戶的權限 mysql -uroot -p123 -h 192.168.10.3 #遠程登陸 grant all on *.* to 'eva'@'%'; #受權 flush privileges; # 刷新使受權當即生效 grant all on *.* to 'eva'@'%' identified by '123' # 建立帳號並受權
SQL : 結構化查詢語言(Structured Query Language)html
SQL語言主要用於存取數據、查詢數據、更新數據和管理關係數據庫系統,SQL語言由IBM開發。mysql
一、DDL語句 定義: 數據庫、表、視圖、索引、存儲過程,create drop alter正則表達式
二、DML語句 操縱: insert delete update selectredis
三、DCL語句 控制: 例如控制用戶的訪問權限 grant revoke(廢除 撤銷)sql
1. 操做文件夾(庫) 增:create database db1 charset utf8; 查:show databases; 改:alter database db1 charset latin1; 刪除: drop database db1; 2. 操做文件(表) 先切換到文件夾下:use db1 增:create table t1(id int,name char); 查:show tables; 改:alter table t1 modify name char(3); alter table t1 change name name1 char(2); 刪:drop table t1; 3. 操做文件中的內容(記錄) 增:insert into t1 values(1,'egon1'),(2,'egon2'),(3,'egon3'); 查:select * from t1; 改:update t1 set name='sb' where id=2; 刪:delete from t1 where id=1; 清空表: delete from t1; #若是有自增id,新增的數據,仍然是以刪除前的最後同樣做爲起始。 truncate table t1;數據量大,刪除速度比上一條快,且直接從零開始, *auto_increment 表示:自增 *primary key 表示:約束(不能重複且不能爲空);加速查找
mysql 存儲引擎
InnoDB、MyISAM、MEMORY 、BLACKHOLE(黑洞)mongodb
InnoDB數據庫
用於事務處理應用程序,支持外鍵和行級鎖。若是應用對事物的完整性有比較高的要求,在併發條件下要求數據的一致性,數據操做除了插入和查詢以外,還包括不少更新和刪除操做,那麼InnoDB存儲引擎是比較合適的。InnoDB除了有效的下降由刪除和更新致使的鎖定,還能夠確保事務的完整提交和回滾,對於相似計費系統或者財務系統等對數據準確要求性比較高的系統都是合適的選擇。緩存
MyISAM安全
若是應用是以讀操做和插入操做爲主,只有不多的更新和刪除操做,而且對事務的完整性、併發性要求不高,那麼能夠選擇這個存儲引擎。架構
Memory
將全部的數據保存在內存中,在須要快速定位記錄和其餘相似數據的環境下,能夠提供極快的訪問。Memory的缺陷是對錶的大小有限制,雖然數據庫由於異常終止的話數據能夠正常恢復,可是一旦數據庫關閉,存儲在內存中的數據都會丟失。
存儲引擎相關sql語句
查看當前的默認存儲引擎:
show variables like "default_storage_engine";
查詢當前數據庫支持的存儲引擎
show engines \G;
指定存儲引擎建表
在建表時指定
create table ai(id bigint(12),name varchar(200)) ENGINE=MyISAM;
create table country(id int(4),cname varchar(50)) ENGINE=InnoDB;
也可使用alter table語句,修改一個已經存在的表的存儲引擎。
alter table ai engine = innodb;
在配置文件中指定
#my.ini文件 [mysqld] default-storage-engine=INNODB
MySQL架構 四層
1 鏈接處理、受權認證、安全等
2 MySQL的核心服務。包括:查詢解析、分析、優化、緩存以及全部的內置函數(例如:日期、時間、數學和加密函數)
3 存儲引擎。存儲引擎負責MySQL中數據的存儲和提取。
4 文件系統,全部的表結構和數據以及用戶操做的日誌最終仍是以文件的形式存儲在硬盤上。
查看錶結構 desc 表名; show create table 表名\G;
mysql 支持的數據類型
https://www.cnblogs.com/Eva-J/articles/9683316.html
表的完整性約束
https://www.cnblogs.com/Eva-J/articles/9687915.html
主鍵 外鍵 聯級更新 聯級刪除
#表類型必須是innodb存儲引擎,且被關聯的字段,即references指定的另一個表的字段,必須保證惟一 create table department( id int primary key, name varchar(20) not null )engine=innodb; #dpt_id外鍵,關聯父表(department主鍵id),同步更新,同步刪除 create table employee( id int primary key, name varchar(20) not null, dpt_id int, foreign key(dpt_id) references department(id) on delete cascade # 連級刪除 on update cascade # 連級更新 )engine=innodb; #先往父表department中插入記錄 insert into department values (1,'教質部'), (2,'技術部'), (3,'人力資源部'); #再往子表employee中插入記錄 insert into employee values (1,'yuan',1), (2,'nezha',2), (3,'egon',2), (4,'alex',2), (5,'wusir',3), (6,'李沁洋',3), (7,'皮卡丘',3), (8,'程咬金',3), (9,'程咬銀',3) ; #刪父表department,子表employee中對應的記錄跟着刪 mysql> delete from department where id=2; Query OK, 1 row affected (0.00 sec) mysql> select * from employee; +----+-----------+--------+ | id | name | dpt_id | +----+-----------+--------+ | 1 | yuan | 1 | | 5 | wusir | 3 | | 6 | 李沁洋 | 3 | | 7 | 皮卡丘 | 3 | | 8 | 程咬金 | 3 | | 9 | 程咬銀 | 3 | +----+-----------+--------+ 6 rows in set (0.00 sec) #更新父表department,子表employee中對應的記錄跟着改 mysql> update department set id=2 where id=3; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from employee; +----+-----------+--------+ | id | name | dpt_id | +----+-----------+--------+ | 1 | yuan | 1 | | 5 | wusir | 2 | | 6 | 李沁洋 | 2 | | 7 | 皮卡丘 | 2 | | 8 | 程咬金 | 2 | | 9 | 程咬銀 | 2 | +----+-----------+--------+ 6 rows in set (0.00 sec)
修改 表結構
alter table 表名 rename 新表名;
alter table 表名 add 字段名 數據類型 [完整性約束條件…];
alter table 表名 drop 字段名
alter table 表名 modify 字段名 數據類型 [完整性約束條件…];
alter table 表名 change 舊字段名 新字段名 舊數據類型(完整約束條件);
alter table 表名 change 舊字段名 新字段名 新數據類型(完整約束條件)
修改字段排列順序/在增長的時候指定字段位置 ALTER TABLE 表名 ADD 字段名 數據類型 [完整性約束條件…] FIRST; ALTER TABLE 表名 ADD 字段名 數據類型 [完整性約束條件…] AFTER 字段名; ALTER TABLE 表名 CHANGE 字段名 舊字段名 新字段名 新數據類型 [完整性約束條件…] FIRST; ALTER TABLE 表名 MODIFY 字段名 數據類型 [完整性約束條件…] AFTER 字段名;
alter table staff modify sex enum('male','female') after sname; alter table staff modify id int(4) primary key auto_increment; 刪除主鍵 須要先去掉主鍵的自增約束,而後再刪除主鍵約束 alter table staff modify id int(11); alter table staff drop primary key; alter table staff add primary key (sname,age); alter table staff drop primary key; alter table staff add primary key (id); alter table staff modify id int(4) auto_increment;
-----多對一------ create table press( id int primary key auto_increment, name varchar(20) ); create table book( id int primary key auto_increment, name varchar(20), press_id int not null, foreign key(press_id) references press(id) on delete cascade on update cascade );
更新數據update update 表名 set 字段1=值1,字段2=值2,where condition; 實例 UPDATE mysql.user SET password=password(‘123’) where user=’root’ and host=’localhost’; ------------------------------------------------------ 刪除數據 delete delete from 表名 where condition; 例子 DELETE FROM mysql.user WHERE password=’’;
單表查詢
-------語法---------- SELECT 字段1,字段2... FROM 表名 WHERE 條件 GROUP BY field HAVING 篩選 ORDER BY field LIMIT 限制條數
------關鍵字執行的優先級--------------
from > where > group by > having > select > distinct > order by > limit
--簡單查詢-- https://www.cnblogs.com/Eva-J/articles/9688313.html
---where約束--- 1. 比較運算符:> < >= <= <> != 2. between 80 and 100 值在10到20之間 3. in(80,90,100) 值是10或20或30 4. like 'egon%' pattern能夠是%或_, %表示任意多字符 _表示一個字符 5. 邏輯運算符:在多個條件直接可使用邏輯運算符 and or not ---- group by ---------- 單獨使用GROUP BY關鍵字分組 SELECT post FROM employee GROUP BY post; 注意:咱們按照post字段分組,那麼select查詢的字段只能是post,想要獲取組內的其餘相關信息,須要藉助函數 GROUP BY關鍵字和GROUP_CONCAT()函數一塊兒使用 SELECT post,GROUP_CONCAT(emp_name) FROM employee GROUP BY post;#按照崗位分組,並查看組內成員名 SELECT post,GROUP_CONCAT(emp_name) as emp_members FROM employee GROUP BY post; GROUP BY與聚合函數一塊兒使用 select post,count(id) as count from employee group by post;#按照崗位分組,並查看每一個組有多少人 ---------------------------------------------------------- 若是咱們用unique的字段做爲分組的依據,則每一條記錄自成一組,這種分組沒有意義 多條記錄之間的某個字段值相同,該字段一般用來做爲分組的依據 ----------------------------------------------------------- 聚合函數 #強調:聚合函數聚合的是組的內容,如果沒有分組,則默認一組 SELECT COUNT(*) FROM employee; SELECT COUNT(*) FROM employee WHERE depart_id=1; SELECT MAX(salary) FROM employee; SELECT MIN(salary) FROM employee; SELECT AVG(salary) FROM employee; SELECT SUM(salary) FROM employee; SELECT SUM(salary) FROM employee WHERE depart_id=3; -------------------------------------------------------------- HAVING過濾 #!!!執行優先級從高到低:where > group by > having #1. Where 發生在分組group by以前,於是Where中能夠有任意字段,可是絕對不能使用聚合函數。 #2. Having發生在分組group by以後,於是Having中可使用分組的字段,沒法直接取到其餘字段,可使用聚合函數 ------------------------------------------------------------ ORDER BY 查詢排序 按單列排序 SELECT * FROM employee ORDER BY salary; SELECT * FROM employee ORDER BY salary ASC; SELECT * FROM employee ORDER BY salary DESC; 按多列排序:先按照age排序,若是年紀相同,則按照薪資排序 SELECT * from employee ORDER BY age, salary DESC; ------------------------------------------------------------- LIMIT 限制查詢的記錄數 SELECT * FROM employee ORDER BY salary DESC LIMIT 3; #默認初始位置爲0 SELECT * FROM employee ORDER BY salary DESC LIMIT 0,5; #從第0開始,即先查詢出第一條,而後包含這一條在內日後查5條 SELECT * FROM employee ORDER BY salary DESC LIMIT 5,5; #從第5開始,即先查詢出第6條,而後包含這一條在內日後查5條 ----------------------------------------------------------- 使用正則表達式查詢 SELECT * FROM employee WHERE emp_name REGEXP '^ale'; SELECT * FROM employee WHERE emp_name REGEXP 'on$'; SELECT * FROM employee WHERE emp_name REGEXP 'm{2}'; 小結:對字符串匹配的方式 WHERE emp_name = 'egon'; WHERE emp_name LIKE 'yua%'; WHERE emp_name REGEXP 'on$';
多表查詢
#重點:外連接語法 SELECT 字段列表 FROM 表1 INNER|LEFT|RIGHT JOIN 表2 ON 表1.字段 = 表2.字段;
#示例1:之內鏈接的方式查詢employee和department表,而且employee表中的age字段值必須大於25,即找出年齡大於25歲的員工以及員工所在的部門 select employee.name,department.name from employee inner join department on employee.dep_id = department.id where age > 25; #示例2:之內鏈接的方式查詢employee和department表,而且以age字段的升序方式顯示 select employee.id,employee.name,employee.age,department.name from employee,department where employee.dep_id = department.id and age > 25 order by age asc;
子查詢
#1:子查詢是將一個查詢語句嵌套在另外一個查詢語句中。 #2:內層查詢語句的查詢結果,能夠爲外層查詢語句提供查詢條件。 #3:子查詢中能夠包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等關鍵字 #4:還能夠包含比較運算符:= 、 !=、> 、<等
帶IN關鍵字的子查詢 ----------------------------------------------- #查詢平均年齡在25歲以上的部門名 select id,name from department where id in (select dep_id from employee group by dep_id having avg(age) > 25); #查看技術部員工姓名 select name from employee where dep_id in (select id from department where name='技術'); #查看不足1人的部門名(子查詢獲得的是有人的部門id) select name from department where id not in (select distinct dep_id from employee); ----------------------------------------------- 帶比較運算符的子查詢 #比較運算符:=、!=、>、>=、<、<=、<> #查詢大於全部人平均年齡的員工名與年齡 mysql> select name,age from emp where age > (select avg(age) from emp); +---------+------+ | name | age | +---------+------+ | alex | 48 | | wupeiqi | 38 | +---------+------+ 2 rows in set (0.00 sec) #查詢大於部門內平均年齡的員工名、年齡 select t1.name,t1.age from emp t1 inner join (select dep_id,avg(age) avg_age from emp group by dep_id) t2 on t1.dep_id = t2.dep_id where t1.age > t2.avg_age; ----------------------------------------------- 帶EXISTS關鍵字的子查詢 -------------------------- EXISTS關字鍵字表示存在。在使用EXISTS關鍵字時,內層查詢語句不返回查詢的記錄。 而是返回一個真假值。True或False 當返回True時,外層查詢語句將進行查詢;當返回值爲False時,外層查詢語句不進行查詢 -------------------------- #department表中存在dept_id=203,Ture select * from employee -> where exists -> (select id from department where id=200); #department表中存在dept_id=205,False select * from employee -> where exists -> (select id from department where id=204);
mysql 導入表
從init.sql文件中導入數據 ------------------------------- #準備表、記錄 mysql> create database db1; mysql> use db1; mysql> source /root/init.sql 注意 Windows 下的 斜槓問題