datebase管理 1.創建資料庫-create 語法:create database 資料庫名 character set 編碼 # 註意:預設會存在四個資料庫,其資料庫中存儲的是mysql資料庫伺服器的配置的數據 示例:create database firstDB character set ...
datebase管理
1.創建資料庫-create
語法:create database 資料庫名 character set 編碼
# 註意:預設會存在四個資料庫,其資料庫中存儲的是mysql資料庫伺服器的配置的數據
示例:create database firstDB character set utf8;
2.查看所有資料庫-show
2.1.查看創建語句(也可看編碼)
語法:show create database 資料庫名;
2.2、查看資料庫伺服器中的所有資料庫
語法:show databases;
3.修改資料庫-alter
修改編碼:
語法:alter database 資料庫名稱 character set 編碼;
例如:alter database mydb_01 character set gbk;
查看:show create database mydb_01;
4.使用資料庫-use
語法:use 資料庫名稱;
例如:use mydb_01;
5.查看當前使用的資料庫
語法:select database();
例如:select database();
6.刪除資料庫-drop
語法:drop dastabase 資料庫名稱;
例如:drop database mydb_01;
table管理
1.創建資料庫表
語法
create table 表名稱(
欄位名稱 數據類型[約束],
欄位名稱 數據類型[約束],
...
);
示例:
create table user( id int, name varchar(15), age int );
資料庫類型
常用的類型: int:整數型 varchar:可變字元串 double:浮點型,例如(double(5,2),長度為5,其中必須包含兩位小數) date:日期(只有年月日) timestamp:時間戳(年月日,時分秒都有) java和mysql類型對比 mysql類型 java的類型 int java.lang.Integer double java.lang.Double char java.lang.String varchar java.lang.String text java.lang.String blob java.lang.byte[] date java.sql.Date time java.sql.Time timestamp java.sql.TimeStamp
約束
定義: 約束就是對欄位的某種性質的一種約束 類型: 主鍵約束:primary key 外鍵約束:(下節課學) 非空約束:not null 唯一性約束:unique 預設值約束:default 預設值(指的是沒有插入此欄位時有預設值,當插入此欄位時,即使值是null他也不會有預設值,即值為null) 主鍵約束: 主鍵是每一條記錄的唯一性標識,一般沒有實際意義,特點:非空 唯一 語法:欄位名稱 欄位類型 primary key 註意:如果主鍵是int型 我們可以將其定義成 auto_increment(自增長) 示例:id int primary key auto_increment 例如: create table user( id int primary key auto_increment, username varchar(20) not null, password varchar(20) not null, gender varchar(20), age int default 25, email varchar(50) not null unique, salary double(8,2), state int default 0, role varchar(10) default 'VIP', registTime timestamp );
2.查看表
2.1.查看當前資料庫中的所有表
語法:show tables;
2.2.查看指定表的創建語句
語法:show create table 表名稱;
2.3.查看表結構
語法:desc 表名稱;
3.刪除表
語法:drop table 表名稱;
4.修改表
4.1.修改表名稱
語法:rename table 舊名稱 to 新名稱;
例如:rename table user to newuser;
4.2.修改表的編碼
語法:alter table 表名稱 character set 編碼;
例如:
alter table newuser character set gbk;
ALTER TABLE hq_message CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
5.新增欄位
語法:alter table 表名稱 add 欄位名稱 數據類型 [約束];
例如:alter table newuser add idcart varchar(18) unique;
6.刪除欄位
語法:alter table 表名稱 drop 欄位名;
例如:alter table newuser drop idcart;
7.修改欄位名稱
語法:alter table 表名稱 change 舊名稱 新名稱 數據類型
例如:alter table newuser change gender sex varchar(2);
8.修改數據類型
語法:alter table 表名稱 modify 欄位名稱 新的數據類型; 例如:alter table newuser modify sex int;
數據操作
註意
select @@tx_isolation;--查看mysql的事物隔離級別 show variables like 'character%';--查看mysql資料庫的當前編碼 set character_set_client = gbk;--設置客戶端編碼 set character_set_results = gbk;--設置結果集的編碼
1.插入數據
語法:insert into 表名(欄位名1,欄位名2,...欄位名n) valuse(值1,值2,...值n); 註意: (1):如果主鍵是auto_increment的,那麼,主鍵列的值可以寫成null或者主鍵欄位和主鍵值省略不寫 (2):如果插入的數據是全數據的話,那麼欄位名稱可以省略 例如: insert into newuser(id,username,password,sex,age,email,salary,state,role,registtime) values(1,'zhangsan','123',1,25,'[email protected]',100,0,'teacher','2015-10-10 12:35:50');
2.修改數據
語句:update 表名稱 set 欄位名稱1=值1,欄位名稱2=值2,....欄位名稱n=值n[where條件語句]; 註意:如果不寫where條件子句的話 會把表中的所有相應欄位的數據全部修改 例如:update newuser set password=111 where id=1;
3.刪除數據
語法:delete from 表名 where條件句;
註意:如果不寫where條件句的話 那麼會把表中的數據全部刪掉
delete from newuser和drop table user的區別?
前者是刪除數據,但是表的結構還在
後者是把整個表全部刪掉
truncate table newuser;和delete from newuser;區別?
前者一次性將表摧毀,然後在新建表結構
後者是一條一條的將數據刪除
4.查詢數據
4.1.全部查詢
語法:select * from 表名;
4.2.查詢部分數據
語法:select 欄位名稱1,欄位名稱2... from 表名稱;
4.3.去重查詢
語法:select distinct 欄位名稱 from 表名;
4.4.聚合函數
註意:聚合函數儘量不要和其他欄位混合使用
4.41.計數函數
名稱:count():統計當前表中有多少條數據 用法:select count(* 或 者欄位名) from 表名; 註意:當使用欄位進行統計時,如果該列中有null值,則不算一條記錄
4.4.2.求和函數
名稱:sum()
用法:select sum(salary) from 表名;
註意:如果要求和的欄位中有null則把null當作0進行求和
4.4.3.最大值函數
名稱:max()
用法:select max(salary) from user;
註意:null不作為數值比較
4.4.4.最小值函數
名稱:min()
用法:select min(salary) from user;
註意:null不作為數值比較
4.4.5.平均值
名稱:avg()
用法:select avg(salary) from user;
註意:如果欄位中有null值,在相加時當作了0或者根本就沒有算數,在相除的時候沒有算此條記錄
4.5.運算查詢
語法:select username,salary+1000 from user; 註意:可進行數學運算 null在進行運算的時候還是null
ifnull函數
作用:判斷是否為null
語法:select username,ifnull(salary,0)+1000 from user;
as函數
作用:給欄位起別名
語法:欄位名 as 別名
註意:as可以省略不寫
4.6.排序查詢
語法:order by 欄位名;
註意:
預設升序(asc):order by 欄位名 asc;
降序(desc):order by 欄位名 desc;
例如:select * from user order by salary;
4.7.條件查詢
4.7.1.單一條件查詢
語法:select * from 表名 where 欄位名稱='欄位值'; 註意:可以使用的運算符:> < >= <= != 例如:select * from user where username='zhangsan';
4.7.2.多條件查詢
語法:select * from 表名 where 欄位名1='欄位值' and 欄位名2='欄位值'......; 註意:邏輯連接關鍵字可以使用and、or、not;優先順序:and > or 例如: select * from user where role='技術部' and sex='女'; select * from user where role='teacher' or role='財務部';
4.7.3.範圍查詢
語法:select * from 表名 where 要查詢的欄位 between ... and ... 註意:即包左又包右
4.7.4.枚舉查詢
語法:in(枚舉欄位);---滿足枚舉欄位的就會被查出來
語法:not in(枚舉欄位);排除滿足枚舉欄位的所有欄位
4.7.5.模糊查詢
語法:like '數據'; 用法: select * from user where username like '張';---全名叫張的 select * from user where username like '張%';---姓張的 select * from user where username like '%張';---最後一個字是張的 select * from user where username like '%張%';---包含張的 select * from user where username like '_張%';---第二個字是張的 註意:%:代表多個任意字元 _代表任意一個字元
4.7.6.空/非空查詢
語法: is null;---某欄位為null is not null;---某欄位不為null
4.8.分組查詢
語法:select 欄位 from 表名 group by 欄位 [having(條件)] 表達式;
4.9.分頁查詢
limit 3,5
5.sql語句的書寫順序與執行順序
書寫順序:select 欄位 from 表名 where 條件 group by 欄位 having 條件 order by 欄位;
執行順序:from > where > group by > having > select > order by
多表連查
1.準備數據
創建customer表 id 整型 主鍵 自動增長, 姓名 字元串20 不能為空, 電話 字元串20 不能為空, 等級 字元串20 預設為銅牌會員 create table customer( id int primary key auto_increment, name varchar(20) not null, tel varchar(20) not null, grade varchar(20) default '銅牌會員' ); 創建orders表 id 整型 主鍵 自動增長, 訂單編號 字元串30 唯一 不能為空, 訂單提交時間 時間戳類型, 客戶id 整型 外鍵(與客戶主鍵對應) create table orders( id int primary key auto_increment, ocode varchar(30) unique not null, createTime timestamp, cid int not null, constraint customer_orders foreign key orders(cid) references customer(id) ); customer表插入數據 insert into customer values(null,'張三','13825545454','銀牌會員'); insert into customer values(null,'李四','13820145999','銀牌會員'); insert into customer values(null,'王五','17745589215','金牌會員'); orders表插入數據 insert into orders values(null,'jd001',null,1); insert into orders values(null,'jd002',null,2); insert into orders values(null,'jd003',null,1); insert into orders values(null,'jd004',null,2);
創建goods表 id 整型 主鍵 自動增長, gcode 字元串20 唯一 非空, gname 字元串30 非空, gprice 浮點型(8,2) 非空, producttime 日期類型 create table goods( id int primary key auto_increment, gcode varchar(20) unique not null, gname varchar(30) not null, gprice double(8,2) not null, producttime date ); 插入數據 insert into goods values(null,'DQ0012','電視機',2999,'2014-12-25'); insert into goods values(null,'DQ0013','洗衣機',1999,'2014-11-25'); insert into goods values(null,'DQ0014','空調扇',235,'2014-5-21'); insert into goods values(null,'SJ0012','iphone5',3288,'2014-10-27'); insert into goods values(null,'SJ0013','魅族MX5',1799,'2015-4-11'); insert into goods values(null,'RY0012','運動鞋',450,'2013-8-19');
創建orders_goods關係表 id 整型 主鍵 自動增長, oid 整型 非空, gid 整型 非空 create table orders_goods( id int primary key auto_increment, oid int not null, gid int not null, constraint orders_goods_rel foreign key orders_goods(oid) references orders(id), foreign key orders_goods(gid) references goods(id) ); 插入數據 insert into orders_goods values(null,1,1); insert into orders_goods values(null,1,3); insert into orders_goods values(null,1,5); insert into orders_goods values(null,2,1); insert into orders_goods values(null,2,2); insert into orders_goods values(null,3,5); insert into orders_goods values(null,4,5); insert into orders_goods values(null,4,6);
1.1.內連接
內連接就是在查詢的時候數據之間的必須一一對應才能查出
顯示內連接 語法:select 欄位 from 表1 inner join 表2 on 條件 例如: 內連接需求:查詢所有的用戶的訂單中的商品信息 select * from customer c inner join orders o on c.id=o.cid inner join orders_goods o_g on o_g.oid=o.id inner join goods g on o_g.gid=g.id; 查詢客戶表連接到訂單表,條件是客戶表中的主鍵id等於訂單表中外鍵;因為訂單表和商品表之間的關係是多對多,所以需要介入中間表,
隱式內連接 語法:select 欄位 from 表1,表2,... where 條件 註意:一般情況下 n張表需要最少 n-1個條件可以保證數據不冗餘 例如:內連接需求:查詢所有的用戶的訂單中的商品信息 select * from customer c,orders o,orders_goods og,goods g where c.id=o.cid and o.id=og.oid and og.gid=g.id;
1.2.外連接
左外連接
保證左表中的數據全部顯示,右表中的數據僅僅顯示與左表有關聯的,沒有數據的會顯示null
語法:select 欄位 form 左表 left [outer] join 右表 on 條件
例如:左外連接需求:查詢所有的用戶的信息,如果該用戶有訂單信息一起顯示
select * from customer c left join orders o on c.id=o.cid;
右外連接
保證右表中的數據全部顯示,左表中的數據僅僅顯示與右表有關聯的,沒有數據會顯示null
語法:select 欄位 from 左表 right [outer] join 右表 on 條件
例如:有外連接需求:查詢所有的商品信息,如果該商品有所屬的訂單則一起顯示訂單信息
select * from orders o right join orders_goods og on o.id=og.oid right join goods g on og.gid=g.id;
1.3.子查詢
查出的數據可以當作一個表看待
select * from customer where id=(select cid from orders where id=2);
資料庫的備份與恢復
備份: mysqldump -u 用戶名 -p 資料庫名稱 表名[表名]>磁碟路徑 --回車 password:***** --回車 形成一個.sql的文件 恢復: mysql -u 用戶名 -p 資料庫名稱(指定導入到那一個資料庫)<磁碟路徑 --回車 password:***** --回車 註意: 如果指定的資料庫不存在,則失敗;需要自己先創建資料庫
資料庫中的許可權、用戶操作(DCL)
1.創建用戶
語法: CREATE USER 用戶名@地址 IDENTIFIED BY '密碼'; CREATE USER user1@localhost IDENTIFIED BY ‘123’; CREATE USER user2@’%’ IDENTIFIED BY ‘123’; user1用戶只能訪問localhost user2用戶可以遠程訪問
2.給用戶授權
語法: GRANT 許可權1, … , 許可權n ON 資料庫.* TO 用戶名@IP GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb1.* TO user1@localhost; GRANT ALL ON mydb1.* TO user2@’%’;
3.撤銷授權
語法: REVOKE許可權1, … , 許可權n ON 資料庫.* FORM 用戶名 REVOKE CREATE,ALTER,DROP ON mydb1.* FROM user1@localhost;
4.查看用戶許可權
語法:
SHOW GRANTS FOR 用戶名
SHOW GRANTS FOR user1@localhost;
5.刪除用戶
語法:
DROP USER 用戶名
DROP USER user1@localhost;
6.修改用戶密碼
語法: Use mysql; UPDATE USER SET PASSWORD=PASSWORD(‘密碼’) WHERE User=’用戶名’; FLUSH PRIVILEGES; UPDATE USER SET PASSWORD=PASSWORD('1234') WHERE User='user2'; FLUSH PRIVILEGES;
視圖管理
標註:
不管那種創建視圖的方式,新創建的視圖中的數據會隨著源表中的數據變化而變化創建數圖:
1、同一資料庫下第一類:create view v as select * from table; 第二類:create view v as select id,name,age from table; 第三類:CREATE VIEW d_u as SELECT u.user_id as user_id, u.login_ip as login_ip, d.parent_id as parent_id FROM sys_dept d join sys_user u WHERE u.dept_id=d.dept_id; 第四類:create view v as (select * from table1) union all (select * from table2);
2、不同資料庫
這種情況只比上面的sql語句多一個資料庫的名字,如下: create view 資料庫1.v as (select * from 資料庫1.table1) union all (select * from 資料庫2.table2); 或 create view 資料庫2.v as (select * from 資料庫1.table1) union all (select * from 資料庫2.table2); 如果執行第一個sql將在資料庫1下建立視圖,反之亦然;
3、基於不同伺服器的
這種情況稍微麻煩一點,需要先建立一個遠程表來訪問遠程伺服器的數據表,然後再對這個剛建立的遠程表和本地表進行視圖,步驟如下: 1、查看MySql是否支持federated引擎 (1).登錄Mysql; (2).mysql>show engines; (3).如果顯示為no,在配置文件中添加:federated (在my.ini),重新啟動mysql服務。 2、創建遠程表 CREATE TABLE federated_table ( id INT(20) NOT NULL AUTO_INCREMENT, name VARCHAR(32) NOT NULL DEFAULT '', other INT(20) NOT NULL DEFAULT '0', PRIMARY KEY (id) ) ENGINE=FEDERATEDDEFAULT CHARSET=utf8 CONNECTION='mysql://fed_user@remote_host:9306/federated/test_table'; CONNECTION可以按如下方式進行配置: (1).CONNECTION='mysql://username:password@hostname:port/database/tablename' (2).CONNECTION='mysql://username@hostname/database/tablename' (3).CONNECTION='mysql://username:password@hostname/database/tablename' 3、建立視圖 create view 本地資料庫.v as (select * from 本地資料庫.table1) union all (select * from 遠程資料庫.test_table);
數圖的作用:
作用一: 提高了重用性,就像一個函數。如果要頻繁獲取user的name和goods的name。就應該使用以下sql語言。 示例:select a.name as username, b.name as goodsname from user as a, goods as b, ug as c where a.id=c.userid and c.goodsid=b.id; 但有了視圖就不一樣了,創建視圖other。 示例:create view other as select a.name as username, b.name as goodsname from user as a, goods as b, ug as c where a.id=c.userid and c.goodsid=b.id; 創建好視圖後,就可以這樣獲取user的name和goods的name。 示例:select * from other; 作用二: 對資料庫重構,卻不影響程式的運行。 假如因為某種需求,需要將user拆房表usera和表userb, 該兩張表的結構如下: 測試表:usera有id,name,age欄位 測試表:userb有id,name,sex欄位 這時如果服務端使用sql語句:select * from user; 那就會提示該表不存在,這時該如何解決呢。 解決方案:創建視圖。 以下sql語句創建視圖: create view user as select a.name,a.age,b.sex from usera as a, userb as b where a.name=b.name; 以上假設name都是唯一的。此時服務端使用sql語句:select * from user;就不會報錯什麼的。 這就實現了更改資料庫結構,不更改腳本程式的功能了。 作用三: 提高了安全性能。 可以對不同的用戶,設定不同的視圖。 例如:某用戶只能獲取user表的name和age數據,不能獲取sex數據。則可以這樣創建視圖。 示例如下: create view other as select a.name, a.age from user as a; 這樣的話,使用sql語句:select * from other; 最多就只能獲取name和age的數據,其他的數據就獲取不到了。 作用四: 讓數據更加清晰。想要什麼樣的數據,就創建什麼樣的視圖。經過以上三條作用的解析,這條作用應該很容易理解了吧
刪除視圖
mysql> DROP VIEW PEOPLE_VIEW;