mysql客戶端可用選項: -A, --no-auto-rehash 禁止補全 -u, --user= 用戶名,預設為root -h, --host= 伺服器主機,預設為localhost -p, --passowrd= 用戶密碼,建議使用-p,預設為空密碼 -P, --port= 伺服器埠 -S ...
mysql客戶端可用選項:
-A, --no-auto-rehash 禁止補全
-u, --user= 用戶名,預設為root
-h, --host= 伺服器主機,預設為localhost
-p, --passowrd= 用戶密碼,建議使用-p,預設為空密碼
-P, --port= 伺服器埠
-S, --socket= 指定連接socket文件路徑
-D, --database= 指定預設資料庫
-C, --compress 啟用壓縮
-e “SQL“ 執行SQL命令
-V, --version 顯示版本
-v --verbose 顯示詳細信息
--print-defaults 獲取程式預設使用的配置
安全模式:
mysql -uroot -pcentos -U 安全模式進入,避免批量操作,沒有where條件會報錯
可以將-U選項寫入alisa 或者腳本里或者寫入/etc/my.cnf.d/client.cnf
vim /etc/my.cnf.d/client.cnf
[client]
safe_updates
創建遠程用戶
create user wang@'192.168.1.%' identified by 'centos'; 創建用戶wang只能從192.168.1網段登陸,密碼為centos,也可以指定只能某IP地址登陸
用戶遠程連接
mysql -uwnag -h'192.168.1.100' -pcentos -P3306; 連接IP地址為192.168.1.100埠為3306的資料庫
刪除用戶:
delete from mysql.user where user='wang';
在/etc/my.cnf.d/client.cnf 里添加賬戶和密碼,將這組賬號密碼設置為預設登陸設置,登陸時可省去密碼和賬戶,預設以這組賬號密碼登陸
mysql --print-defaults; 可以查看預設賬號密碼
update user set password=password('centos') where user='root';修改密碼,password('centos')加密centos,在資料庫中不明文顯示
在每次修改過資料庫許可權以後,都要刷新以啟用新許可權
授權:
grant select,delete on
grant all on *.* to wang@'192.168.1.%' identitied by 'centos'; 授權wang可以在這個網段登陸,擁有所有資料庫和表的所有許可權
show grants for wang@'192.168.1.%'; 查看wanng的授權
revoke delete on *.* from 'wang'@'192.168.1.%; 刪除wang在所有庫和表的delete許可權
在每次修改過資料庫許可權以後,刷新以確認新許可權啟用
支持通配符:
% 匹配任意長度的任意字元
_ 匹配任意單個字元
SQL語言規範
在資料庫系統中,SQL語句不區分大小寫(建議用大寫) 庫名錶名對大小寫敏感
但字元串常量區分大小寫
SQL語句可單行或多行書寫,以“;”結尾
關鍵詞不能跨多行或簡寫
用空格和縮進來提高語句的可讀性
子句通常位於獨立行,便於編輯,提高可讀性
註釋:
SQL標準:
/*註釋內容*/ 多行註釋
-- 註釋內容 單行註釋,註意有空格
MySQL註釋:
#
select * mysql.user\G ; 豎列顯示
create database [if not exists] 'db_name'; 創建資料庫[如果不存在就創建]
drop database [if exists] 'db_name'; 刪除資料庫[如果存在就刪除]
CHARACTER SET 'character set name'; 創建資料庫時設定字元集
show variables like '%character_set%'; 查看預設字元集
SHOW COLLATION 查看排序規則
create table [if not exists] 'table_name' (col1 type1 修飾符,col2 type2 修飾符,...)
show table status from mysql\G; 顯示mysql資料庫裡面所有的表結構,豎列顯示
show table status like 'table'\G; 查看表信息
show engines; 查看資料庫支持的引擎
mysql -uroot -pcentos -S /mysqldb/3306/socket/mysql.sock -e 'show databases;' 不進入資料庫執行命令
desc tlb_name;查看表格式
select name as 姓名 from statudent; 使用as取別名,支持中文
將資料庫里的表文件獨立放置
vim /mysqldb/3306/etc/my.cnf
在[mysqld]下添加 innodb_file_per_table
導入資料庫文件,每個表將獨立存放
數據類型:
1、整型
tinyint(m) 1個位元組 範圍(-128~127)
smallint(m) 2個位元組 範圍(-32768~32767)
mediumint(m) 3個位元組 範圍(-8388608~8388607)
int(m) 4個位元組 範圍(-2147483648~2147483647)
bigint(m) 8個位元組 範圍(+-9.22*10的18次方)
取值範圍如果加了unsigned,則最大值翻倍,如tinyint unsigned的取值範圍為(0~255)
int(m)里的m是表示SELECT查詢結果集中的顯示寬度,並不影響實際的取值範圍,規定了MySQL的一些交互工具(例如MySQL命令行客戶端)用來顯示字元的個數。對於存儲和計算來說,Int(1)和Int(20)是相同的
BOOL,BOOLEAN:布爾型,是TINYINT(1)的同義詞。zero值被視為假。非zero值視為真
2、浮點型(float和double),近似值
float(m,d) 單精度浮點型 8位精度(4位元組) m總個數,d小數位
double(m,d) 雙精度浮點型16位精度(8位元組) m總個數,d小數位
設一個欄位定義為float(6,3),如果插入一個數123.45678,實際資料庫里存的是123.457,但總個數還以實際為準,即6位
3、定點數
在資料庫中存放的是精確值,存為十進位
decimal(m,d) 參數m<65 是總個數,d<30且 d<m 是小數位
MySQL5.0和更高版本將數字打包保存到一個二進位字元串中(每4個位元組存9個數字)。例如,decimal(18,9)小數點兩邊將各存儲9個數字,一共使用9個位元組:小數點前的數字用4個位元組小數點後的數字用4個位元組,小數點本身占1個位元組,
浮點類型在存儲同樣範圍的值時,通常比decimal使用更少的空間。float使用4個位元組存儲。double占用8個位元組
因為需要額外的空間和計算開銷,所以應該儘量只在對小數進行精確計算時才使用decimal——例如存儲財務數據。但在數據量比較大的時候,可以考慮使用bigint代替decimal
4、字元串(char,varchar,_text)
char(n) 固定長度,最多255個字元
varchar(n)可變長度,最多65535個字元
tinytext可變長度,最多255個字元
text 可變長度,最多65535個字元
mediumtext 可變長度,最多2的24次方-1個字元
longtext可變長度,最多2的32次方-1個字元
BINARY(M) 固定長度,可存二進位或字元,長度為0-M位元組
VARBINARY(M) 可變長度,可存二進位或字元,允許長度為0-M位元組
內建類型:ENUM枚舉, SET集合
ENUM枚舉:單選其中一項
SET集合:多選,可以隨意選幾項
修飾符:
所有類型:
NULL 數據列可包含NULL值
NOT NULL 數據列不允許包含NULL值
DEFAULT 預設值
PRIMARY KEY 主鍵
UNIQUE KEY 唯一鍵
CHARACTER SET name 指定一個字元集
數值型:
AUTO_INCREMENT 自動遞增,適用於整數類型
UNSIGNED 無符號
示例:
CREATE TABLE students (id int UNSIGNED NOT NULL PRIMARY KEY,name VARCHAR(20)NOT NULL,age tinyint UNSIGNED);
DESC students;
CREATE TABLE students2 (id int UNSIGNED NOT NULL ,name VARCHAR(20) NOT NULL,age tinyint UNSIGNED,PRIMARY KEY(id,name));
表操作:
desc 'tbl_name'; 查看表格式
DROP TABLE [IF EXISTS] 'tbl_name'; 刪除表
ALTER TABLE 'tbl_name' 修改表
欄位:
添加欄位:add
ADD col1 data_type [FIRST|AFTER col_name]
刪除欄位:drop
修改欄位:
alter(預設值), change(欄位名), modify(欄位屬性)
索引:
添加索引:add index
刪除索引: drop index
create index index_name on students(name); 在students表的name欄位上添加索引,名為index_name
drop index index_name on students; 在students表上刪除索引名為index_name
truncate table students; 刪表,速度最快的方式
create table newstudents select * from students; 根據舊表創建新表,但是會丟失主鍵和一些信息,原理是根據查詢結果創建新表
create database students; 創建資料庫,
use students; 切換資料庫
create table class1 (id int primary key,name char(20) not null , sex enum('m','f') default 'm'); 創建表
desc class1; 查看表信息
insert class1 (id,name) values (1,'mage'); 添加表記錄
insert class1(id,name) values (2,'zhaohuan') ,(3,'liuhuan');
insert class1(id,name,sex) values (4,'lili','m') ,(5,'zhanghuan','m');
update class1 set sex='f' where id=4; 修改id=4的sex記錄
delete from class1 where id=1; 刪除id=1的記錄
select * from students order by age; 預設asc 正序,desc倒序
select * from students order by age asc;
排序中NULL值預設優先最高,會排在最前面,在查詢值前加-即可處理為最低優先順序,
如:select * from students order by -age asc;
select * from class1 order by age limit 5; 最多顯示5行
select * from class1 order by age limit 3,5; 跳過前三個,再顯示4個
select id,name 姓名 from class1 where id between 10 and 20;顯示表裡id在10和20之間的id,name兩項,name使用了別名,省略了as
select id,name 姓名 from class1 where id >=10 and id <=20; 意義同上
select id,name 姓名 from class1 where name like 'x%'; 模糊匹配需要通配符_%配合
WHERE子句:指明過濾條件以實現“選擇”的功能:
過濾條件:布爾型表達式
算術操作符:+, -, *, /, %
比較操作符:=, !=, <>, <=>, >, >=, <, <=
BETWEEN min_num AND max_num
IN (element1, element2, ...)
IS NULL
select * from students where classid is null
IS NOT NULL
select * from students where classid is not null
LIKE:
%: 任意長度的任意字元
_:任意單個字元
RLIKE:正則表達式,索引失效,不建議使用
REGEXP:匹配字元串可用正則表達式書寫模式,同上
邏輯操作符: NOT,AND,OR,XOR
函數計算:
select sum(score) from scores where stuid=1; 計算學號為1的同學的總分數
select courseid,avg(score) from scores group by courseid;計算每個科目的平均成績
select courseid,abg(score) from scores group by courseid having crouseid=1;查看科目1的平均成績
group by .... having .... 語法固定
select courseid,abg(score) from scores group by courseid having crouseid in (1,3)查看科目1和3的平均成績
內連接:
select st.name,sc.score from students as st,scores as sc where st.stuid=sc.stuid;
select st.name,sc.score from students as st inner join scores as sc on st.stuid=sc.stuid; 其他寫法用了inner不能用where
select st.name,sc.score from students as st join scores as sc on st.stuid=sc.stuid; inner可以省略
select st.name,sc.score from students as st,scores as sc where st.stuid=sc.stuid and sc.score> 90;大於90分以上的學生
外連接:
select st.name,sc.score from students as st right outer join scores as sc on st.stuid=sc.stuid; 右外連接,顯示右邊表所有內容
select st.name,sc.score from students as st left outer join scores as sc on st.stuid=sc.stuid; 左外連接,顯示左邊表所有內容
自連接:
select e2.name,e1.name as 上司 from emp as e1 inner join emp as e2 on e1.id=e2.leaderid;
union:將兩個不同結構的表合併輸出顯示,搜索的項必須是相同的
select t.tid,t.name from teachers as t union select s.stuid,s.name from students as s;
cross join: 由兩個表生成第三個表,並添加了空白的評分列
select c.course,t.name," " as 評分 from teachers as t cross join courses as c;
子查詢:查詢顯示比id=9的同學年紀更大的同學
select * from students where age > (select age from students where stuid=9);