MySQL基礎操作

...\color{#f44336}{持續學習中...}

配置操作

連接MySQL
mysql -h 127.0.0.1 -u root -p
#參數:
	# -h 主機 本地數據庫可以不用寫
	# -u 用戶名
	# -p 密碼
添加新用戶
# 允許本地IP訪問localhost,127.0.0.1
create user 'testuser'@'localhost' identified by 'testpassword';

# 允許外網IP訪問
create user 'testuser'@'%' identified by 'testpassword';

# 刷新授權
flush privileges;
修改用戶密碼
# 修改用戶密碼
set password for 'testuser'@'localhost'=password('testpwd');
修改用戶的權限
# 授予用戶在本地服務器對該數據庫的全部權限
# all可以替換成想要設置的權限 SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER 然後去掉privileges
grant all privileges on `dbCourse`.* to 'testuser'@'localhost' identified by 'password';

grant select,update,delete,alter on testuser.* to testuser@'localhost' identified by 'password';

# 授予用戶通過外網IP對於該數據庫的全部權限
grant all privileges on `dbCourse`.* to 'testuser'@'%' identified by 'password'; 
查看用戶的權限
 show grants for 'testuser'@'localhost';
刪除用戶
drop user 'testuser'@'localhost';

數據庫操作

創建數據庫
# 創建dbCourse數據庫, 設置默認字符集爲utf8
create database dbCourse default charset=utf8;
修改數據庫
# 修改數據庫的字符集
alter database dbCourse default character set 'utf8';
# 查看數據庫的聲明定義
show create database dbCourse;
刪除數據庫
drop database dbCourse;
# 使用 if exists 用於防止當數據庫不存在是發生錯誤
drop database if exists dbCourse;

數據引擎

查看mysql已經提供什麼引擎
show engiens;
查看mysql當前默認引擎
show variables like '%storage_engine%';
修改數據庫臨時的默認存儲引擎
# 當再次重啓客戶端時,默認存儲引擎仍然是 InnoDB。
set default_storage_engine=MyISAM;

數據表操作

創建表
create table articles(
    -> id int(11) not null primary key auto_increment,
    -> title varchar(255) not null,
    -> content longtext not null # 這裏的逗號不能要
    -> );
修改表名
# 修改表名
alter table mytable rename testtable;
修改數據表的字符編碼
# 修改字符集
alter table mytable default character set 'gbk';
alter table mytable convert to character set 'utf8';
查看數據表的定義
# 查看數據庫的聲明定義
show create table mytable;
備份和導入表
# 要備份的標 students 備份的表爲recover_student
CREATE TABLE backup_student SELECT * FROM students;
# 測試了, 主鍵和自增沒有備份過去

# 將備份表的數據導入主表中
CREATE TABLE backup_stu SELECT * FROM stu;
TRUNCATE stu;
INSERT INTO stu SELECT * FROM backup_stu;
清空表
# 基本刪除語句, 一條一條的刪除, 速度會很慢
# 下次添加數據, id接着前面的數據來
DELETE FROM recover_student;

# 清空表
TRUNCATE users;
# 下次添加數據, id從1開始
添加-修改-刪除-重命名字段
# 添加字段
# after id 指定的字段在哪個字段後面, 或者 first, 那麼放在字段最前面
ALTER TABLE users ADD email VARCHAR(50) DEFAULT NULL AFTER id;

# 修改字段
ALTER TABLE users MODIFY username VARCHAR(50) NOT NULL DEFAULT 'testuser';

# 刪除字段
alter table users drop email;

# 字段重命名
ALTER TABLE users CHANGE `username` `name` VARCHAR(100) NOT NULL; 
添加-刪除主鍵和自增
# 添加主鍵
ALTER TABLE backup_users ADD PRIMARY KEY (id);

# 刪除主鍵
# 如果主鍵字段有自增就會報錯, 所以想要刪除自增
ALTER TABLE backup_users DROP PRIMARY KEY;

# 添加自增
ALTER TABLE backup_users MODIFY id INT NOT NULL AUTO_INCREMENT;

#刪除自增
ALTER TABLE backup_users MODIFY id INT NOT NULL;
添加外鍵約束
CONSTRAINT package_constraint FOREIGN KEY (`pid`) REFERENCES `package`(`id`)

alter table selection add constraint FK_Reference_1 foreign key(course) references course (id) 
添加數據
# 一次添加一條數據
insert into `stu` (`id`, `name`, `class_id`) values('1','user1','1');

# 一次添加多條數據
insert into stu_course (sid, cid) values(1, 2),(1, 4),(2, 4), (3, 2), (3, 3),(4, 1);
刪除數據
# 刪除指定數據
DELETE FROM stu WHERE id = 5;
# 刪除指定的多條數據
DELETE FROM stu WHERE id IN (6, 7, 8);
修改數據
# 修改一條數據
UPDATE stu SET `name` = 'chenjiang' WHERE id = 4;
查詢數據
SELECT * FROM stu WHERE id > 2;
排序
-- 排序是對已經查詢出來的結果再進行排序, 而不是先排序後查詢, 所以要將order by 放在 where 後面
-- DESC倒序, ASC升序
SELECT * FROM stu WHERE id > 2 ORDER BY id DESC;
內連接
create table stu(
    `id` int not null primary key auto_increment,
    `name` varchar(50) not null,
    `class_id` int
);
insert into `stu` (`id`, `name`, `class_id`) values('1','user1','1');
insert into `stu` (`id`, `name`, `class_id`) values('2','user2','3');
insert into `stu` (`id`, `name`, `class_id`) values('3','user3','4');
insert into `stu` (`id`, `name`, `class_id`) values('4','user4',NULL);
insert into `stu` (`id`, `name`, `class_id`) values('5','user5',NULL);

CREATE TABLE class(
    `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    `cname` VARCHAR(50) NOT NULL
);
insert into `class` (`id`, `cname`) values('1','PHP');
insert into `class` (`id`, `cname`) values('2','Javascript');
insert into `class` (`id`, `cname`) values('3','Python');
insert into `class` (`id`, `cname`) values('4','Java');

CREATE TABLE stu_course(
    `sid` INT comment '學生id',
    `cid` int comment '課程id'
);
insert into stu_course (sid, cid) values(1, 2),(1, 4),(2, 4), (3, 2), (3, 3),(4, 1);

-- 將兩張表一一對應的數據纔會顯示出來
SELECT * FROM stu AS s 
INNER JOIN class AS c
ON s.class_id = c.id;

    id  name    class_id      id  cname   
------  ------  --------  ------  --------
     1  user1          1       1  PHP     
     2  user2          3       3  Python  
     3  user3          4       4  Java    


-- 多對多查詢, 一個學生選了多個課程, 一個課程被多個選
-- 每次內連接的結果, 就當成一張新表, 然後用這張新表繼續內連接其他表
SELECT s.name AS stu_name, c.name AS course_name FROM stu AS s
INNER JOIN stu_course AS sc
ON s.`id` = sc.`sid`
INNER JOIN course AS c
ON sc.`cid` = c.`id`;

stu_name  course_name  
--------  -------------
user1     課程2      
user1     課程4      
user2     課程4      
user3     課程2      
user3     課程3      
user4     課程1   

-- 找到選了大於等於2門課程的學生
SELECT s.name, COUNT(*) AS total FROM stu AS s
INNER JOIN stu_course AS sc
ON s.`id` = sc.`sid`
INNER JOIN class AS c
ON sc.`cid` = c.id
GROUP BY s.`id`
HAVING total >= 2;

name     total  
------  --------
user1          2
user3          2

左連接
-- 將左表的數據全部顯示出來
SELECT * FROM stu AS s 
LEFT JOIN class AS c
ON s.class_id = c.id;

    id  name    class_id      id  cname   
------  ------  --------  ------  --------
     1  user1          1       1  PHP     
     2  user2          3       3  Python  
     3  user3          4       4  Java    
     4  user4     (NULL)  (NULL)  (NULL)  
     5  user5     (NULL)  (NULL)  (NULL)  
右連接
-- 將右表的數據全部顯示出來
SELECT * FROM stu AS s 
RIGHT JOIN class AS c
ON s.class_id = c.id;

    id  name    class_id      id  cname       
------  ------  --------  ------  ------------
     1  user1          1       1  PHP         
     2  user2          3       3  Python      
     3  user3          4       4  Java        
(NULL)  (NULL)    (NULL)       2  Javascript  
where和having的區別
# where後面不能跟聚合函數, 因爲where執行順序大於聚合函數

# where子句的作用是在對查詢結果進行分組之前,將不符合where條件的行去掉,即在分組之前過濾數據,條件中不能包含聚組函數, 使用where條件顯示特定的行.

# having 子句的作用是篩選買主條件的組, 即在分組之後過濾數據, 條件中經常包含聚組函數, 使用having條件顯示特定的組, 也可以使用多個分組標準進行分組.

# 不會出錯
SELECT `name`, `salary` FROM emp WHERE `deptNo` = 2;
# 出錯
SELECT `name`, `salary` FROM emp HAVING `deptNo` = 2;
# 因爲前面並沒有篩選出deptno字段 他會先查詢出所有的記錄到內存,形成了一個表,在對錶進行操作,這是隻能操作表中的字段,也就是select中有的字段。

事務

開啓事務
# 兩種方式
BEGIN;
START TRANSACTION;
回滾和提交
ROLLBACK; -- 撤銷上一次的操作
COMMIT; -- 真正的提交, 如果沒有操作, 只能當前終端才能看到修改的數據
基礎使用
-- 一個終端開啓事務, 進行操作
-- 另一個終端也需要開啓事務

-- 第一臺終端
START TRANSACTION;
INSERT INTO stu (`name`) VALUES('lucy');
SELECT * FROM stu;
ROLLBACK;
-- COMMIT;

    id  name       class_id  
------  ---------  ----------
     1  user1               1
     2  user2               3
     3  user3               4
     4  chenjiang      (NULL)
    18  lucy           (NULL)
    

-- 另外一臺終端
BEGIN;
SELECT * FROM stu; -- 因爲上面還有commit,所以下面這個事務無法接收到上面改變的
+----+-----------+----------+
| id | name      | class_id |
+----+-----------+----------+
|  1 | user1     |        1 |
|  2 | user2     |        3 |
|  3 | user3     |        4 |
|  4 | chenjiang |     NULL |
+----+-----------+----------+

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章