Database_数据库基础笔记整理
Database_數據庫基礎:
1. 基礎SQL語句
1.1 向'成員列表'中新增一個'用戶名為 'test','真實姓名'為'測試賬戶','性別' 為 '女'的記錄
INSERT INTO sys_user (account,realname,gender) VALUE ('test','測試用戶','f');1.2 查詢'成員列表'頁面中總共有多少條記錄?
SELECT COUNT(*) FROM sys_user;1.3 查詢'成員列表'中前3條記錄?
SELECT * FROM sys_user LIMIT 3;1.4 查詢'成員列表'中第2條記錄?
SELECT * FROM sys_user LIMIT 1,1;1.5 按照'成員列表'中'編號'的降序排序,顯示所有的記錄信息
SELECT * FROM sys_user ORDER BY id DESC;1.6 查詢'成員列表'中'用戶名'為'test'的記錄信息,只需要顯示'編號','用戶名','真實姓名'字段信息
SELECT id,account,realname FROM sys_user WHERE account = 'test';1.7 查詢'成員列表'中'用戶名'為'hello',并且"性別"為女的記錄
SELECT * FROM sys_user WHERE account='hello' AND gender='f';1.8 查詢'成員列表'中'真實姓名'姓'張'的所有成員的"真實姓名"和"性別"
SELECT realname,gender FROM sys_user WHERE realname LIKE '張%';?1.9 隨意構造一張符合要求的表,編寫SQL語句:按照部門編號升序方式顯示,查詢每個部門的平均身高,部門"Market"不用查詢
-- * 代表所有的字段 -- select后跟的是字段名; from后跟的是表名 SELECT * FROM sys_user ;-- 查詢XXXX‘成員列表’中所有的‘編號’ SELECT id FROM sys_user ;-- 查詢XXXX‘成員列表’中所有的‘編號’,'真實姓名' SELECT id,realname FROM sys_user ;-- 創建數據庫 CREATE DATABASE b ;-- 創建表 USE a ; CREATE TABLE c1( id INT(4), NAME CHAR(20), age INT(3));-- 查看表結構 DESC c1 ;-- 查詢 SELECT * FROM c1 ;-- 插入數據 INSERT INTO c1 VALUE ('1','zhangsan','18'); INSERT INTO c1(id,NAME) VALUE ('2','lisi');-- 增、刪、改、查 -- 改 UPDATE c1 SET NAME = 'zhangsanfeng' WHERE id = '1' ; UPDATE c1 SET NAME = 'wangwu',age = '20' WHERE NAME = 'lisi' ;-- 刪除 DELETE FROM c1 WHERE id = '2' ;-- 清空表數據 TRUNCATE c1 ;-- 去重 SELECT DISTINCT * FROM c1 ;-- 給表c1添加主鍵(設置id為主鍵) -- 主鍵是唯一的,不能重復 ALTER TABLE c1 ADD PRIMARY KEY(id) ; DESC c1 ;-- 查詢XXXX’成員列表‘前3條記錄 SELECT * FROM sys_user LIMIT 3; SELECT * FROM sys_user LIMIT 0,3;-- 查詢XXXX’成員列表‘第2條和第3條記錄 SELECT * FROM sys_user LIMIT 1,2;-- 查詢’編號‘為1,并且’用戶名‘為'admin'的記錄 SELECT * FROM sys_user WHERE id = '1' AND account = 'admin' ;-- 查詢’編號‘為1的記錄 和 ‘用戶名’為'zhangsan'的記錄 SELECT * FROM sys_user WHERE id = '1' OR account = 'zhangsan' ;-- 將‘編號’為1,2,3的記錄都查詢出來 SELECT * FROM sys_user WHERE id = '1' OR id = '2' OR id = '3' ; SELECT * FROM sys_user WHERE id IN ('1','2','3') ;-- 將‘編號’除了1,2,3以外的所有記錄都查詢出來 SELECT * FROM sys_user WHERE id NOT IN ('1','2','3') ;-- 查詢‘編號’大于1,小于500的所有記錄 SELECT * FROM sys_user WHERE id > 1 AND id < 500 ;-- 查詢‘編號’大于等于10,小于等于500的所有記錄 SELECT * FROM sys_user WHERE id >= 1AND id <= 500 ;-- between .. and .. SELECT * FROM sys_user WHERE id BETWEEN 1 AND 500 ;-- 將‘真實姓名’姓‘張’的所有記錄都查詢出來 -- 模糊查詢 SELECT * FROM sys_user WHERE realname LIKE '張%' ;-- 將‘真實姓名’姓‘張*’的所有記錄都查詢出來 -- _ 代表1個 SELECT * FROM sys_user WHERE realname LIKE '張_' ;-- 按照’編號‘降序方式顯示’成員列表‘中所有的記錄 -- order by 排序 -- desc 降序 -- asc 升序,默認就是升序,可以不用寫 -- 創建表USE a;CREATE TABLE c4(id INT(4),market CHAR(20),heigh INT(8));INSERT INTO c4 (id,market,heigh) VALUE ('23','a','167');INSERT INTO c4 (id,market,heigh) VALUE ('34','a','162');INSERT INTO c4 (id,market,heigh) VALUE ('13','b','187');INSERT INTO c4 (id,market,heigh) VALUE ('42','b','176');SELECT * FROM c4;SELECT AVG(heigh) FROM c4 GROUP BY market; -- 查詢表中所有的數據(中間有空格)/*多行注釋,*代表所有的字段*/SELECT * FROM sys_user;SELECT id FROM sys_user;SELECT PASSWORD FROM sys_user;SELECT dept FROM sys_user;SELECT realname FROM sys_user;-- 創建數據庫CREATE DATABASE A;CREATE DATABASE b;-- 創建表USE a;CREATE TABLE c1(id INT(4),NAME CHAR(20),age INT(3));-- 查看表結構DESC c1;SELECT * FROM c1; -- 查詢INSERT INTO c1 (id,NAME) VALUE ('2','lisi'); -- 插入數據INSERT INTO c1 (id,NAME) VALUE ('3','lisi-1'); -- 插入數據INSERT INTO c1 (id,NAME) VALUE ('4','lisi-2'); -- 插入數據INSERT INTO c1 (id,NAME) VALUE ('5','lisi-3'); -- 插入數據-- 增、刪、改、查UPDATE c1 SET NAME = 'zhangsan' WHERE id ='1';UPDATE c1 SET NAME = 'lixiaosi',age='20' WHERE id ='2';DELETE FROM c1 WHERE id = '2';-- 清空表數據TRUNCATE c1;SELECT * FROM c1; -- 查詢-- 去重SELECT DISTINCT * FROM c1;-- 創建表 添加主鍵USE a;CREATE TABLE c2(id INT(4),NAME CHAR(20),age INT(3));-- 給表2添加主鍵 將ID設置為主鍵ALTER TABLE c2 ADD PRIMARY KEY(id);INSERT INTO c2 (id,NAME) VALUE ('3','lisi-3'); -- 插入數據INSERT INTO c2 (id,NAME) VALUE ('4','lisi-4'); -- 插入數據INSERT INTO c2 (id,NAME) VALUE ('5','lisi-5'); -- 插入數據INSERT INTO c2 (id,NAME) VALUE ('6','lisi-6'); -- 插入數據INSERT INTO c2 (id,NAME) VALUE ('7','lisi-7'); -- 插入數據INSERT INTO c2 (id,NAME) VALUE ('8','lisi-8'); -- 插入數據SELECT * FROM c2;USE ranzhi;-- select * from sys_user where id =1 or id =2 or id=3;SELECT * FROM sys_user LIMIT 3; -- 顯示前三行SELECT * FROM sys_user LIMIT 1,2; -- 顯示第二行,第三行SELECT * FROM sys_user;SELECT * FROM sys_user WHERE id='1' AND account ='ranzhi';SELECT * FROM sys_user WHERE id='1' OR account ='lisansan';SELECT * FROM sys_user WHERE id='1' OR id='2' OR id='3';SELECT * FROM sys_user WHERE id IN('1','2');SELECT * FROM sys_user WHERE id IN('1','2','3');SELECT * FROM sys_user WHERE id >'1' AND id <'4';SELECT * FROM sys_user WHERE id >='1' AND id <='4';SELECT * FROM sys_user WHERE id BETWEEN 1 AND 4;SELECT * FROM sys_user WHERE id NOT IN('1','2');SELECT * FROM sys_user;SELECT * FROM sys_user WHERE realname LIKE '李%'; -- 模糊查詢SELECT * FROM sys_user WHERE realname LIKE '李_';SELECT * FROM sys_user ORDER BY id DESC; -- 降序SELECT * FROM sys_user ORDER BY id ASC; ?-- 升序SELECT * FROM sys_user ORDER BY realname DESC;-- 幾個常用的函數-- 查詢列表中總共有多少條記錄SELECT COUNT(*) FROM sys_user;-- 求和-- 查詢成員列表中所有編號之和SELECT SUM(id) FROM sys_user;SELECT MAX(id) FROM sys_user; -- 最大值SELECT MIN(id) FROM sys_user; -- 最小值SELECT AVG(id) FROM sys_user; -- 平均值USE a;CREATE TABLE c3(id INT(4),NAME CHAR(200),score INT(8))SELECT * FROM c3; -- 查詢INSERT INTO c3 VALUE ('1','zhangsan','39'); -- 插入數據INSERT INTO c3 VALUE ('1','zhangsan','40'); -- 插入數據INSERT INTO c3 VALUE ('1','zhangsan','60'); -- 插入數據INSERT INTO c3 VALUE ('2','lisi','44'); -- 插入數據INSERT INTO c3 VALUE ('2','lisi','58'); -- 插入數據INSERT INTO c3 VALUE ('2','lisi','50'); -- 插入數據SELECT DISTINCT NAME FROM c3; -- 去重SELECT NAME,SUM(score) FROM c3 WHERE NAME = 'zhangsan';SELECT NAME,SUM(score) FROM c3 GROUP BY id; -- 分組SELECT id,NAME,SUM(score) FROM c3 WHERE NAME = 'lisi';SELECT id,NAME,SUM(score) FROM c3 WHERE NAME = 'zhangsan';SELECT NAME,SUM(score) FROM c3 GROUP BY id HAVING NAME = 'lisi';SELECT id,SUM(score) FROM c3 GROUP BY id HAVING id = '1';SELECT * FROM sys_user;-- DELETE FROM sys_user WHERE id = '5';INSERT INTO sys_user (account,realname,gender) VALUE ('test','測試用戶','f'); -- 插入數據INSERT INTO sys_user (account,realname,gender) VALUE ('hello','測試用戶','f'); -- 插入數據SELECT COUNT(*) FROM sys_user;SELECT * FROM sys_user LIMIT 3; -- 顯示前三行SELECT * FROM sys_user LIMIT 1,1;SELECT * FROM sys_user ORDER BY id DESC; -- 降序SELECT id,account,realname FROM sys_user WHERE account = 'test';SELECT * FROM sys_user WHERE account='hello' AND gender='f';SELECT realname,gender FROM sys_user WHERE realname LIKE '李%';-- 創建表USE a;CREATE TABLE c4(id INT(4),market CHAR(20),heigh INT(8));INSERT INTO c4 (id,market,heigh) VALUE ('23','a','167');INSERT INTO c4 (id,market,heigh) VALUE ('34','a','162');INSERT INTO c4 (id,market,heigh) VALUE ('13','b','187');INSERT INTO c4 (id,market,heigh) VALUE ('42','b','176');SELECT * FROM c4;SELECT AVG(heigh) FROM c4 GROUP BY market;/*DELETE FROM c4 WHERE id = '23';DELETE FROM c4 WHERE id = '34';DELETE FROM c4 WHERE id = '13';DELETE FROM c4 WHERE id = '42';*/SELECT * FROM sys_user ORDER BY id DESC ;SELECT * FROM sys_user ORDER BY id ASC;-- 分組SELECT NAME, SUM(score) FROM c2 GROUP BY id ;-- Q: ?查詢’zhangsan'這個人的‘編號’及總成績SELECT id, SUM(score) FROM c2 WHERE NAME = 'zhangsan' ;SELECT NAME, SUM(score) FROM c2 GROUP BY id HAVING NAME = 'zhangsan';2. 優化查詢速率
2.1 避免全表掃描,請勿使用*號,以防返回大量的數據;
2.2 避免使用!=或<>操作符在where子句中,避免全表掃描:
2.3?請勿在where子句中將表達式或函數放在比較符號的左側,以防全表掃描;
例:xx where score + 10 > 60;
優化:xx where score > 60 – 10;
2.4 使用limit限制查詢返回的數據行數,限制不需要的數據;
2.5 使用between、exists、not exists代替in或not in,同時避免系統無法使用索引;
? ? ? 推薦使用join代替子查詢;
例:xx where score in (60,99);
優化:xx where score between 60 and 99;
2.6 使用union或union all代替or;
例:xx where score = 60 or score = 99;
優化:xx where score = 60 union xx where score = 99;
3. 多表查詢
-- dept(dept_id,dept_name,employ_name,employ_sg) select dept_name,avg(employ_sg) from dept where employ_name <> 'Market' group by employ_name order by dept_id asc; select dept_name,avg(employ_sg) from dept group by employ_name having employ_name <> 'Market' order by dept_id asc;4. 牛刀小試
4.1 創建表數據
use test;CREATE TABLE test.Student(Sid VARCHAR(10),Sname VARCHAR(10),Sage DATETIME,Ssex NVARCHAR(10));INSERT INTO Student VALUES('01' , '趙雷' , '1990-01-01' , '男');INSERT INTO Student VALUES('02' , '錢電' , '1990-12-21' , '男');INSERT INTO Student VALUES('03' , '孫風' , '1990-05-20' , '男');INSERT INTO Student VALUES('04' , '李云' , '1990-08-06' , '男');INSERT INTO Student VALUES('05' , '孫風' , '1991-12-01' , '男');INSERT INTO Student VALUES('06' , '吳蘭' , '1992-03-01' , '女');INSERT INTO Student VALUES('07' , '鄭竹' , '1989-07-01' , '女');INSERT INTO Student VALUES('08' , '王菊' , '1990-01-20' , '女');CREATE TABLE test.Course(Cid VARCHAR(10),Cname VARCHAR(10),Tid VARCHAR(10));INSERT INTO Course VALUES('01' , '語文' , '02');INSERT INTO Course VALUES('02' , '數學' , '01');INSERT INTO Course VALUES('03' , '英語' , '03');CREATE TABLE test.Teacher(Tid VARCHAR(10),Tname VARCHAR(10));INSERT INTO Teacher VALUES('01' , '張三');INSERT INTO Teacher VALUES('02' , '李四');INSERT INTO Teacher VALUES('03' , '王五');CREATE TABLE test.SC(Sid VARCHAR(10),Cid VARCHAR(10),score DECIMAL(18,1));INSERT INTO SC VALUES('01' , '01' , 80);INSERT INTO SC VALUES('01' , '02' , 90);INSERT INTO SC VALUES('01' , '03' , 99);INSERT INTO SC VALUES('02' , '01' , 70);INSERT INTO SC VALUES('02' , '02' , 60);INSERT INTO SC VALUES('02' , '03' , 80);INSERT INTO SC VALUES('03' , '01' , 80);INSERT INTO SC VALUES('03' , '02' , 80);INSERT INTO SC VALUES('03' , '03' , 80);INSERT INTO SC VALUES('04' , '01' , 50);INSERT INTO SC VALUES('04' , '02' , 30);INSERT INTO SC VALUES('04' , '03' , 20);INSERT INTO SC VALUES('05' , '01' , 76);INSERT INTO SC VALUES('05' , '02' , 87);INSERT INTO SC VALUES('06' , '01' , 31);INSERT INTO SC VALUES('06' , '03' , 34);INSERT INTO SC VALUES('07' , '02' , 89);INSERT INTO SC VALUES('07' , '03' , 98);4.2 題目
4.2.1 查詢姓“張”的老師的個數;
SELECT COUNT(*) FROM teacher WHERE Tname LIKE '張%';4.2.2 查詢男生、女生人數;
SELECT COUNT(*) AS 男 FROM Student WHERE Ssex='男';SELECT COUNT(*) AS 女 FROM Student WHERE Ssex='女';4.2.3 查詢所有同學的學號、姓名、選課數、總成績;
SELECT Student.Sid AS 學號,Student.Sname AS 姓名,COUNT(sc.Cid) AS 選課數, SUM(sc.score) AS 總成績 FROM Student LEFT JOIN sc ON Student.Sid=sc.Sid GROUP BY Student.Sid;?
?
4.2.4 查詢平均成績大于60 分的同學的學號和平均成績;
SELECT * FROM (SELECT Student.Sid AS 學號,AVG(sc.score) AS 平均成績 FROM Student LEFT JOIN sc ON Student.Sid=sc.Sid GROUP BY Student.Sid)cc WHERE cc.平均成績>60;?
5. 部分問答
5.1 觸發器的作用?
答:觸發器是一種特殊的存儲過程,主要是通過事件來觸發而被執行的。它可以強化約束,來維護數據的完整性和一致性,可以跟蹤數據庫內的操作從而不允許未經許可的更新和變化。可以聯級運算。如,某表上的觸發器上包含對另一個表的數據操作,而該操作又會導致該表觸發器被觸發。
5.2 什么是存儲過程?用什么來調用?
答:存儲過程是一個預編譯的SQL語句,優點是允許模塊化的設計,就是說只需創建一次,以后在該程序中就可以調用多次。如果某次操作需要執行多次SQL,使用存儲過程比單純SQL語句執行要快。可以用一個命令對象來調用存儲過程。
5.3 索引的作用?和它的優點缺點是什么?
答:索引就一種特殊的查詢表,數據庫的搜索引擎可以利用它加速對數據的檢索。它很類似與現實生活中書的目錄,不需要查詢整本書內容就可以找到想要的數據。索引可以是唯一的,創建索引允許指定單個列或者是多個列。缺點是它減慢了數據錄入的速度,同時也增加了數據庫的尺寸大小。
5.4 什么是內存泄漏?
答:一般我們所說的內存泄漏指的是堆內存的泄漏。堆內存是程序從堆中為其分配的,大小任意的,使用完后要顯示釋放內存。當應用程序用關鍵字new等創建對象時,就從堆中為它分配一塊內存,使用完后程序調用free或者delete釋放該內存,否則就說該內存就不能被使用,我們就說該內存被泄漏了。
5.5 維護數據庫的完整性和一致性,你喜歡用觸發器還是自寫業務邏輯?為什么?
答:我是這樣做的,盡可能使用約束,如check,主鍵,外鍵,非空字段等來約束,這樣做效率最高,也最方便。其次是使用觸發器,這種方法可以保證,無論什么業務系統訪問數據庫都可以保證數據的完整性和一致性。最后考慮的是自寫業務邏輯,但這樣做麻煩,編程復雜,效率低下。
5.6 什么是事務?什么是鎖?
答:事務就是被綁定在一起作為一個邏輯工作單元的SQL語句分組,如果任何一個語句操作失敗那么整個操作就被失敗,以后操作就會回滾到操作前狀態,或者是上有個節點。為了確保要么執行,要么不執行,就可以使用事務。要將有組語句作為事務考慮,就需要通過ACID測試,即原子性,一致性,隔離性和持久性。
鎖:在數據庫管理系統(Database Management System)中,鎖是實現事務的關鍵,鎖可以保證事務的完整性和并發性。與現實生活中鎖一樣,它可以使某些數據的擁有者,在某段時間內不能使用某些數據或數據結構。當然鎖還分級別的。
5.7 什么叫視圖?游標是什么?
答:視圖是一種虛擬的表,具有和物理表相同的功能。可以對視圖進行增,改,查,操作,試圖通常是有一個表或者多個表的行或列的子集。對視圖的修改不影響基本表。它使得我們獲取數據更容易,相比多表查詢。
游標:是對查詢出來的結果集作為一個單元來有效的處理。游標可以定在該單元中的特定行,從結果集的當前行檢索一行或多行。可以對結果集當前行做修改。一般不使用游標,但是需要逐條處理數據的時候,游標顯得十分重要。
總結
以上是生活随笔為你收集整理的Database_数据库基础笔记整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Arduino ESP8266通过 RF
- 下一篇: linux cmake编译源码,linu