數據庫基本操作
update user set password=password('123456')where user='root'; 修改密碼
flush privileges; 刷新數據庫
show databases; 顯示所有數據庫
use dbname; 打開某個數據庫
show tables; 顯示數據庫mysql中所有的表
describe user; 顯示表mysql數據庫中user表的列信息
create database name; 創建數據庫
use databasename; 選擇數據庫
exit; 退出Mysql
? 命令關鍵詞 : 尋求幫助
-- 表示注釋
創建數據庫:
CREATE DATABASE 數據庫名 //創建數據庫
刪除數據庫 :
drop database [if exists] 數據庫名;
查看數據庫 :
show databases;
使用數據庫 :
use 數據庫名;
表的操作
偽代碼:
create table [if not exists] `表名`(
'字段名1' 列類型 [屬性][索引][注釋],
'字段名2' 列類型 [屬性][索引][注釋],
'字段名n' 列類型 [屬性][索引][注釋]
)[表類型][表字符集][注釋]
實例:
-- 創建外鍵的方式一 : 創建子表同時創建外鍵
-- 年級表 (id\年級名稱)
CREATE TABLE `grade` (
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年級ID',
`gradename` VARCHAR(50) NOT NULL COMMENT '年級名稱',
PRIMARY KEY (`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
-- 學生信息表 (學號,姓名,性別,年級,手機,地址,出生日期,郵箱,身份證號)
CREATE TABLE `Student` (
`Sno` INT(4) NOT NULL COMMENT '學號',
`Sname` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`Ssex` TINYINT(1) DEFAULT '1' COMMENT '性別',
`gradeid` INT(10) DEFAULT NULL COMMENT '年級',
`phoneNum` VARCHAR(50) NOT NULL COMMENT '手機',
`address` VARCHAR(255) DEFAULT NULL COMMENT '地址',
`borndate` DATETIME DEFAULT NULL COMMENT '生日',
`email` VARCHAR(50) DEFAULT NULL COMMENT '郵箱',
`idCard` VARCHAR(18) DEFAULT NULL COMMENT '身份證號',
PRIMARY KEY (`studentno`),
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`
(`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
主鍵:
PRIMARY KEY (`字段名`)
外鍵:
KEY FK_ `字段名` (`字段名`)
外鍵約束:給外鍵字段添加約束執行引用另外一張表的同一個字段名
CONSTRAINT `FK_字段名` FOREIGN KEY (`字段名`) REFERENCES `另外一張表名` (`另外一張表字段名`)
設置非空:
NOT NULL
自增:
AUTO_INCREMENT
備注:
COMMENT `備注信息`
默認值:
DEFAULT '默認值'
設置索引:
ENGINE=InnoD
設置默認字符編碼 :
DEFAULT CHARSET=utf8
修改表名 :
ALTER TABLE 舊表名 RENAME AS 新表名
添加字段 :
ALTER TABLE 表名 ADD字段名 列屬性[屬性]
修改字段 :
ALTER TABLE 表名 MODIFY 字段名 列類型[屬性]
ALTER TABLE 表名 CHANGE 舊字段名 新字段名 列屬性[屬性]
刪除字段 :
ALTER TABLE 表名 DROP 字段名
刪除表語法:
DROP TABLE [IF EXISTS] 表名
添加數據
INSERT命令
語法:
INSERT
INTO <表名>[(<字段1>,<字段2>,<字段3>,...)]
VALUES('值1','值2','值3')
實例一:
INSERT
INTO Student(Sno,Sname,Ssex,Sdept,Sage)
VALUES(1001,'張三','男','信息工程',18)
實例二:
INSERT
INTO Student(Sno,Sname,Ssex,Sdept,Sage)
VALUES(1001,'張三','男','信息工程',18),(1002,'李四','男','信息工程',19)
刪除數據
DELETE命令
TRUNCATE命令
作用:用于完全清空表數據 , 但表結構 , 索引 , 約束等不變 ;
語法:
DELETE
FROM <表名>
[WHERE <條件>];
實例:
DELETE
FROM Student
WHERE Sno = 10001;
修改數據
update命令
語法:
UPDATE <表名>
SET <列名>=<表達式> [, <列名>=<表達式>,]...
[WHERE <條件>];
實例一:
UPDATE Student
SET Sdept = `計算機`,Sage = 23
WHERE Sno = 1001
實例二:多條件
UPDATE Student
SET Sdept = `計算機`,Sage = 23
WHERE Sname = `張三` and Ssex = `男`
where條件語句:
運算符 | 含義 | 用法 |
= | 等于 | Sage = 18 |
<> 或 != | 不等于 | Sage != 0 |
> | 大于 | Sage > 1 |
< | 小于 | Sage < 100 |
>= | 大于或等于 | Sage >= 1 |
<= | 小于或等于 | Sage <= 100 |
Sage <= 100 | 在某個范圍之間 | BETWEEN 1 AND 100 |
AND | 并且 | Sage >0 AND Sage<101 |
OR | 或 | Sage > 0 OR Sage < 101 |
查詢數據
select命令
簡單語法:
select * from Student --查詢所有學生信息
指定字段查詢:
select Sno,Sname from Student --查詢學生表的學號和姓名
別名:可以給….. 字段起別名;也可以給 ….表起別名
selcet Sno as 學號,Sname as 名字 from Student
函數Concat(<字符串>,<列表名>):拼接字符串
select CONCAT('姓名:',Sname) from Student --查詢結果 姓名:張三
DISTINCT 去重:去除重復數據
-- # 查看哪些同學參加了考試(學號) 去除重復項
SELECT * FROM result; -- 查看考試成績
SELECT studentno FROM result; -- 查看哪些同學參加了考試
SELECT DISTINCT studentno FROM result; -- 了解:DISTINCT 去除重復項 , (默認是ALL)
where條件語句
操作符名稱 | 語法 | 描述 |
AND 或 && | a AND b 或 a && b | 邏輯與,同時為真結果才為真 |
OR | a OR b | 邏輯或,只要一個為真,則結果為真 |
NOT 或 ! | NOT a 或 !a | 邏輯非,若操作數為假,則結果為真! |
實例:
-- 查詢考試成績在95-100之間的
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult>=95 AND StudentResult<=100;
SELECT Studentno,StudentResult
FROM result
WHERE StudentResult BETWEEN 95 AND 100;
-- 除了1000號同學,要其他同學的成績
SELECT studentno,studentresult
FROM result
WHERE studentno!=1000;
-- 使用NOT
SELECT studentno,studentresult
FROM result
WHERE NOT studentno=1000;
模糊查詢 : 比較操作符
操作符名稱 | 操作符名稱 | 描述 |
IS NULL | a IS NULL | 若操作符為NULL,則結果為真 |
IS NOT NULL | a IS NOT NULL | 若操作符不為NULL,則結果為真 |
BETWEEN | a BETWEEN b AND c | 若 a 范圍在 b 與 c 之間,則結果為真 |
LIKE | a LIKE b | SQL 模式匹配,若a匹配b,則結果為真 |
IN | a IN (a1,a2,a3,……) | ) 若 a 等于 a1,a2….. 中的某一個,則結果為真 |
實例:
<spna style=”margin: 0px; padding: 0px; color: rgb(255, 0, 0);”>LIKE的運用</spna>
-- 查詢姓張的同學的學號及姓名
-- like結合使用的通配符 : % (代表0到任意個字符) _ (一個字符)
SELECT Sno,Sname FROM Student
WHERE Sname LIKE '張%';
-- 查詢姓張的同學,后面只有一個字的
SELECT Sno,Sname FROM Student
WHERE studentname LIKE '張_';
-- 查詢姓張的同學,后面只有兩個字的
SELECT Sno,Sname FROM Student
WHERE Sname LIKE '張__';
IN的運用
-- 查詢學號為1000,1001,1002的學生姓名
SELECT Sno,Sname FROM Student
WHERE Sno IN (1000,1001,1002);
-- 查詢地址在廣州,深圳的學生
SELECT Sno,Sname,address FROM Student
WHERE address IN ('廣州','深圳');
NULL的運用
-- 查詢出生日期沒有填寫的同學
SELECT Sname FROM Student
WHERE BornDate IS NULL;
-- 查詢出生日期填寫的同學
SELECT Sname FROM Student
WHERE BornDate IS NOT NULL;
-- 查詢沒有寫家庭住址的同學(空字符串不等于null)
SELECT Sname FROM Student
WHERE Address='' OR Address IS NULL;
多表查詢
JOIN連接:
操作符名稱 | 描述 |
INNER JOIN | 兩個表之間交集 |
LEFT JOIN | 兩個表之間交集,并向左表拼接 |
RIGHT JOIN | 兩個表之間交集,并向右表拼接 |
內連接 inner join
查詢兩個表中的結果集中的交集
外連接 outer join
查詢兩個表中的結果集中的并集
左外連接 left join
以左表作為基準,右邊表來一一匹配,匹配不上的,返回左表的記錄,右表以NULL填充
右外連接 right join
以右表作為基準,左邊表來一一匹配,匹配不上的,返回右表的記錄,左表以NULL填充
— 查詢參加了考試的同學信息(學號,學生姓名,科目編號,分數)
–Student表(學號,學生姓名)和result表(學生姓名,科目編號,分數)
SELECT s.Sno,Sname,subjectno,StudentResult
FROM Student s
INNER JOIN result r
ON r.Sno = s.Sno
-- 右連接(也可實現)
SELECT s.Sno,Sname,subjectno,StudentResult
FROM student s
RIGHT JOIN result r
ON r.Sno = s.Sno
-- 等值連接
SELECT s.Sno,Sname,subjectno,StudentResult
FROM Student s , result r
WHERE r.Sno = s.Sno
-- 左連接 (查詢了所有同學,不考試的也會查出來)
SELECT s.Sno,Sname,subjectno,StudentResult
FROM Student s
LEFT JOIN result r
ON r.Sno = s.Sno
-- 查一下缺考的同學(左連接應用場景)
SELECT s.Sno,Sname,subjectno,StudentResult
FROM Student s
LEFT JOIN result r
ON r.Sno = s.Sno
WHERE StudentResult IS NULL
-- 思考題:查詢參加了考試的同學信息(學號,學生姓名,科目名,分數)
SELECT s.Sno,Sname,Sname,StudentResult
FROM Student s
INNER JOIN result r
ON r.Sno = s.Sno
INNER JOIN `subject` sub
ON sub.Sno = r.Sno
自連接查詢
-- 創建一個表
CREATE TABLE `category` (
`categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主題id',
`pid` INT(10) NOT NULL COMMENT '父id',
`categoryName` VARCHAR(50) NOT NULL COMMENT '主題名字',
PRIMARY KEY (`categoryid`)
) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
-- 插入數據
INSERT INTO `category` (`categoryid`, `pid`, `categoryName`)
VALUES('2','1','信息技術'),
('3','1','軟件開發'),
('4','3','數據庫'),
('5','1','美術設計'),
('6','3','web開發'),
('7','5','ps技術'),
('8','2','辦公信息');
實例操作:
-- 編寫SQL語句,將欄目的父子關系呈現出來 (父欄目名稱,子欄目名稱)
-- 核心思想:把一張表看成兩張一模一樣的表,然后將這兩張表連接查詢(自連接)
SELECT a.categoryName AS '父欄目',b.categoryName AS '子欄目'
FROM category AS a,category AS b
WHERE a.`categoryid`=b.`pid`
-- 思考題:查詢參加了考試的同學信息(學號,學生姓名,科目名,分數)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON sub.subjectno = r.subjectno
-- 查詢學員及所屬的年級(學號,學生姓名,年級名)
SELECT studentno AS 學號,studentname AS 學生姓名,gradename AS 年級名稱
FROM student s
INNER JOIN grade g
ON s.`GradeId` = g.`GradeID`
-- 查詢科目及所屬的年級(科目名稱,年級名稱)
SELECT subjectname AS 科目名稱,gradename AS 年級名稱
FROM SUBJECT sub
INNER JOIN grade g
ON sub.gradeid = g.gradeid
-- 查詢 數據庫結構-1 的所有考試結果(學號 學生姓名 科目名稱 成績)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='數據庫結構-1'
子查詢
什么是子查詢?
在查詢語句中的WHERE條件子句中,又嵌套了另一個查詢語句
嵌套查詢可由多個子查詢組成,求解的方式是由里及外;
子查詢返回的結果一般都是集合,故而建議使用IN關鍵字;
操作實例:
-- 查詢 數據庫結構-1 的所有考試結果(學號,科目編號,成績),并且成績降序排列
-- 方法一:使用連接查詢
SELECT studentno,r.subjectno,StudentResult
FROM result r
INNER JOIN `subject` sub
ON r.`SubjectNo`=sub.`SubjectNo`
WHERE subjectname = '數據庫結構-1'
ORDER BY studentresult DESC;
-- 方法二:使用子查詢(執行順序:由里及外)
SELECT studentno,subjectno,StudentResult
FROM result
WHERE subjectno=(
SELECT subjectno FROM `subject`
WHERE subjectname = '數據庫結構-1'
)
ORDER BY studentresult DESC;
-- 查詢課程為 高等數學-2 且分數不小于80分的學生的學號和姓名
-- 方法一:使用連接查詢
SELECT s.studentno,studentname
FROM student s
INNER JOIN result r
ON s.`StudentNo` = r.`StudentNo`
INNER JOIN `subject` sub
ON sub.`SubjectNo` = r.`SubjectNo`
WHERE subjectname = '高等數學-2' AND StudentResult>=80
-- 方法二:使用連接查詢+子查詢
-- 分數不小于80分的學生的學號和姓名
SELECT r.studentno,studentname FROM student s
INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
WHERE StudentResult>=80
-- 方法三:使用子查詢
-- 分步寫簡單sql語句,然后將其嵌套起來
SELECT studentno,studentname FROM student WHERE studentno IN(
SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=(
SELECT subjectno FROM `subject` WHERE subjectname = '高等數學-2'
)
)
常用函數
數據函數:
SELECT ABS(-8); /*絕對值*/
SELECT CEILING(9.4); /*向上取整*/
SELECT FLOOR(9.4); /*向下取整*/
SELECT RAND(); /*隨機數,返回一個0-1之間的隨機數*/
SELECT SIGN(0); /*符號函數: 負數返回-1,正數返回1,0返回0*/
字符串函數:
SELECT CHAR_LENGTH('我在學Mysql'); /*返回字符串包含的字符數*/
SELECT CONCAT('我','愛','程序'); /*合并字符串,參數可以有多個*/
SELECT INSERT('我愛編程helloworld',1,2,'超級熱愛'); /*替換字符串,從某個位置開始替
換某個長度*/
SELECT LOWER('Study'); /*小寫*/
SELECT UPPER('Study'); /*大寫*/
SELECT LEFT('hello,world',5); /*從左邊截取*/
SELECT RIGHT('hello,world',5); /*從右邊截取*/
SELECT REPLACE('堅持就能成功','堅持','努力'); /*替換字符串*/
SELECT SUBSTR('堅持就能成功',4,6); /*截取字符串,開始和長度*/
SELECT REVERSE('堅持就能成功'); /*反轉
-- 查詢姓周的同學,改成鄒
SELECT REPLACE(studentname,'周','鄒') AS 新名字
FROM student WHERE studentname LIKE '周%';
日期和時間函數:
SELECT CURRENT_DATE(); /*獲取當前日期*/
SELECT CURDATE(); /*獲取當前日期*/
SELECT NOW(); /*獲取當前日期和時間*/
SELECT LOCALTIME(); /*獲取當前日期和時間*/
SELECT SYSDATE(); /*獲取當前日期和時間*/
-- 獲取年月日,時分秒
SELECT YEAR(NOW());
SELECT MONTH(NOW());
SELECT DAY(NOW());
SELECT HOUR(NOW());
SELECT MINUTE(NOW());
SELECT SECOND(NOW());
聚合函數
函數名稱 | 描述 |
COUNT() | 返回滿足Select條件的記錄總和數,如 select count(*) 【不建議使用 *,效率低】 |
SUM() | 返回數字字段或表達式列作統計,返回一列的總和。 |
AVG() | 通常為數值字段或表達列作統計,返回一列的平均值 |
MAX() | 可以為數值字段,字符字段或表達式列作統計,返回最大的值。 |
MIN() | 可以為數值字段,字符字段或表達式列作統計,返回最小的值。 |
實例:
-- 查詢不同課程的平均分,最高分,最低分
-- 前提:根據不同的課程進行分組
SELECT subjectname,AVG(studentresult) AS 平均分,MAX(StudentResult) AS 最高
分,MIN(StudentResult) AS 最低分
FROM result AS r
INNER JOIN `subject` AS s
ON r.subjectno = s.subjectno
GROUP BY r.subjectno
HAVING 平均分>80;
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。