mysql基礎(chǔ)
1.什么是數(shù)據(jù)庫?
- 存儲數(shù)據(jù)的倉庫
- 本質(zhì)上是一個文件系統(tǒng)稻据,還是以文件的方式存在服務(wù)器的電腦上的风题。
- 所有的關(guān)系型數(shù)據(jù)庫都可以使用通用的 SQL 語句進(jìn)行管理
常見的數(shù)據(jù)庫: - MySQL:開源免費的數(shù)據(jù)庫赃蛛,小型的數(shù)據(jù)庫夭谤,已經(jīng)被 Oracle 收購了傍睹。MySQL6.x 版本也開始收費隔盛。后來 Sun公司收購了 MySQL,而 Sun 公司又被 Oracle 收購
- Oracle:收費的大型數(shù)據(jù)庫拾稳,Oracle 公司的產(chǎn)品吮炕。
- DB2 :IBM 公司的數(shù)據(jù)庫產(chǎn)品,收費的。常應(yīng)用在銀行系統(tǒng)中访得。
- SQL Server:MicroSoft 公司收費的中型的數(shù)據(jù)庫龙亲。C#、.net 等語言常使用悍抑。
- SQLite: 嵌入式的小型數(shù)據(jù)庫鳄炉,應(yīng)用在手機端,如:Android搜骡。
為什么用mysql?
- 免費
2.功能強大
2.SQLyog 圖形化工具——客戶端
使用 SQLyog 登錄數(shù)據(jù)庫
3.數(shù)據(jù)庫管理系統(tǒng)
數(shù)據(jù)庫管理系統(tǒng)(DataBase Management System拂盯,DBMS):指一種操作和管理數(shù)據(jù)庫的大型軟件,用于建立记靡、使用和維護數(shù)據(jù)庫磕仅,對數(shù)據(jù)庫進(jìn)行統(tǒng)一管理和控制珊豹,以保證數(shù)據(jù)庫的安全性和完整性。用戶通過數(shù)據(jù)庫管理系統(tǒng)訪問數(shù)據(jù)庫中表內(nèi)的數(shù)據(jù)
4.數(shù)據(jù)庫管理系統(tǒng)榕订、數(shù)據(jù)庫和表的關(guān)系
數(shù)據(jù)庫管理程序(DBMS)可以管理多個數(shù)據(jù)庫店茶,一般開發(fā)人員會針對每一個應(yīng)用創(chuàng)建一個數(shù)據(jù)庫。為保存應(yīng)用
中實體的數(shù)據(jù)劫恒,一般會在數(shù)據(jù)庫創(chuàng)建多個表贩幻,以保存程序中實體 User 的數(shù)據(jù)。
數(shù)據(jù)庫管理系統(tǒng)两嘴、數(shù)據(jù)庫和表的關(guān)系如圖所示:
結(jié)論:
- 一個數(shù)據(jù)庫服務(wù)器包含多個庫
- 一個數(shù)據(jù)庫包含多張表
- 一張表包含多條記錄
5.SQL 的概念
什么是 SQL?
Structured Query Language 結(jié)構(gòu)化查詢語言
SQL 作用?
- 是一種所有關(guān)系型數(shù)據(jù)庫的查詢規(guī)范丛楚,不同的數(shù)據(jù)庫都支持。
- 通用的數(shù)據(jù)庫操作語言憔辫,可以用在不同的數(shù)據(jù)庫中趣些。
- 不同的數(shù)據(jù)庫 SQL 語句有一些區(qū)別
SQL 語句分類
- Data Definition Language (DDL 數(shù)據(jù)定義語言) 如:建庫,建表
- Data Manipulation Language(DML 數(shù)據(jù)操縱語言)贰您,如:對表中的記錄操作增刪改
- Data Query Language(DQL 數(shù)據(jù)查詢語言)坏平,如:對表中的查詢操作
- Data Control Language(DCL 數(shù)據(jù)控制語言),如:對用戶權(quán)限的設(shè)置
MySQL 的語法 - 每條語句以分號結(jié)尾锦亦,如果在 SQLyog 中不是必須加的舶替。
- SQL 中不區(qū)分大小寫,關(guān)鍵字中認(rèn)為大寫和小寫是一樣的
DDL 操作數(shù)據(jù)庫
1.創(chuàng)建數(shù)據(jù)庫:
創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE 數(shù)據(jù)庫名;
判斷數(shù)據(jù)庫是否已經(jīng)存在杠园,不存在則創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE IF NOT EXISTS 數(shù)據(jù)庫名;
創(chuàng)建數(shù)據(jù)庫并指定字符集
CREATE DATABASE 數(shù)據(jù)庫名 CHARACTER SET 字符集;
-- 直接創(chuàng)建數(shù)據(jù)庫 db1
create database db1;
-- 判斷是否存在顾瞪,如果不存在則創(chuàng)建數(shù)據(jù)庫 db2
create database if not exists db2;
-- 創(chuàng)建數(shù)據(jù)庫并指定字符集為 gbk
create database db3 default character set gbk;
小提示:按 tab 鍵可以自動補全關(guān)鍵字
2.查看數(shù)據(jù)庫:
-- 查看所有的數(shù)據(jù)庫
show databases;
-- 查看某個數(shù)據(jù)庫的定義信息
show create database db3;
show create database db1;
3.修改數(shù)據(jù)庫
修改數(shù)據(jù)庫默認(rèn)的字符集
ALTER DATABASE 數(shù)據(jù)庫名 DEFAULT CHARACTER SET 字符集;
將 db3 數(shù)據(jù)庫的字符集改成 utf8
alter database db3 character set utf8;
4.刪除數(shù)據(jù)庫
刪除數(shù)據(jù)庫的語法
DROP DATABASE 數(shù)據(jù)庫名;
刪除 db2 數(shù)據(jù)庫
drop database db2;
小提示:每行 SQL 語句需要選中再執(zhí)行,可以按 F9
使用數(shù)據(jù)庫
查看正在使用的數(shù)據(jù)庫
SELECT DATABASE(); 使用的一個 mysql 中的全局函數(shù)
使用/切換數(shù)據(jù)庫
USE 數(shù)據(jù)庫名;
-- 查看正在使用的數(shù)據(jù)庫
select database();
-- 改變要使用的數(shù)據(jù)庫
use db4;
DDL 操作表結(jié)構(gòu)
小提示:前提先使用某個數(shù)據(jù)庫
創(chuàng)建表
格式:
CREATE TABLE 表名 (
字段名 1 字段類型 1,
字段名 2 字段類型 2
);
關(guān)鍵字說明:
CREATE 創(chuàng)建;TABLE 表
MySQL 數(shù)據(jù)類型
常使用的數(shù)據(jù)類型如下:
詳細(xì)的數(shù)據(jù)類型如下:
創(chuàng)建 student 表包含 id,name,birthday 字段:
create table student (
id int, -- 整數(shù)
name varchar(20), -- 字符串
birthday date -- 生日抛蚁,最后沒有逗號
);
查看表
查看某個數(shù)據(jù)庫中的所有表
SHOW TABLES;
查看表結(jié)構(gòu)
DESC 表名;
查看創(chuàng)建表的 SQL 語句
SHOW CREATE TABLE 表名;
查看 day21 數(shù)據(jù)庫中的所有表
use day21;
show tables;
查看 student 表的結(jié)構(gòu)
desc student;
查看 student 的創(chuàng)建表 SQL 語句
show create table student;
` 存在的目的是為了避免關(guān)鍵字的沖突
CREATE TABLE `student` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`birthday` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
快速創(chuàng)建一個表結(jié)構(gòu)相同的表
CREATE TABLE 新表名 LIKE 舊表名;
創(chuàng)建 s1 表陈醒,s1 表結(jié)構(gòu)和 student 表結(jié)構(gòu)相同
create table s1 like student;
desc s1;
刪除表
直接刪除表
DROP TABLE 表名;
判斷表是否存在,如果存在則刪除表
DROP TABLE IF EXISTS 表名;
-- 直接刪除表 s1 表
drop table s1;
-- 判斷表是否存在并刪除 s1 表
drop table if exists `create`;
與直接刪除的區(qū)別:如果表不存在瞧甩,不刪除钉跷,存在則刪除
修改表結(jié)構(gòu)
添加表列 ADD
ALTER TABLE 表名 ADD 列名 類型;
為學(xué)生表添加一個新的字段 remark,類型為 varchar(20)
alter table student add remark varchar(20);
修改列類型 MODIFY
ALTER TABLE 表名 MODIFY 列名 新的類型;
alter table student modify remark varchar(100);
修改列名 CHANGE
ALTER TABLE 表名 CHANGE 舊列名 新列名 類型;
將 student 表中的 remark 字段名改成 intro,類型 varchar(30)
alter table student change remark intro varchar(30);
刪除列 DROP
ALTER TABLE 表名 DROP 列名;
刪除 student 表中的字段 intro
alter table student change remark intro varchar(30);
修改表名
RENAME TABLE 表名 TO 新表名;
將學(xué)生表 student 改名成 student2
rename table student to student2;
修改字符集 character set
ALTER TABLE 表名 character set 字符集;
將 student2 表的編碼修改成 gbk
alter table student2 character set gbk;
DML 操作表中的數(shù)據(jù)
用于對表中的記錄進(jìn)行增刪改操作
插入記錄:
INSERT [INTO] 表名 [字段名] VALUES (字段值)
INSERT INTO 表名:表示往哪張表中添加數(shù)據(jù)
(字段名 1, 字段名 2, …):要給哪些字段設(shè)置值
VALUES (值 1, 值 2, …):設(shè)置具體的值
插入全部字段
所有的字段名都寫出來
INSERT INTO 表名 (字段名 1, 字段名 2, 字段名 3…) VALUES (值 1, 值 2, 值 3);
不寫字段名
INSERT INTO 表名 VALUES (值 1, 值 2, 值 3…);
插入部分?jǐn)?shù)據(jù)
INSERT INTO 表名 (字段名 1, 字段名 2, ...) VALUES (值 1, 值 2, ...);
插入所有的列亲配,向?qū)W生表中
insert into student (id,name,age,sex) values (1, '孫悟空', 20, '男');
insert into student (id,name,age,sex) values (2, '孫悟天', 16, '男');
-- 插入所有列
insert into student values (3, '孫悟飯', 18, '男', '龜仙人洞中');
select * from student;
小提示:沒有添加數(shù)據(jù)的字段會使用 NULL
insert 的注意事項:
- 插入的數(shù)據(jù)應(yīng)與字段的數(shù)據(jù)類型相同
- 數(shù)據(jù)的大小應(yīng)在列的規(guī)定范圍內(nèi)尘应,例如:不能將一個長度為 80 的字符串加入到長度為 40 的列中惶凝。
- 在 values 中列出的數(shù)據(jù)位置必須與被加入的列的排列位置相對應(yīng)吼虎。在 mysql 中可以使用 value,但不建議使
用苍鲜,功能與 values 相同思灰。 - 字符和日期型數(shù)據(jù)應(yīng)包含在單引號中。MySQL 中也可以使用雙引號做為分隔符混滔。
- 不指定列或使用 null洒疚,表示插入空值歹颓。
更新表記錄
UPDATE 表名 SET 列名=值 [WHERE 條件表達(dá)式]
UPDATE: 需要更新的表名
SET: 修改的列值
WHERE: 符合條件的記錄才更新
你可以同時更新一個或多個字段。
你可以在 WHERE 子句中指定任何條件油湖。
不帶條件修改數(shù)據(jù)
UPDATE 表名 SET 字段名=值; -- 修改所有的行
帶條件修改數(shù)據(jù)
UPDATE 表名 SET 字段名=值 WHERE 字段名=值;
-- 不帶條件修改數(shù)據(jù)巍扛,將所有的性別改成女
update student set sex = '女';
-- 帶條件修改數(shù)據(jù),將 id 號為 2 的學(xué)生性別改成男
update student set sex='男' where id=2;
-- 一次修改多個列乏德,把 id 為 3 的學(xué)生撤奸,年齡改成 26 歲,address 改成北京
update student set age=26, address='北京' where id=3;
刪除表記錄
DELETE FROM 表名 [WHERE 條件表達(dá)式]
如果沒有指定 WHERE 子句喊括,MySQL 表中的所有記錄將被刪除胧瓜。
你可以在 WHERE 子句中指定任何條件
不帶條件刪除數(shù)據(jù)
DELETE FROM 表名;
帶條件刪除數(shù)據(jù)
DELETE FROM 表名 WHERE 字段名=值;
使用 truncate 刪除表中所有記錄
TRUNCATE TABLE 表名;
truncate 和 delete 的區(qū)別:
truncate 相當(dāng)于刪除表的結(jié)構(gòu),再創(chuàng)建一張表郑什。
-- 帶條件刪除數(shù)據(jù)府喳,刪除 id 為 1 的記錄
delete from student where id=1;
-- 不帶條件刪除數(shù)據(jù),刪除表中的所有數(shù)據(jù)
delete from student;
DQL 查詢表中的數(shù)據(jù)
查詢不會對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行修改.只是一種顯示數(shù)據(jù)的方式
SELECT 列名 FROM 表名 [WHERE 條件表達(dá)式]
1) SELECT 命令可以讀取一行或者多行記錄。
2) 你可以使用星號(*)來代替其他字段蘑拯,SELECT 語句會返回表的所有字段數(shù)據(jù)
3) 你可以使用 WHERE 語句來包含任何條件钝满。
簡單查詢
查詢表所有行和列的數(shù)據(jù) 使用*表示所有列
SELECT * FROM 表名;
查詢所有的學(xué)生:
select * from student;
查詢指定列
查詢指定列的數(shù)據(jù),多個列之間以逗號分隔
SELECT 字段名 1, 字段名 2, 字段名 3, ... FROM 表名;
查詢 student 表中的 name 和 age 列
select name,age from student
指定列的別名進(jìn)行查詢
使用關(guān)鍵字
使用別名的好處: 顯示的時候使用新的名字,并不修改表的結(jié)構(gòu)强胰。
對列指定別名:
SELECT 字段名 1 AS 別名, 字段名 2 AS 別名... FROM 表名;
對列和表同時指定別名:
SELECT 字段名 1 AS 別名, 字段名 2 AS 別名... FROM 表名 AS 表別名;
-- 使用別名
select name as 姓名,age as 年齡 from student;
-- 表使用別名
select st.name as 姓名,age as 年齡 from student as st
清除重復(fù)值
查詢指定列并且結(jié)果不出現(xiàn)重復(fù)數(shù)據(jù)
SELECT DISTINCT 字段名 FROM 表名;
-- 查詢學(xué)生來至于哪些地方
select address from student;
-- 去掉重復(fù)的記錄
select distinct address from student;
小提示:表使用別名的原因:用于多表查詢操作
條件查詢
為什么要條件查詢?
如果沒有查詢條件舱沧,則每次查詢所有的行。實際應(yīng)用中偶洋,一般要指定查詢的條件猴凹。對記錄進(jìn)行過濾
SELECT 字段名 FROM 表名 WHERE 條件;
流程:取出表中的每條數(shù)據(jù),滿足條件的記錄就返回火脉,不滿足條件的記錄不返回
準(zhǔn)備數(shù)據(jù):
創(chuàng)建一個學(xué)生表械姻,包含如下列:
CREATE TABLE student3 (
id int, -- 編號
name varchar(20), -- 姓名
age int, -- 年齡
sex varchar(5), -- 性別
address varchar(100), -- 地址
math int, -- 數(shù)學(xué)
english int -- 英語
);
INSERT INTO student3(id,NAME,age,sex,address,math,english) VALUES (1,'馬云',55,'男','
杭州',66,78),(2,'馬化騰',45,'女','深圳',98,87),(3,'馬景濤',55,'男','香港',56,77),(4,'柳巖
',20,'女','湖南',76,65),(5,'柳青',20,'男','湖南',86,NULL),(6,'劉德華',57,'男','香港
',99,99),(7,'馬德',22,'女','香港',99,99),(8,'德瑪西亞',18,'男','南京',56,65);
運算符:
-- 查詢 math 分?jǐn)?shù)大于 80 分的學(xué)生
select * from student3 where math>80;
-- 查詢 english 分?jǐn)?shù)小于或等于 80 分的學(xué)生
select * from student3 where english <=80;
-- 查詢 age 等于 20 歲的學(xué)生
-- 查詢 math 分?jǐn)?shù)大于 80 分的學(xué)生
select * from student3 where math>80;
-- 查詢 english 分?jǐn)?shù)小于或等于 80 分的學(xué)生
select * from student3 where english <=80;
-- 查詢 age 等于 20 歲的學(xué)生
select * from student3 where age = 20;
-- 查詢 age 不等于 20 歲的學(xué)生,注:不等于有兩種寫法
select * from student3 where age <> 20;
select * from student3 where age != 20;
邏輯運算符
-- 查詢 age 大于 35 且性別為男的學(xué)生(兩個條件同時滿足)
select * from student3 where age>35 and sex='男';
-- 查詢 age 大于 35 或性別為男的學(xué)生(兩個條件其中一個滿足)
select * from student3 where age>35 or sex='男';
-- 查詢 id 是 1 或 3 或 5 的學(xué)生
select * from student3 where id=1 or id=3 or id=5;
in 關(guān)鍵字
SELECT 字段名 FROM 表名 WHERE 字段 in (數(shù)據(jù) 1, 數(shù)據(jù) 2...);
in 里面的每個數(shù)據(jù)都會作為一次條件恩脂,只要滿足條件的就會顯示
-- 查詢 id 是 1 或 3 或 5 的學(xué)生
select * from student3 where id in(1,3,5);
-- 查詢 id 不是 1 或 3 或 5 的學(xué)生
select * from student3 where id not in(1,3,5);
BETWEEN 值 1 AND 值 2
表示從值 1 到值 2 范圍帽氓,包頭又包尾
比如:age BETWEEN 80 AND 100 相當(dāng)于: age>=80 && age<=100
查詢 english 成績大于等于 75,且小于等于 90 的學(xué)生
select * from student3 where english between 75 and 90;
like 關(guān)鍵字
LIKE 表示模糊查詢
SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';
MySQL 通配符:% 匹配任意多個字符串;_ 匹配一個字符
-- 查詢姓馬的學(xué)生
select * from student3 where name like '馬%';
select * from student3 where name like '馬';
-- 查詢姓名中包含'德'字的學(xué)生
select * from student3 where name like '%德%';
-- 查詢姓馬俩块,且姓名有兩個字的學(xué)生
select * from student3 where name like '馬_';
- 排序查詢
- 語法:order by 子句
- order by 排序字段1 排序方式1 黎休, 排序字段2 排序方式2...
- 排序方式:
- ASC:升序,默認(rèn)的玉凯。
- DESC:降序势腮。
- 注意:如果有多個排序條件,則當(dāng)前邊的條件值一樣時漫仆,才會判斷第二條件捎拯。
聚合函數(shù):將一列數(shù)據(jù)作為一個整體,進(jìn)行縱向的計算盲厌。
- count:計算個數(shù)
- 一般選擇非空的列:主鍵
- count(*)
- max:計算最大值
- min:計算最小值
- sum:計算和
- avg:計算平均值
注意:聚合函數(shù)的計算署照,排除null值祸泪。
分組查詢:
語法:group by 分組字段;
- 分組之后查詢的字段:分組字段建芙、聚合函數(shù)
- where 和 having 的區(qū)別没隘?
- where 在分組之前進(jìn)行限定,如果不滿足條件禁荸,則不參與分組升略。having在分組之后進(jìn)行限定,如果不滿足結(jié)果屡限,則不會被查詢出來
- where 后不可以跟聚合函數(shù)品嚣,having可以進(jìn)行聚合函數(shù)的判斷。
-- 按照性別分組钧大。分別查詢男翰撑、女同學(xué)的平均分
SELECT sex , AVG(math) FROM student GROUP BY sex;
-- 按照性別分組。分別查詢男啊央、女同學(xué)的平均分,人數(shù)
SELECT sex , AVG(math),COUNT(id) FROM student GROUP BY sex;
-- 按照性別分組眶诈。分別查詢男、女同學(xué)的平均分,人數(shù) 要求:分?jǐn)?shù)低于70分的人瓜饥,不參與分組
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex;
-- 按照性別分組逝撬。分別查詢男、女同學(xué)的平均分,人數(shù) 要求:分?jǐn)?shù)低于70分的人乓土,不參與分組,分組之后宪潮。人數(shù)要大于2個人
SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;
SELECT sex , AVG(math),COUNT(id) 人數(shù) FROM student WHERE math > 70 GROUP BY sex HAVING 人數(shù) > 2;
約束
- 概念: 對表中的數(shù)據(jù)進(jìn)行限定,保證數(shù)據(jù)的正確性趣苏、有效性和完整性狡相。
- 分類:
- 主鍵約束:primary key
- 非空約束:not null
- 唯一約束:unique
- 外鍵約束:foreign key
- 分類:
* 非空約束:not null,值不能為null
1. 創(chuàng)建表時添加約束
CREATE TABLE stu(
id INT,
NAME VARCHAR(20) NOT NULL -- name為非空
);
2. 創(chuàng)建表完后食磕,添加非空約束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
3. 刪除name的非空約束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
* 唯一約束:unique尽棕,值不能重復(fù)
1. 創(chuàng)建表時,添加唯一約束
CREATE TABLE stu(
id INT,
phone_number VARCHAR(20) UNIQUE -- 添加了唯一約束
);
* 注意mysql中彬伦,唯一約束限定的列的值可以有多個null
2. 刪除唯一約束
ALTER TABLE stu DROP INDEX phone_number;
3. 在創(chuàng)建表后滔悉,添加唯一約束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
* 主鍵約束:primary key。
1. 注意:
1. 含義:非空且唯一
2. 一張表只能有一個字段為主鍵
3. 主鍵就是表中記錄的唯一標(biāo)識
2. 在創(chuàng)建表時单绑,添加主鍵約束
create table stu(
id int primary key,-- 給id添加主鍵約束
name varchar(20)
);
3. 刪除主鍵
-- 錯誤 alter table stu modify id int ;
ALTER TABLE stu DROP PRIMARY KEY;
4. 創(chuàng)建完表后回官,添加主鍵
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
5. 自動增長:
1. 概念:如果某一列是數(shù)值類型的,使用 auto_increment 可以來完成值得自動增長
2. 在創(chuàng)建表時询张,添加主鍵約束孙乖,并且完成主鍵自增長
create table stu(
id int primary key auto_increment,-- 給id添加主鍵約束
name varchar(20)
);
3. 刪除自動增長
ALTER TABLE stu MODIFY id INT;
4. 添加自動增長
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
* 外鍵約束:foreign key,讓表于表產(chǎn)生關(guān)系浙炼,從而保證數(shù)據(jù)的正確性份氧。
1. 在創(chuàng)建表時唯袄,可以添加外鍵
* 語法:
create table 表名(
....
外鍵列
constraint 外鍵名稱 foreign key (外鍵列名稱) references 主表名稱(主表列名稱)
);
2. 刪除外鍵
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;
3. 創(chuàng)建表之后,添加外鍵
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段名稱) REFERENCES 主表名稱(主表列名稱);
4. 級聯(lián)操作
1. 添加級聯(lián)操作
語法:ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱
FOREIGN KEY (外鍵字段名稱) REFERENCES 主表名稱(主表列名稱) ON UPDATE CASCADE ON DELETE CASCADE ;
2. 分類:
1. 級聯(lián)更新:ON UPDATE CASCADE
2. 級聯(lián)刪除:ON DELETE CASCADE