SQL,英文全稱Structured Query Language,中文意思是結構化查詢語言。它是一種對關係數據庫中的數據進行定義和操做的語言方法,是大多數關係數據庫管理系統所支持的工業標準。mysql
SQL分類:
DDL:數據定義語言,CREATE,ALTER,DROP。管理基礎數據 <--運維熟練
DCL:數據控制語言,GRANT,REVOKE,COMMIT,ROLLBACK,用戶受權,權限回收,數據提交回滾 <--運維要熟悉
DML:數據操做語言,SELECT,INSERT,DELETE,UPDATE,針對數據庫裏的表裏的數據進行操做 <--開發熟練,運維瞭解web
(1)單實例MySQL登陸的方法 mysql #無密碼登陸方式 mysql -u root #指定用戶無密碼登陸 mysql -uroot -p #標準dba命令行登陸 mysql -uroot -p123456 #非腳本通常不這樣使用,密碼明文,容易泄露 (2)多實例防止密碼泄露登陸的方法 設置變量:HISTCONTROL=ignorespace mysql -uroot -p123456 -S /data/3306/mysql.sock (3)遠程連接登陸 mysql -uroot -p -h 192.168.56.11 -P3306 -h 指定ip地址,-P指定端口號
(1)爲root設置比較複雜的密碼 (2)刪除無用的mysql庫內的用戶帳號,只留root@localhost (3)刪除默認的test數據庫 (4)刪除用戶的時候,受權的權限盡可能最小,容許訪問的主機範圍最小化 (4)針對mysql數據庫的用戶處理,還有更嚴格的作法,例如刪除root用戶,添加新的管理員用戶
(1) 語法:create database 庫名; (2)查看建表語句:show create database 庫名; (3)建立指定字符集的數據庫:create database 庫名 default character set 字符 collate 校對方式; (4)查看字符集:show character set; (5)示例:create database test1; show create database test1; create database test3 default character set utf8 collate utf8_general_ci; #建立utf8格式 #若是編譯的時候指定了特定的字符集,則之後建立對應字符集的數據庫就不須要指定字符集 -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \ #提示:二進制軟件包,安裝的數據庫字符集默認latinl
(1)語法:use <dbname> (2)示例:use test1;
(1)語法:select database(); #至關於pwd select user(); #查看當前用戶 select version(); #查看當前版本 select now(); #查看當前時間
(1)語法 drop database <dbname> (2)示例 drop database test1;
(1)語法:drop user "user"@"主機域" (2)要求:能夠是單引號,也能夠是雙引號。可是不能不加。若是主機名中有大寫字母的則 drop 刪除不了,能夠用 delete 語句來刪除 mysql.user 表中的用戶。 delete from mysql.user where user=’root’ and host=’oldboy’; flush privileges; (3)示例: drop user 'root'@'localhost'; drop user 'system'@"localhost"; drop user ''@"localhost";
(1) 查看 GRANT 命令幫助獲取建立用戶並受權的例子: MariaDB [test1]> help grant; CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass'; GRANT ALL ON db1.* TO 'jeffrey'@'localhost'; GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost'; GRANT USAGE ON *.* TO 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90; (2)普通受權方法:先 Create 後 grant a、語法 CREATE USER 'username'@'主機域' IDENTIFIED BY 'mypass'; GRANT ALL ON dbname.* to 'username'@'localhost' b、示例 create user 'user1'@'localhost' identified by '123456'; grant all on test1.* to 'user1'@'localhost'; (3)運維人員經常使用建立用戶方法:使用 grant 命令在建立用戶的同時進行受權
a、語法 GRANT ALL PRIVILEGES ON dbname.* to 'username'@'主機域' identified by 'password'; b、說明 GRANT ALL PRIVILEGES ON dbname.* to 'username'@'主機域' identified by 'password' 受權命令 對應權限 目標:庫和表 用戶名和客戶端主機 用戶密碼 說明:上述命令是受權localhost主機上經過用戶username管理dbname數據庫的全部權限,密碼爲passwd,其中username,dbname,passwd可根據業務的狀況修改 對於web鏈接用戶受權儘可能採用最小化原則,不少開源軟件都是web界面安裝,所以在安裝期間除了select,insert,update,delete 4個權限外,還須要create,drop等比較危險的權限。 grant select,insert,update,create,drop on blog.* to blog@localhost identified by ‘123’ 常規狀況下受權select,insert,update,delete 4個權限便可,有的源軟件,例如discuz,bbs還須要create,drop等比較危險的權限。生成數據庫表後,要收回create,drop受權 (4)遠程主機受權鏈接數據庫 grant 命令的語法中主機域部分爲受權訪問數據庫的客戶端主機,能夠用域名、 IP 或 IP 段來表示。遠程主機 的受權方法有 2 種,具體以下: a、方法一:百分號匹配法 grant all on *.* to test@'192.168.0.%' identified by '123456'; flush privileges; b、方法二:子網掩碼匹配法 grant all on *.* to test@'192.168.1.0/24' identified by '123456'; grant all on *.* to test@'192.168.1.0/255.255.255.0' identified by '123456'; flush privileges; #若是是web鏈接數據庫,儘可能不要受權all,而是select,insert,update,delete (5)查看權限 MariaDB [test1]> grant all on test1.* to test@'192.168.56.0/24' identified by '123456'; Query OK, 0 rows affected (0.00 sec) MariaDB [test1]> show grants for test@'192.168.56.0/24'; +-------------------------------------------------------------------------------------------------------------------+ | Grants for test@192.168.56.0/24 | +-------------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'test'@'192.168.56.0/24' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' | | GRANT ALL PRIVILEGES ON `test1`.* TO 'test'@'192.168.56.0/24' | +-------------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec) 查看權限能夠看出受權是分爲 2 步: 第一步是受權可登錄 GRANT USAGE ON *.*。 USAGE 表示只有登錄權限。 第二步是受權可訪問 ON `test1`.* TO 'test'@'192.168.56.0/24' (6)權限回收 MariaDB [test1]> revoke insert on test1.* from test@'192.168.56.0/24'; Query OK, 0 rows affected (0.01 sec) MariaDB [test1]> show grants for test@'192.168.56.0/24'; +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Grants for test@192.168.56.0/24 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'test'@'192.168.56.0/24' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' | | GRANT SELECT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `test1`.* TO 'test'@'192.168.56.0/24' | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec) #MySQL 權限列表以下 SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY, TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER MySQL包含關係 :數據庫服務器>數據庫(多個實例)>多個庫>多個表>多個字段行列(數據)
(1)語法:create table <表名>( <字段名1><類型n>); 提示:其中create table是關鍵字,不能更改,可是大小寫能夠變化 (2)下面是人工寫法設計的建表語句例子,表名student create table student( id int(4) not null, name char(20) not null, age tinyint(2) NOT NULL default '0', dept varchar(16) default NULL ); (3)查看建立表的語句 mysql> show create table student; create table student( #create table表示建立表的固定關鍵字,student爲表名 id int(4) not null, #學號列,數字類型,長度爲4,不能爲空值 name char(20) not null, #名字列,定長字符類型,長度20,不能爲空 age tinyint(2) NOT NULL default '0', #年齡列,很小的數字類型,長度爲2,不能爲空,默認爲0值 dept varchar(16) default NULL #性別列,變長字符類型,長度16,默認爲空。 ENGINE=lnnoDB DEFAULT CHARSET=latinl #引擎和字符集,引擎默認爲InnoDB,字符集,繼承庫的latinl ); #須要注意的事:MySQL5.1和MySQL5.5 環境的默認建表語句中的引擎的不一樣,若是但願控制引擎,就要在建表語句裏顯示的指定引擎建表;MySQL5.1以及默認引擎爲MyISAM,MySQL5.5,之後默認引擎爲InnoDB。
某sns產品生產正式建表語句
use sns; set names gbk; CREATE TABLE `subject_comment_manager` ( `subject_comment_manager_id` bigint(12) NOT NULL auto_increment COMMENT '主鍵', `subject_type` tinyint(2) NOT NULL COMMENT '素材類型', `subject_primary_key` varchar(255) NOT NULL COMMENT '素材的主鍵', `subject_title` varchar(255) NOT NULL COMMENT '素材的名稱', `edit_user_nick` varchar(64) default NULL COMMENT '修改人', `edit_user_time` timestamp NULL default NULL COMMENT '修改時間', `edit_comment` varchar(255) default NULL COMMENT '修改的理由', `state` tinyint(1) NOT NULL default '1' COMMENT '0表明關閉,1表明正常', PRIMARY KEY (`subject_comment_manager_id`), KEY `IDX_PRIMARYKEY` (`subject_primary_key`(32)), #<==括號內的32表示對前32個字符作前綴索引。 KEY `IDX_SUBJECT_TITLE` (`subject_title`(32)) KEY `index_nick_type` (`edit_user_nick`(32),`subject_type`)#<==聯合索引,此行爲新加的,用於給你們講解的。實際表語句內沒有此行。 ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
索引就象書的目錄同樣,若是在字段上創建了索引,那麼以索引爲查詢條件時能夠加快查詢數據的速度. 建立主鍵索引 查詢數據庫,按主鍵查詢是最快的,每一個表只有一個主鍵列,可是能夠用多個普通索引列。主鍵列要求列的全部內容必須惟一,而普通索引不要求內容必須惟一 主鍵就相似咱們在學校學習時的學號同樣,班級內是惟一的,整個表的每一條記錄的主鍵值在表內都是惟一的,用來惟一標識一條記錄。 (1)創建主鍵索引的方法: drop table student; create table student( id int(4) not null AUTO_INCREMENT, name char(20) not null, age tinyint(2) NOT NULL default '0', dept varchar(16) default NULL, primary key(id), KEY index_name(name) ); #提示: # primary key(id)<==主鍵 # KEY index_name(name)<==name字段普通索引 (2)mysql> desc student; 查看剛剛建立的表結構。 +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(4) | NO | PRI | NULL | auto_increment | | name | char(20) | NO | MUL | NULL | | | age | tinyint(2) | NO || 0 | | | dept | varchar(16) | YES | | NULL| | +-------+-------------+------+-----+---------+----------------+ #PRL爲主鍵的標示,MUL爲普通索引的表示 ,auto_increnment 表明數據自增 (3)利用alter命令修改id列爲自增主鍵值 alter table student change id id int primary key auto_increment; 建立的表的時候,能夠指定 mysql> create table student( id int(4) not null AUTO_INCREMENT, name char(20) not null, age tinyint(2) NOT NULL default '0', dept varchar(16) default NULL, primary key(id), KEY index_name(name) ); 提示: KEY index_name(name) <==name字段普通索引 優化:在惟一值多的列上建索引查詢效率高 還能夠自定義自增的長度 EBGUBE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; (4)查看索引【前提都須要進入庫】 show index from student; 查看索引\G 能夠查看的更詳細:show index from student\G
(1)語法:desc 表名 (2)示例:desc student;
(1)語法:alter table 表名 add|drop index 索引名稱 alter table student add index index_name; alter table student drop index index_name;
(2)示例: create index index_name on student(name); #建立索引 show index from student; #查看索引 create index index_age on student(name(8)); #建立指定n個字符索引 show index from student\G #查看索引
若是查詢數據的條件是多列時,咱們能夠爲多個查詢的列建立聯合索引,甚至,能夠爲多個列的前n個字符建立聯合索引,演示以下:
建立聯合索引,和單個索引不衝突sql
create index ind_name_dept on student(name,dept); #在student表建立聯合索引 聯合索引做用,查詢更快 show index from student\G 建立聯合索引,並指定值大小: create index ind_name_dept on student(name(8),dept(10)); #name 前8個字符,dept 前10個字符 #提示:儘可能在惟一值多的大表上創建索引。
何時建立聯合索引?數據庫
只有程序用這兩個條件查詢,採用聯合索引,這個主要是看開發。
提示:按條件列查詢數據時,聯合索引是由前綴生效特性的緩存
create unique index uni_ind_name on student(name);
建立主鍵索引: alter table student chage id id int primary key auto_increment;
刪除主鍵索引(主鍵列不能自增): alter table student drop primary key;
添加普通索引: alter table student add index index_dept(dept);
根據的前n個字符建立索引: create index index_dept on student(dept(8));
根據多個列建立聯合索引: create index index_name_dept on student(name,dept);
建立惟一索引: create unique index uni_ind_name on student(name);
刪除普通索引與惟一索引: alter table student drop index index_dept; drop index index_dept on student;
Q1:既然索引能夠加快查詢速度,那麼就給全部的列加索引吧? A1:由於索引不但佔用系統空間,並且更新數據時還須要維護索引數據的,所以索引是一把雙刃劍,並非越多越好,例如:數十到幾百行的小表上無需創建索引,插入更新頻繁,讀取比較少的須要少創建索引. Q2:須要在哪些列上建立索引才能加快查詢速度呢? select user,host from mysql.user where password=…..,索引必定要建立在where後的條件列上,而不是select後的選擇數據的列上。另外,咱們要儘可能選擇在惟一值多的大表上的列創建索引,例如,男女生性別列惟一值少,不適合創建索引。
select count(distinct user) from mysql.user; 惟一值就是相同的數量,例如查詢user那麼相同的user就是惟一值
■ 索引相似書籍的目錄,會加快查詢數據的速度 ■ 要在表的列(字段)上建立索引 ■ 索引會加快查詢速度,可是也會影響更新的速度,由於更新要在維護索引數據 ■ 索引列並非越多越好,要在頻繁查詢的表語句where後的條件列上建立索引 ■ 小表或重複值不少的列上能夠不建索引,要在大表以及重複值少的條件上建立索引 ■ 多個列聯合索引有前綴生效特性 ■ 當字段內容前N個字符已經接近惟一時,能夠對字段的前N個字符建立索引 ■ 索引從工做方式區別,有主鍵,惟一,普通索引 ■ 索引類型有BTREE(默認)和hash(適合作緩存(內存數據庫))等。
(1)對於主鍵/unique constraint oracle/sql server/mysql等都會自動創建惟一索引; (2)主鍵不必定只包含一個字段,因此若是你在主鍵的其中一個字段建惟一索引仍是必要的; (3)主健可做外健,惟一索引不可; (4)主健不可爲空,惟一索引可; (5)主健也但是多個字段的組合; (6)主鍵與惟一索引不一樣的是: a.有not null屬性; b.每一個表只能有一個。
(1)命令語法:insert into <表名>[(<字段名1>[..<字段名n>])]values(值1)[,(值n)] (2)創建測試表: CREATE TABLE `test1` ( `id` int(4) NOT NULL, `name` char(16) NOT NULL, `age` int(2) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 (3)插入值 insert into test1(id,name,age) values(1,'gaoyuliang',60); insert into test1 values(2,"xiaoqiang",12); (4)查詢 select * from test1; +----+------------+------+ | id | name | age | +----+------------+------+ | 1 | gaoyuliang | 60 | | 2 | xiaoqiang | 12 | +----+------------+------+ (5)批量插入 insert into test1 values(3,'xiaohong',20),(4,'xiaogang',23); MariaDB [oldboy]> select * from test1; +----+------------+------+ | id | name | age | +----+------------+------+ | 1 | gaoyuliang | 60 | | 2 | xiaoqiang | 12 | | 3 | xiaohong | 20 | | 4 | xiaogang | 23 | +----+------------+------+ (6)清空表中全部值 MariaDB [oldboy]> truncate table test1; Query OK, 0 rows affected (0.00 sec) MariaDB [oldboy]> select * from test1; Empty set (0.00 sec) (7)一條命令建立 MariaDB [oldboy]> insert into test1 values (1,'oldboy',40),(2,'oldgirl',60),(3,'inca',20),(4,'zuma',30),(5,'kaka',33); Query OK, 5 rows affected (0.00 sec) Records: 5 Duplicates: 0 Warnings: 0 MariaDB [oldboy]> select * from test1; +----+---------+------+ | id | name | age | +----+---------+------+ | 1 | oldboy | 40 | | 2 | oldgirl | 60 | | 3 | inca | 20 | | 4 | zuma | 30 | | 5 | kaka | 33 | +----+---------+------+ 5 rows in set (0.00 sec)
(1)語法:select <字段1,字段2,…> from <表名> where <表達式> #其中,select,from,where是不能隨便改的,是關鍵字,支持大小寫 (2)不進入庫查詢 MariaDB [(none)]> select * from oldboy.test1 where name="oldboy"; +----+--------+------+ | id | name | age | +----+--------+------+ | 1 | oldboy | 40 | +----+--------+------+ 1 row in set (0.01 sec) (3)只查詢前2行 MariaDB [oldboy]> select * from test1 limit 2; +----+---------+------+ | id | name | age | +----+---------+------+ | 1 | oldboy | 40 | | 2 | oldgirl | 60 | +----+---------+------+ 2 rows in set (0.00 sec) (4)從第二條開始查,查找2個 MariaDB [oldboy]> select * from test1 limit 1,2; +----+---------+------+ | id | name | age | +----+---------+------+ | 2 | oldgirl | 60 | | 3 | inca | 20 | +----+---------+------+ 2 rows in set (0.00 sec) (5)按照條件查詢 MariaDB [(none)]> select * from oldboy.test1 where name="oldboy"; +----+--------+------+ | id | name | age | +----+--------+------+ | 1 | oldboy | 40 | +----+--------+------+ #提示:查找字符串類型的條件的值要帶單引號,數字值不帶引號。 (6)查詢多個條件 MariaDB [oldboy]> select * from test1 where name='oldgirl' and id=2; +----+---------+------+ | id | name | age | +----+---------+------+ | 2 | oldgirl | 60 | +----+---------+------+ 1 row in set (0.00 sec) (7)範圍查詢 MariaDB [oldboy]> select * from test1 where id>2; +----+------+------+ | id | name | age | +----+------+------+ | 3 | inca | 20 | | 4 | zuma | 30 | | 5 | kaka | 33 | +----+------+------+ 3 rows in set (0.00 sec) (8)示例: 建立學生表 drop table student; create table student( Sno int(10) NOT NULL COMMENT '學號', Sname varchar(16) NOT NULL COMMENT '姓名', Ssex char(2) NOT NULL COMMENT '性別', Sage tinyint(2) NOT NULL default '0' COMMENT '學生年齡', Sdept varchar(16) default NULL COMMENT '學生所在系別', PRIMARY KEY (Sno) , key index_Sname (Sname) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; 插入內容 create table course( Cno int(10) NOT NULL COMMENT '課程號', Cname varchar(64) NOT NULL COMMENT '課程名', Ccredit tinyint(2) NOT NULL COMMENT '學分', PRIMARY KEY (Cno) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; 插入內容 CREATE TABLE `SC` ( SCid int(12) NOT NULL auto_increment COMMENT '主鍵', `Cno` int(10) NOT NULL COMMENT '課程號', `Sno` int(10) NOT NULL COMMENT '學號', `Grade` tinyint(2) NOT NULL COMMENT '學生成績', PRIMARY KEY (`SCid`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 插入內容 INSERT INTO course values(1001,'Linux中高級運維',3); INSERT INTO course values(1002,'Linux高級架構師',5); INSERT INTO course values(1003,'MySQL高級Dba',4); INSERT INTO course values(1004,'Python運維開發',4); INSERT INTO course values(1005,'Java web開發',3); 插入內容 INSERT INTO SC(Sno,Cno,Grade) values(0001,1001,4); INSERT INTO SC(Sno,Cno,Grade) values(0001,1002,3); INSERT INTO SC(Sno,Cno,Grade) values(0001,1003,1); INSERT INTO SC(Sno,Cno,Grade) values(0001,1004,6); INSERT INTO SC(Sno,Cno,Grade) values(0002,1001,3); INSERT INTO SC(Sno,Cno,Grade) values(0002,1002,2); INSERT INTO SC(Sno,Cno,Grade) values(0002,1003,2); INSERT INTO SC(Sno,Cno,Grade) values(0002,1004,8); INSERT INTO SC(Sno,Cno,Grade) values(0003,1001,4); INSERT INTO SC(Sno,Cno,Grade) values(0003,1002,4); INSERT INTO SC(Sno,Cno,Grade) values(0003,1003,2); INSERT INTO SC(Sno,Cno,Grade) values(0003,1004,8); INSERT INTO SC(Sno,Cno,Grade) values(0004,1001,1); INSERT INTO SC(Sno,Cno,Grade) values(0004,1002,1); INSERT INTO SC(Sno,Cno,Grade) values(0004,1003,2); INSERT INTO SC(Sno,Cno,Grade) values(0004,1004,3); INSERT INTO SC(Sno,Cno,Grade) values(0005,1001,5); INSERT INTO SC(Sno,Cno,Grade) values(0005,1002,3); INSERT INTO SC(Sno,Cno,Grade) values(0005,1003,2); INSERT INTO SC(Sno,Cno,Grade) values(0005,1004,9); 檢查,查看錶格式或者表內容 MariaDB [oldboy]> desc SC; or select * from SC; +-------+------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+----------------+ | SCid | int(12) | NO | PRI | NULL | auto_increment | | Cno | int(10) | NO | | NULL | | | Sno | int(10) | NO | | NULL | | | Grade | tinyint(2) | NO | | NULL | | +-------+------------+------+-----+---------+----------------+