文章目錄
配置操作
連接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 |
+----+-----------+----------+