下載地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloadshtml
1 在MySQL官網下載zip文件,mysql
2 在任意位置保存解壓。這裏在E盤建立MySQL目錄linux
E:\MySQL\c++
3 E:\Monkey\mysql-5.7.16-winx64\目錄建立data目錄。正則表達式
4 在命令行運行E:\MySQL\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin\mysqld --initialize-insecure進行mysql服務端初始化,默認的建立了root用戶 密碼爲空sql
1 啓動服務端:E:\MySQL\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin\mysqld數據庫
2 啓動客戶端:E:\MySQL\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin\mysql -uroot -p # 密碼爲空windows
3 執行show databases;安全
結果以下:session
4 添加環境變量,把E:\MySQL\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin添加到Windows的環境變量(添加環境變量:https://jingyan.baidu.com/article/47a29f24610740c0142399ea.html)
5 Windows服務:
註冊:
E:\MySQL\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin\mysqld --install
註冊以後能夠用 "net start MySQL" 啓動服務 "net stop MySQL"中止服務
移除:
E:\MySQL\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin\mysqld --remove
yum list installed |grep mysql //若Linux自帶mysql,將其卸載 yum -y remove mysql-libs.x86_64 在官網下載yum包 url:https://dev.mysql.com/downloads/repo/yum/ yum localinstall mysql57-community-release-el6-11.noarch.rpm yum repolist enabled |grep "mysql.*-community.*" # 看是否成功添加yum倉庫 yum install mysql-community-server # 安裝 service mysqld start # 啓動 Starting mysqld:[ OK ] # 表示安裝成功
安裝編譯源碼所需的包
yum -y install make gcc-c++ cmake bison-devel ncurses-devel
以後下載並解包文件
wget http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.14.tar.gz tar xvf mysql-5.6.14.tar.gz
編譯安裝
cd mysql-5.6.14 cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/usr/local/mysql/data \ -DSYSCONFDIR=/etc \ -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_MEMORY_STORAGE_ENGINE=1 \ -DWITH_READLINE=1 \ -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \ -DMYSQL_TCP_PORT=3306 \ -DENABLED_LOCAL_INFILE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DEXTRA_CHARSETS=all \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci make && make install
MySQL的初始化
cd /usr/local/mysql scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
注意:在/etc目錄下會存在一個my.cnf,須要將此文件改名爲其餘的名字,如:/etc/my.cnf.bak,不然,該文件會干擾源碼安裝的MySQL的正確配置,形成沒法啓動。
註冊爲系統服務:
cd /usr/local/mysql/support-files cp mysql.server /etc/rc.d/init.d/mysql # 註冊服務 cp my-default.cnf /etc/my.cnf # 使用默認配置文件
服務啓動:
service mysql start
MySQL啓動後
鏈接數據庫:
mysql -uroot -ppassword # u 後面跟用戶名 p 後面是密碼
查看數據庫:
show databases;
使用數據庫:
use databases;
查看數據庫中全部表:
show tables;
建立數據庫:(create database + 數據庫名)
create database test_db_name
刪除數據庫:(drop database + 數據庫名)
drop database dbname;
create user 'monkey’@'192.168.2.2’ identified by 'passwod’; # 建立名爲 ‘monkey’ 密碼爲’password’ 登錄IP只能爲:192.168.2.2 的用戶 create user 'monkey’@'192.168.2.%' identified by 'password’; # 建立名爲 ‘monkey’ 密碼爲’password’ 登錄IP爲:192.168.2 網段的用戶 create user 'monkey’@'%' identified by 'password’; # 建立名爲 ‘monkey’ 密碼爲’password’ 登錄IP不限的用戶
grant select,insert,update on test_db_name.table1 to 'monkey’@'%'; # 對 monkey 用戶 開放數據庫:test_db_name 下表:table1 的查 插 更新的權限 grant all privileges on test_db_name.table1 to 'monkey’@'%'; # 對 monkey 用戶 開放數據庫:test_db_name 下表:table1 的全部權限 revoke all privileges on test_db_name.table1 from 'monkey’@'%'; # 取消權限
在mysql數據庫下的user表,這張表存放着用戶的信息
use mysql; select user,Host from user;
對用戶的操做也能夠修改這張表,可是不建議這樣作!
數值型:
類型 | 大小 | 範圍(有符號) | 範圍(無符號) | 用途 |
---|---|---|---|---|
TINYINT | 1 字節 | (-128,127) | (0,255) | 小整數值 |
SMALLINT | 2 字節 | (-32 768,32 767) | (0,65 535) | 大整數值 |
MEDIUMINT | 3 字節 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整數值 |
INT或INTEGER | 4 字節 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整數值 |
BIGINT | 8 字節 | (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 極大整數值 |
FLOAT | 4 字節 | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 單精度 浮點數值 |
DOUBLE | 8 字節 | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 雙精度 浮點數值 |
字符串類型
類型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字節 | 定長字符串 |
VARCHAR | 0-65535 字節 | 變長字符串 |
TINYBLOB | 0-255字節 | 不超過 255 個字符的二進制字符串 |
TINYTEXT | 0-255字節 | 短文本字符串 |
BLOB | 0-65 535字節 | 二進制形式的長文本數據 |
TEXT | 0-65 535字節 | 長文本數據 |
MEDIUMBLOB | 0-16 777 215字節 | 二進制形式的中等長度文本數據 |
MEDIUMTEXT | 0-16 777 215字節 | 中等長度文本數據 |
LONGBLOB | 0-4 294 967 295字節 | 二進制形式的極大文本數據 |
LONGTEXT | 0-4 294 967 295字節 | 極大文本數據 |
日和期時間類型
類型 | 大小 | 範圍 | 格式 | 用途 |
---|---|---|---|---|
DATE | 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 | 年份值 |
DATETIME | 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結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和時間值,時間戳 |
建立表:
create table tablename( id int auto_increment primary key, name varchar(32), age int )engine=innodb default charset=utf8;
其中 語法:create table +tablename(列名1 類型 其餘,
列名2 類型 其餘 ) engine = innodb default charset=utf-8
engine 指明數據庫建表引擎爲 innodb (支持事務操做)。
myisam 不支持事務。
default charset=utf-8 指明數據表的編碼字符集 爲 utf-8。
在表中添加數據(三種)
insert into tablename(name,age) values('monkey’,18); insert into tablename(name,age) values('JIAJIA’,18),('xiaoliu’,18); # 能夠跟多條記錄,一元組的形式添加 insert into tablename(name,age) select name,age from tablename2; # 從別的表查找數據 寫入
刪除表中數據不刪除表(三種):
delete from tablename; # 刪除數據,可是自增計數不會被刪除 單純的清掉數據 truncate table tablename; # 清空表,至關於新的表 自增計數 0 delete from tb1 where id > 10 # 跟條件
刪除表:
drop table tablename; # 刪除表
表中插入數據:
insert into t1(id,name) values(100,'monkey’);
修改數據
update tablename set age=1024; update tablename set age=2048 where age=18;
查看數據
select * from tablename; # 查看錶的全部行列 select name,age from tablename; # 查看name和age 列
外鍵
create table tablename1(id int auto_increment primary key , name char(32)); create table tablename2(id int auto_increment primary key , name char(32), friend_id int, constraint fk_t1_t2 foreign key (friend_id) references tablename1(id));
外鍵的建立:定義表的列時預料外鍵字段,以後 constraint fk_t1_t2 foreign key (friend_id) references tablename1(id)); constaint ... foreign key 預留字段名 references 被關聯表名(字段名)
表的補充
desc t; # 查看t 的表結構 show create table t; # 查看建立t的建立語句 show create table t \G; # 橫向查看 alter table t10 AUTO_INCREMENT=10000; # 設置自增的起始值
MySQL的自增問題
自增的起始值:
alter table t10 AUTO_INCREMENT=10000; # 設置自增的起始值
MySQL: 自增步長
基於會話級別:
show session variables like 'auto_inc%'; 查看全局變量 set session auto_increment_increment=2; 設置會話步長 # set session auto_increment_offset=10;
基於全局級別:
show global variables like 'auto_inc%'; 查看全局變量 set global auto_increment_increment=2; 設置會話步長 # set global auto_increment_offset=10;
SqlServer:自增步長:
基於表級別:
CREATE TABLE `table1` ( `id` int(11) NOT NULL AUTO_INCREMENT, ) ENGINE=InnoDB AUTO_INCREMENT=3, 步長=2 DEFAULT CHARSET=utf8 # 自增起始值爲 3 步長爲 2 CREATE TABLE `table2` ( `id` int(11) NOT NULL AUTO_INCREMENT, ) ENGINE=InnoDB AUTO_INCREMENT=9, 步長=3 DEFAULT CHARSET=utf8 # 自增起始值爲 9 步長爲 3
外鍵約束自己就實現了一對多的約束
create table tablename1(id int auto_increment primary key , name char(32)); create table tablename2(id int auto_increment primary key , name char(32), friend_id int, constraint fk_t1_t2 foreign key (friend_id) references tablename1(id));
實現一對一約束 外鍵 加 惟一索引
create table class(id int auto_increment primary key , name char(32)); create table teacher(id int auto_increment primary key , name char(32), class_id int, unique (class_id), constraint fk_class_teacher foreign key (class_id) references class(id));
經過一張關係表和外鍵約束創建多對多的映射關係
create table class(id int auto_increment primary key , name char(32)); create table student(id int auto_increment primary key , name char(32), class_id int); create table student_class_relation(id int auto_increment primary key , student_id int, class_id int, constraint fk_relation_class foreign key (class_id)references class(id), constraint fk_relation_student foreign key (student_id)references student(id));
全部的索引都有一個共有的做用:加速查找
主鍵約束即在表中定義一個主鍵來惟一肯定表中每一行數據的標識符。主鍵能夠是表中的某一列或者多列的組合,其中由多列組合的主鍵稱爲複合主鍵。主鍵應該遵照下面的規則:
主鍵聲明的兩種方式:
一、直接在定義字段的時候聲明爲主鍵,可是這樣只能聲明單一字段爲主鍵沒法聲明 複合主鍵。
create table class(id int auto_increment primary key , name char(32));
二、在字段定義所有結束以後聲明主鍵,這樣既能夠聲明單一的主鍵,也能夠聲明爲 複合主鍵。
create table person(name char(32) not null, part char(32) not null , company char(32) not null , primary key (part,company,name));
聯合主鍵
當創建多對多關係的兩個表,經過關係表來惟一肯定關係的時候,關係表的主鍵稱爲 聯合主鍵。
例如: 多對多示例中的
student_class_relation 表中的 id int auto_increment primary key 字段。
建立表後修改主鍵約束
create table user(id int, name char(32), sex char(4)); # 建立 user表 包含 id name sex 三個字段 沒有主鍵 # 添加主鍵 alter table user add primary key(id); # 將id字段設置爲主鍵 # 修改主鍵 alter table user drop primary key,add primary key(name); # 刪除原主鍵 將name設置爲新的主鍵 # 將主鍵改成 複合主鍵 alter table username drop primary key,add primary key(id,name); # 主鍵改成id 和 name的聯合主鍵
主表和從表:
主表(父表):對於兩個具備關聯關係的表而言,相關聯字段中主鍵所在的表就是主表。
從表(子表):對於兩個具備關聯關係的表而言,相關聯字段中外鍵所在的表就是從表。
外鍵的聲明:
定義時聲明本篇上述 一對多對應關係
建立表後修改外鍵:
alter table <數據表名> add constraint <索引名> foreign key(<列名>) refrences <主表名> (<列名>); alter table user add part_id int; # 爲user表添加 part_id列 做爲外鍵 alter table user add constraint fk_part_user foreign key(part_id) references part(id); # 爲user表添加外鍵約束
聲明惟一約束的兩種方式:
一、在定義字段時聲明,這樣的方式像聲明主鍵同樣,一樣的沒法聲明聯合惟一。
create table unique_table0(name char(32) unique , company char(32);
二、在字段聲明所有結束的時候單獨的聲明惟一索引,這樣能夠聲明成多個字段的惟一索引 即聯合惟一索引。
create table unique_table1(name char(32) , part char(32) , company char(32) , unique (part,company,name));
***建立表後修改惟一約束:*
**
*建立惟一約束:*
create table t1(id int, name char(32)); # way 1: alter table '數據表名' add constraint '索引名' unique(‘要添加的字段名’); alter table t1 add constraint unique_id_name unique(id,name); # way 2: create unique index 索引名 on 數據表名(字段名); create unique index unique_id_name unique(id,name);
*刪除惟一約束*
# way 1: alter table 數據表名 drop index 刪除的索引名; alter table t1 drop index unique_id_name; # way 2: drop index 索引名 on 數據表名; drop index unique_id_name on t1;
索引的詳細介紹戳這裏url:
普通索引(由關鍵字KEY或INDEX定義的索引)的惟一任務是加快對數據的訪問速度。所以,應該只爲那些最常常出如今查詢條件(WHERE column = …)或排序條件(ORDER BY column)中的數據列建立索引。只要有可能,就應該選擇一個數據最整齊、最緊湊的數據列(如一個整數類型的數據列)來建立索引。
索引的通用方法
# 查看索引 show index from table_name; # 其中 Key_name 字段爲索引名 # 刪除索引 drop index index_name on table_name;
普通索引方法
–直接建立索引(length表示使用名稱前1ength個字符) CREATE INDEX index_name ON table_name(column_name(length)) –修改表結構的方式添加索引 ALTER TABLE table_name ADD INDEX index_name ON (column_name) –建立表的時候同時建立索引 CREATE TABLE table_name ( id int(11) NOT NULL AUTO_INCREMENT , title char(255) NOT NULL , PRIMARY KEY (id), INDEX index_name (title) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 創建複合索引 。 CREATE INDEX mytable_categoryid_userid ON mytable (category_id,user_id); 注意命名時的習慣了嗎?使用「表名字段1名字段2名」的方式
惟一索引就是惟一約束,與普通索引相似,除索引列的值必須惟一外跟普通索引無異。建立方法和普通索引相似。也就是說惟一約束的建立方式也能夠由索引的建立方式建立。
惟一索引簡化了MySQL對這個索引的管理工做,這個索引也所以而變得更有效率。
惟一索引是MySQL會在有新記錄插入數據表時,自動檢查新記錄的這個字段的值是否已經在某個記錄的這個字段裏出現過了。
必須爲主鍵字段建立一個索引,這個索引就是所謂的」主索引」。主索引與惟一索引的惟一區別是:前者在定義時使用的關鍵字是PRIMARY而不是UNIQUE。
若是爲某個外鍵字段定義了一個外鍵約束條件,MySQL就會定義一個內部索引來幫助本身以最有效率的方式去管理和使用外鍵約束條件。
MySQL從3.23.23版開始支持全文索引和全文檢索,fulltext索引僅可用於 MyISAM 表;他們能夠從CHAR、VARCHAR或TEXT列中做爲CREATE TABLE語句的一部分被建立,或是隨後使用ALTER TABLE 或CREATE INDEX被添加。////對於較大的數據集,將你的資料輸入一個沒有FULLTEXT索引的表中,而後建立索引,其速度比把資料輸入現有FULLTEXT索引的速度更爲快。不過切記對於大容量的數據表,生成全文索引是一個很是消耗時間很是消耗硬盤空間的作法。
文本字段上的普通索引只能加快對出如今字段內容最前面的字符串(也就是字段內容開頭的字符)進行檢索操做。若是字段裏存放的是由幾個、甚至是多個單詞構成的較大段文字,普通索引就沒什麼做用了。這種檢索每每以LIKE %word%的形式出現,這對MySQL來講很複雜,若是須要處理的數據量很大,響應時間就會很長。
這類場合正是全文索引(full-text index)能夠大顯身手的地方。在生成這種類型的索引時,MySQL將把在文本中出現的全部單詞建立爲一份清單,查詢操做將根據這份清單去檢索有關的數據記錄。全文索引便可以隨數據表一同建立,也能夠等往後有必要時再使用下面這條命令添加:
ALTER TABLE table_name ADD FULLTEXT(column1, column2)
有了全文索引,就能夠用SELECT查詢命令去檢索那些包含着一個或多個給定單詞的數據記錄了。下面是這類查詢命令的基本語法:
SELECT * FROM table_name
WHERE MATCH(column1, column2) AGAINST(‘word1’, ‘word2’, ‘word3’)
上面這條命令將把column1和column2字段裏有word一、word2和word3的數據記錄所有查詢出來。
–建立表的適合添加全文索引 CREATE TABLE table_name ( id int(11) NOT NULL AUTO_INCREMENT , content text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , PRIMARY KEY (id), FULLTEXT (content) ); –修改表結構添加全文索引 ALTER TABLE table_name ADD FULLTEXT index_name(column_name) –直接建立索引 CREATE FULLTEXT INDEX index_name ON table_name (column_name)
多個單列索引與單個多列索引的查詢效果不一樣,由於執行查詢時,MySQL只能使用一個索引,會從多個索引中選擇一個限制最爲嚴格的索引。
平時用的SQL查詢語句通常都有比較多的限制條件,因此爲了進一步榨取MySQL的效率,就要考慮創建組合索引。例如上表中針對title和time創建一個組合索引:ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))。創建這樣的組合索引,實際上是至關於分別創建了下面兩組組合索引:
–title,time
–title
爲何沒有time這樣的組合索引呢?這是由於MySQL組合索引「最左前綴」的結果。簡單的理解就是隻從最左面的開始組合。並非只要包含這兩列的查詢都會用到該組合索引,以下面的幾個SQL所示
–使用到上面的索引
SELECT * FROM article WHREE title=’測試’ AND time=1234567890;
SELECT * FROM article WHREE title=’測試’;
–不使用上面的索引
SELECT * FROM article WHREE time=1234567890;
排序 order by
select * form table_name order by id desc # 從大到小 select * form table_name order by id asc # 從小到大
限制 limit
select * form table_name order by id asc limit 10 # 取查詢結果的前10條 select * form table_name order by id asc limit 20,10 # 取查詢結果從第20條開始 日後查10條 select * form table_name order by id asc limit 10 offset 20 # 取查詢結果從第20條開始 日後查10條
模糊查尋 like
%表示任意長度的字符 _表示單字符
select * from table_name where name like "張%" # 以張開頭的 select * from table_name where name like "%張%" # 包含張的 select * from table_name where name like "%張" # 以張結尾的 select * from table_name where name like "張_" # 以張開頭的 兩個字的 select * from table_name where name like "_浩_%" # 三個字的 而且中間是 浩 的
日期查詢
select * form table_name where date_key between '2019-10-10' and '2019-10-10';
MySQL比較運算符
比較運算符 | 說明 |
---|---|
= | 等於 |
< | 小於 |
<= | 小於等於 |
> | 大於 |
>= | 大於等於 |
<=> | 安全的等於,不會返回 UNKNOWN |
<> 或!= | 不等於 |
IS NULL 或 ISNULL | 判斷一個值是否爲 NULL |
IS NOT NULL | 判斷一個值是否不爲 NULL |
LEAST | 當有兩個或多個參數時,返回最小值 |
GREATEST | 當有兩個或多個參數時,返回最大值 |
BETWEEN AND | 判斷一個值是否落在兩個值之間 |
IN | 判斷一個值是IN列表中的任意一個值 |
NOT IN | 判斷一個值不是IN列表中的任意一個值 |
LIKE | 通配符匹配 |
REGEXP | 正則表達式匹配 |
sum() 求和
avg() 求平均(指望)
max() 最大值
min() 最小值
conut() 計數(求有多少個記錄)
對聚合函數的結果進行二次篩選的時候,條件 應該跟在having後 而不是 where 後面。
建立表:part 並插入數據:
create table part(id int, name char(32));
建立表:person 並插入數據:
create table person(name char(32), part_id int, constraint fk_part_person foreign key(part_id) references part(id));
select part_id,count(part_id) from person group by(part_id);
select * from person,part where part.id = person.part_id; # 有時候性能可能會不以下面 select * from person inner join part on part.id = person.part_id; # 性能可能會更好一些
注意 使用 where 子句定義鏈接條件比較簡單明瞭,而 inner join 語法是 ANSI SQL 的標準規範,使用 inner join 鏈接語法可以確保不會忘記鏈接條件,並且 where 子句在某些時候會影響查詢的性能。
select * from person left join part on part.id = person.part_id; select * from person right join part on part.id = person.part_id;
注意 關於 left 和 right :兩張表 連表查詢,left 就是left 左邊的表呃記錄要所有顯示出來 right 就是 right 右邊的表要所有現實出來
每一個部門有多少我的:
select part.name,count(person.name) from person left join part on part.id = person.part_id group by(part.name);