日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库知识点汇总(最全!!)

發布時間:2023/12/31 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库知识点汇总(最全!!) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、數據庫概述
保存數據 的容器
SELECT sid AS ‘學生編號’ FROM yu;
數組
集合
文件

能否存儲大量文件?
查詢速度如何?是否方便?
共享是否方便?
安全性如何?
數據庫的好處
?實現數據持久化
?使用完整的管理系統統一管理,易于查詢
數據庫的概念
DB
數據庫(database):存儲數據的“倉庫”。它保存了一系列有組織的數據。
DBMS
數據庫管理系統(Database Management System)。數據庫是通過DBMS創建和操作的容器,常見的數據庫管理系統:MySQL、Oracle、DB2、SqlServer等
SQL
結構化查詢語言(Structure Query Language):專門用來與數據庫通信的語言。
二、SQL語言概述
SQL的優點:
1、不是某個特定數據庫供應商專有的語言,幾乎所有DBMS都支持SQL
2、簡單易學
3、雖然簡單,但實際上是一種強有力的語言,靈活使用其語言元素,可以進行非常復雜和高級的數據庫操作。
三、數據庫的特點
將數據放到表中,表再放到庫中
一個數據庫中可以有多個表,每個表都有一個的名字,用來標識自己。表名具有唯一性。
表具有一些特性,這些特性定義了數據在表中如何存儲,類似java中 “類”的設計。
表由列組成,我們也稱為字段。所有表都是由一個或多個列組成的,每一列類似java 中的”屬性”
表中的數據是按行存儲的,每一行類似于java中的“對象”。
四、SQL語言分類
1、DML(Data Manipulation Language):數據操縱語句,用于添加、刪除、修改、查詢數據庫記錄,并檢查數據完整性
2、DDL(Data Definition Language):數據定義語句,用于庫和表的創建、修改、刪除。
3、DCL(Data Control Language):數據控制語句,用于定義用戶的訪問權限和安全級別。
DML
DML用于查詢與修改數據記錄,包括如下SQL語句:
INSERT:添加數據到數據庫中
UPDATE:修改數據庫中的數據
DELETE:刪除數據庫中的數據
SELECT:選擇(查詢)數據
SELECT是SQL語言的基礎,最為重要。
DDL
DDL用于定義數據庫的結構,比如創建、修改或刪除數據庫對象,包括如下SQL語句:
CREATE TABLE:創建數據庫表
ALTER TABLE:更改表結構、添加、刪除、修改列長度
DROP TABLE:刪除表
CREATE INDEX:在表上建立索引
DROP INDEX:刪除索引
DCL
DCL用來控制數據庫的訪問,包括如下SQL語句:
GRANT:授予訪問權限
REVOKE:撤銷訪問權限
COMMIT:提交事務處理
ROLLBACK:事務處理回退
SAVEPOINT:設置保存點
LOCK:對數據庫的特定部分進行鎖定
五、mysql數據庫的安裝
圖解MySQL程序結構

MySQL產品的特點
MySQL數據庫隸屬于MySQL AB公司,總部位于瑞典,后被oracle收購。
– 成本低:開放源代碼,一般可以免費試用
– 性能高:執行很快
– 簡單:很容易安裝和使用
配置文件常用配置分析(重點)
安裝目錄下的my.ini文件
[mysqld] 服務端配置
port=3306 端口3306
basedir 是安裝目錄
datadir 數據文件目錄
character-set-server 服務端字符編碼
default-storage-engine 默認引擎
sql-mode 語法模式
max_connections 最大連接數
啟動和停止MySQL服務
方式一:通過計算機管理方式
右擊計算機—管理—服務—啟動或停止MySQL服務
方式二:通過命令行方式(右鍵管理員運行,否則沒有權限)
啟動:net start 服務名
停止:net stop 服務名
MySQL服務端的登錄和退出
通過mysql自帶客戶端

通過window是命令行登錄
mysql –h 主機名 –u用戶名 –p 密碼
mysql -h localhost -u root -p
輸入密碼:
退出
exit
六、MySql數據庫的使用
規范
不區分大小寫
每句話用;或\g結尾
各子句一般分行寫
關鍵字不能縮寫也不能分行
用縮進提高語句的可讀性
注釋
單行注釋 # 或 –
多行注釋 /* 注釋文本 */

示例

  • 進入 mysql, 在命令行中輸入: mysql –u root –p
  • 查看 mysql 中有哪些個數據庫: show databases;
  • 使用一個數據庫: use 數據庫名稱;
  • 新建一個數據庫: create database 數據庫名
  • 查看指定的數據庫中有哪些數據表: show tables;
    6.查看mysql版本
    登錄后select version();
    或退出重新登錄
    未登錄 mysql --version或mysql –V
  • 1.SHOW DATABASES;
    2.USE employee;
    3.SHOW TABLES ;
    4.DESC dept;
    七、圖形化界面客戶端的使用

    導入sql文件
    四張表的介紹

    八、基本 SELECT 語句
    SELECT *|{[DISTINCT] column|expression [alias],…}
    FROM table;
    ? SELECT 標識選擇哪些列。
    ? FROM 標識從哪個表中選擇。
    SELECT *
    FROM departments;
    選擇特定的列
    SELECT department_id, location_id
    FROM departments;

    注意
    ? SQL 語言大小寫不敏感。
    ? SQL 可以寫在一行或者多行
    ? 關鍵字不能被縮寫也不能分行
    ? 各子句一般要分行寫。
    ? 使用縮進提高語句的可讀性
    列的別名
    ? 重命名一個列。
    ? 便于計算。
    ? 緊跟列名,也可以在列名和別名之間加入關鍵字‘AS’,別名使用雙引號,以便在別名中包含空格或特殊的字符并區分大小寫。
    SELECT last_name AS name, commission_pct comm
    FROM employees;
    SELECT last_name “Name”, salary*12 “Annual Salary”
    FROM employees;

    字符串
    ? 字符串可以是 SELECT 列表中的一個字符,數字,日期。
    ? 日期和字符只能在單引號中出現。?
    顯示表結構
    使用 DESCRIBE 命令,表示表結構
    DESC[RIBE] tablename
    DESCRIBE employees
    九、過濾和排序數據
    過濾
    使用WHERE 子句,將不滿足條件的行過濾掉
    SELECT
    *|{[DISTINCT] column|expression [alias],…}
    FROM table
    [WHERE condition(s)];
    WHERE 子句緊隨 FROM 子句

    返回在 90號部門工作的所有員工的信息
    SELECT employee_id, last_name, job_id, department_id
    FROM employees
    WHERE department_id = 90 ;
    比較運算
    賦值使用 := 符號

    SELECT last_name, salary
    FROM employees
    WHERE salary <= 3000;
    其它比較運算(重點聽一下LIKE)

    BETWEEN
    使用 BETWEEN 運算來顯示在一個區間內的值
    SELECT last_name, salary
    FROM employees
    WHERE salary BETWEEN 2500 AND 3500;
    IN
    使用 IN運算顯示列表中的值。
    SELECT employee_id, last_name, salary, manager_id
    FROM employees
    WHERE manager_id IN (100, 101, 201);
    LIKE
    ?使用 LIKE 運算選擇類似的值
    ?選擇條件可以包含字符或數字:
    % 代表零個或多個字符(任意個字符)。
    _ 代表一個字符。
    SELECT first_name
    FROM employees
    WHERE first_name LIKE ‘S%’;

    ‘%’和‘-’可以同時使用
    SELECT last_name
    FROM employees
    WHERE last_name LIKE ‘_o%’; //最后的名字字母為o
    NULL
    使用 IS (NOT) NULL 判斷空值
    SELECT last_name, manager_id
    FROM employees
    WHERE manager_id IS NULL;
    邏輯運算

    AND
    AND 要求并的關系為真

    SELECT employee_id, last_name, job_id, salary
    FROM employees
    WHERE salary >=10000
    AND job_id LIKE ‘%MAN%’;
    OR
    OR 要求或關系為真。
    SELECT employee_id, last_name, job_id, salary
    FROM employees
    WHERE salary >= 10000
    OR job_id LIKE ‘%MAN%’;
    NOT
    SELECT last_name, job_id
    FROM employees
    WHERE job_id
    NOT IN (‘IT_PROG’, ‘ST_CLERK’, ‘SA_REP’);
    ORDER BY子句
    使用 ORDER BY 子句排序
    ASC(ascend): 升序
    DESC(descend): 降序
    ORDER BY 子句在SELECT語句的結尾。
    SELECT last_name, job_id, department_id, hire_date
    FROM employees
    ORDER BY hire_date ;
    降序排序
    SELECT last_name, job_id, department_id, hire_date
    FROM employees
    ORDER BY hire_date DESC ;
    按別名排序
    SELECT employee_id, last_name, salary*12 annsal
    FROM employees
    ORDER BY annsal;
    多個列排序
    按照ORDER BY 列表的順序排序
    SELECT last_name, department_id, salary
    FROM employees
    ORDER BY department_id, salary DESC;
    可以使用不在SELECT 列表中的列排序
    十、分組函數
    什么是分組函數
    分組函數作用于一組數據,并對一組數據返回一個值。
    組函數類型

    ? AVG()
    ? COUNT()
    ? MAX()
    ? MIN()
    ? SUM()
    組函數語法
    SELECT [column,] group_function(column), …
    FROM table
    [WHERE condition]
    [GROUP BY column]
    [ORDER BY column];
    AVG(平均值)和 SUM (合計)函數
    可以對數值型數據使用AVG 和 SUM 函數。
    SELECT AVG(salary), MAX(salary),
    MIN(salary), SUM(salary)
    FROM employees
    WHERE job_id LIKE ‘%REP%’;
    MIN(最小值)和 MAX(最大值)函數
    可以對任意數據類型的數據使用 MIN 和 MAX 函數。
    SELECT MIN(hire_date), MAX(hire_date)
    FROM employees;
    COUNT(計數)函數
    COUNT() 返回表中記錄總數,適用于任意數據類型。
    SELECT COUNT()
    FROM
    employees
    WHERE department_id = 50;

    COUNT(expr) 返回expr不為空的記錄總數
    SELECT COUNT(commission_pct)
    FROM employees
    WHERE department_id = 50;
    分組數據
    分組數據: GROUP BY 子句語法
    可以使用GROUP BY子句將表中的數據分成若干組
    SELECT column, group_function(column)
    FROM table
    [WHERE condition]
    [GROUP BY group_by_expression]
    [ORDER BY column];
    GROUP BY 子句 (?)
    在SELECT 列表中所有未包含在組函數中的列都應該包含在 GROUP BY 子句中
    SELECT department_id, AVG(salary)
    FROM employees
    GROUP BY department_id ;
    包含在 GROUP BY 子句中的列不必包含在SELECT 列表中
    SELECT AVG(salary)
    FROM employees
    GROUP BY department_id ;
    使用多個列分組
    SELECT department_id dept_id, job_id, SUM(salary)
    FROM employees
    GROUP BY department_id, job_id ;
    非法使用組函數
    ? 不能在 WHERE 子句中使用組函數。
    ? 可以在 HAVING 子句中使用組函數
    SELECT department_id, AVG(salary)
    FROM employees
    WHERE AVG(salary) > 8000
    GROUP BY department_id;

    WHERE 子句中不能使用組函數
    過濾分組
    使用 HAVING 過濾分組:

  • 行已經被分組。
  • 使用了組函數。
  • 滿足HAVING 子句中條件的分組將被顯示。
    SELECT column, group_function
    FROM table
    [WHERE condition]
    [GROUP BY group_by_expression]
    [HAVING group_condition]
    [ORDER BY column];
  • HAVING 子句
    SELECT department_id, MAX(salary)
    FROM employees
    GROUP BY department_id
    HAVING MAX(salary)>10000 ;
    十一、多表查詢

    笛卡爾集

    select name,boyName from beauty,boys; 這條語句對嗎?
    為了避免笛卡爾集, 可以在 WHERE 加入有 效的連接條件

    Mysql 連接
    使用連接在多個表中查詢數據
    SELECT table1.column, table2.column
    FROM table1, table2
    WHERE table1.column1 = table2.column2;
    在 WHERE 子句中寫入連接條件。
    在表中有相同列時,在列名之前加上表名前綴
    等值連接

    SELECT beauty.id,NAME,boyname FROM beauty ,boys
    WHERE beauty.boyfriend_id=boys.id;
    區分重復的列名
    ? 使用表名前綴在多個表中區分相同的列。
    ? 在不同表中具有相同列名的列可以用表的別名加以區分。
    ? 如果使用了表別名,則在select語句中需要使用表別名代替表名
    ? 表別名最多支持32個字符長度,但建議越少越好
    表的別名
    ? 使用別名可以簡化查詢。
    ? 使用表名前綴可以提高執行效率。
    SELECT bt.id,NAME,boyname
    FROM beauty bt,boys b;
    WHERE bt.boyfriend_id=b.id ;
    Join連接
    ? 分類:
    – 內連接 [inner] join on
    – 外連接
    ? 左外連接 left [outer] join on
    ? 右外連接 right [outer] join on
    ON 子句
    SELECT bt.id,NAME,boyname
    FROM beauty bt
    Inner join boys b
    On bt.boyfriend_id=b.id ;
    連接多個表
    連接 n個表,至少需要 n-1個連接條件。
    例如:連接三個表,至少需要兩個連接條件。
    練習:查詢出公司員工的 last_name, department_name, city
    使用 ON 子句創建多表連接(重點)
    SELECT employee_id, city, department_name
    FROM employees e
    JOIN departments d
    ON d.department_id = e.department_id
    JOIN locations l
    ON d.location_id = l.location_id;
    John連接總結

    十二、字符函數

    大小寫控制函數
    這類函數改變字符的大小寫。
    LOWER(‘SQL Course’)
    sql course

    UPPER(‘SQL Course’)
    SQL COURSE

    字符控制函數
    CONCAT(‘Hello’, ‘World’)
    HelloWorld

    SUBSTR(‘HelloWorld’,1,5)
    Hello

    LENGTH(‘HelloWorld’)
    10

    INSTR(‘HelloWorld’, ‘W’)
    6

    LPAD(salary,10,’*’)
    *****24000

    RPAD(salary, 10, ‘*’)
    24000*****

    TRIM(‘H’ FROM ‘HelloWorld’)
    elloWorld

    REPLACE(‘abcd’,‘b’,‘m’)
    amcd
    十三、數字函數
    ROUND: 四舍五入
    ROUND(45.926, 2) 45.93
    TRUNCATE: 截斷
    TRUNC(45.926, 2) 45.92
    MOD: 求余
    MOD(1600, 300) 100
    十四、日期函數
    now:獲取當前日期
    str_to_date: 將日期格式的字符轉換成指定格式的日期
    STR_TO_DATE(‘9-13-1999’,’%m-%d-%Y’) 1999-09-13
    date_format:將日期轉換成字符
    str_to_date: 將日期格式的字符轉換成指定格式的日期 2018年06月06日

    十五、條件表達式
    ? 在 SQL 語句中使用IF-THEN-ELSE 邏輯
    ? 使用方法: – CASE 表達式
    CASE 表達式
    在需要使用 IF-THEN-ELSE 邏輯時
    CASE expr WHEN comparison_expr1 THEN return_expr1
    [WHEN comparison_expr2 THEN return_expr2
    WHEN comparison_exprn THEN return_exprn
    ELSE else_expr]
    END
    練習:查詢部門號為 10, 20, 30 的員工信息, 若部門號為 10, 則打印其工資的 1.1 倍, 20 號部門, 則打印其工資的 1.2 倍, 30 號部門打印其工資的 1.3 倍數
    下面是使用case表達式的一個例子:
    SELECT department_id,salary,
    CASE department_id
    WHEN 10 THEN salary1.2
    WHEN 20 THEN salary1.3
    WHEN 30 THEN salary*1.5
    ELSE salary
    END 工資2
    FROM employees
    十六、數據操縱語言
    DML(Data Manipulation Language –數據操縱語言) 可以在下列條件下執行: – 向表中插入數據
    – 修改現存數據
    – 刪除現存數據
    事務是由完成若干項工作的DML語句組成的
    十七、插入數據
    INSERT 語句語法
    使用 INSERT 語句向表中插入數據。
    INSERT INTO table [(column [, column…])]
    VALUES (value [, value…]);
    使用這種語法一次只能向表中插入一條數據
    插入數據
    為每一列添加一個新值。
    ? 按列的默認順序列出各個列的值。
    ? 在 INSERT 子句中隨意列出列名和他們的值。
    ? 字符和日期型數據應包含在單引號中。
    INSERT INTO departments(department_id, department_name,
    manager_id, location_id)
    VALUES (70, ‘Public Relations’, 100, 1700);

    INSERT INTO
    employees(employee_id,last_name,email,hire_date,job_id)
    VALUES (300,’Tom’,’tom@126.com’,to_date(‘2012-3-
    21’,’yyyy-mm-dd’),’SA_RAP’);

    向表中插入空值
    隱式方式: 在列名表中省略該列的值
    INSERT INTO departments (department_id, department_name )
    VALUES (30, ‘Purchasing’);

    顯示方式: 在VALUES 子句中指定空值。
    INSERT INTO departments
    VALUES (100, ‘Finance’, NULL, NULL);
    插入指定的值
    NOW()函數:記錄當前系統的日期和時間
    INSERT INTO employees (employee_id, first_name, last_name, email, phone_number,hire_date, job_id, salary, commission_pct, manager_id,department_id)
    VALUES (113, ‘Louis’, ‘Popp’, ‘LPOPP’, ‘515.124.4567’, NOW(), ‘AC_ACCOUNT’, 6900, NULL, 205, 100);

    從其它表中拷貝數據
    在 INSERT 語句中加入子查詢
    INSERT INTO emp2
    SELECT *
    FROM employees
    WHERE department_id = 90;

    INSERT INTO sales_reps(id, name, salary, commission_pct)
    SELECT employee_id, last_name, salary, commission_pct
    FROM employees
    WHERE job_id LIKE ‘%REP%’;

    不必書寫 VALUES 子句。
    子查詢中的值列表應與 INSERT 子句中的列名對應
    十八、更新數據
    UPDATE 語句語法
    ? 使用 UPDATE 語句更新數據
    UPDATE table
    SET column = value [, column = value, …]
    [WHERE condition];

    ? 可以一次更新多條數據。
    ? 如果需要回滾數據,需要保證在DML前,進行設置:SET AUTOCOMMIT = FALSE;
    ? 使用 WHERE 子句指定需要更新的數據
    UPDATE employees
    SET department_id = 70
    WHERE employee_id = 113;
    ? 如果省略 WHERE 子句,則表中的所有數據都將被更新
    UPDATE copy_emp
    SET department_id = 110;

    更新中的數據完整性錯誤
    UPDATE employees
    SET department_id = 55
    WHERE department_id = 110;

    十九、刪除數據
    DELETE 語句
    使用 DELETE 語句從表中刪除數據。
    DELETE FROM table
    [WHERE condition];
    刪除數據
    使用 WHERE 子句刪除指定的記錄
    DELETE FROM departments
    WHERE department_name = ‘Finance’;
    如果省略 WHERE 子句,則表中的全部數據將被刪除
    DELETE FROM copy_emp;
    刪除中的數據完整性錯誤
    DELETE FROM departments
    WHERE department_id = 60;

    二十、子查詢
    概念
    出現在其他語句內部的select語句,稱為子查詢或內查詢,內部嵌套其他select語句的查詢,稱為外查詢或主查詢
    示例:
    select first_name from employees where
    department_id in(
    select department_id from departments
    where location_id=1700
    )
    注意事項
    ? 子查詢要包含在括號內。
    ? 將子查詢放在比較條件的右側。
    ? 單行操作符對應單行子查詢,多行操作符對應多行子查詢
    單行子查詢
    ? 只返回一行。
    ? 使用單行比較操作符。

    子查詢語法
    SELECT select_list
    FROM table
    WHERE expr operator
    (SELECT select_list
    FROM table);

    ? 子查詢 (內查詢) 在主查詢之前一次執行完成。
    ? 子查詢的結果被主查詢(外查詢)使用 。
    使用子查詢解決問題
    誰的工資比 Abel 高?

    執行單行子查詢
    題目:返回job_id與141號員工相同,salary比143號員工多的員工姓名,job_id 和工資
    在子查詢中使用組函數
    題目:返回公司工資最少的員工的last_name,job_id和salary
    子查詢中的 HAVING 子句
    ? 首先執行子查詢。
    ? 向主查詢中的HAVING 子句返回結果。
    題目:查詢最低工資大于50號部門最低工資的部門id和其最低工資
    非法使用子查詢

    子查詢中的空值問題
    SELECT last_name, job_id
    FROM employees
    WHERE job_id =
    (SELECT job_id
    FROM employees
    WHERE last_name = ‘Haas’);
    子查詢不返回任何行
    多行子查詢
    ? 返回多行。
    ? 使用多行比較操作符

    使用in操作符
    題目:返回location_id是1400或1700的部門中的所有員工姓名
    在多行子查詢中使用 ANY 操作符
    題目:返回其它部門中比job_id為‘IT_PROG’部門任一工資低的員工的員
    工號、姓名、job_id 以及salary

    題目:返回其它部門中比job_id為‘IT_PROG’部門所有工資都低的員工
    的員工號、姓名、job_id 以及salary

    子查詢中的空值問題

    二十一、創建數據庫
    創建一個保存員工信息的數據庫
    – create database employees;
    相關其他命令
    – show databases;查看當前所有數據庫
    – use employees;“使用”一個數據庫,使其作為當前數據庫
    命名規則
    ? 數據庫名不得超過30個字符,變量名限制為29個 ? 必須只能包含 A–Z, a–z, 0–9, _共63個字符
    ? 不能在對象名的字符間留空格
    ? 必須不能和用戶定義的其他對象重名
    ? 必須保證你的字段沒有和保留字、數據庫系統或常用方法沖突
    ? 保持字段名和類型的一致性,在命名字段并為其指定數據類型的時候一定要保證一致性。假如數據類型在一個表里是整數,那在另一個表里可就別變成字符型了
    CREATE TABLE 語句
    ? 必須具備:
    – CREATE TABLE權限
    – 存儲空間

    ? 必須指定:
    – 表名
    – 列名, 數據類型, 尺寸
    語法

    確認

    常用數據類型

    創建表
    CREATE TABLE emp (
    #int類型,自增
    emp_id INT AUTO_INCREMENT, #最多保存20個中英文字符
    emp_name CHAR (20),
    #總位數不超過15位
    salary DOUBLE,
    #日期類型
    birthday DATE,
    #主鍵
    PRIMARY KEY (emp_id)
    ) ;
    使用子查詢創建表
    ? 使用 AS subquery 選項,將創建表和插入數據結合起來(?)

    ? 指定的列和子查詢中的列要一一對應
    ? 通過列名和默認值定義列
    復制現有的表:
    create table emp1 as select * from employees;
    create table emp2 as select * from employees where 1=2;
    –創建的emp2是空表。
    使用子查詢創建表舉例

    二十二、ALTER TABLE 語句
    使用 ALTER TABLE 語句可以實現:
    –向已有的表中添加列
    ?修改現有表中的列
    –刪除現有表中的列
    –重命名現有表中的列
    追加一個新列
    ALTER TABLE dept80
    ADD job_id varchar(15);
    修改一個列
    ? 可以修改列的數據類型, 尺寸和默認值
    ? 對默認值的修改只影響今后對表的修改
    ALTER TABLE dept80
    MODIFY (last_name VARCHAR(30));

    ALTER TABLE dept80
    MODIFY (salary double(9,2) default 1000);

    刪除一個列
    使用 DROP COLUMN 子句刪除不再需要的列.
    ALTER TABLE dept80
    DROP COLUMN job_id;
    重命名一個列
    使用 CHANGE old_column new_column dataType子句重命名列
    ALTER TABLE dept80
    CHANGE department_name dept_name varchar(15);
    二十三、刪除表
    ? 數據和結構都被刪除
    ? 所有正在運行的相關事務被提交
    ? 所有相關索引被刪除
    ? DROP TABLE 語句不能回滾
    DROP TABLE dept80;

    清空表
    ? TRUNCATE TABLE 語句:
    – 刪除表中所有的數據
    – 釋放表的存儲空間
    ? TRUNCATE語句不能回滾
    ? 可以使用 DELETE 語句刪除數據,可以回滾
    二十四、改變對象的名稱
    ? 執行RENAME語句改變表, 視圖的名稱
    ? 必須是對象的擁有者
    ALTER table dept
    RENAME TO detail_dept;
    二十五、常見的數據類型
    整型

    小數

    位類型

    char和varchar類型
    字符串類型 最多字符數 描述及存儲需求
    說明:用來保存MySQL中較短的字符串。

    binary和varbinary類型
    說明:類似于char和varchar,不同的是它們包含二進制字符串而不包含非二進制字符串。
    Enum類型
    說明:又稱為枚舉類型哦,要求插入的值必須屬于列表中指定的值之一。
    如果列表成員為1~255,則需要1個字節存儲
    如果列表成員為255~65535,則需要2個字節存儲
    最多需要65535個成員
    Set類型
    說明:和Enum類型類似,里面可以保存0~64個成員。和Enum類型最大的區別是:SET類型一次可以選取多個成員,而Enum只能選一個根據成員個數不同,存儲所占的字節也不同

    日期類型

    datetime和timestamp的區別
    1、Timestamp支持的時間范圍較小,取值范圍:19700101080001——2038年的某個時間Datetime的取值范圍:1000-1-1 ——9999—12-31
    2、timestamp和實際時區有關,更能反映實際的日期,而datetime則只能反映出插入時的當地時區
    3、timestamp的屬性受Mysql版本和SQLMode的影響很大
    二十六、約束
    什么是約束
    ? 為了保證數據的一致性和完整性,SQL規范以約束的方式對表數據進行額外的條件限制。
    ? 約束是表級的強制規定
    ? 可以在創建表時規定約束(通過 CREATETABLE 語句),或者在表創建之后也可以(通
    過 ALTER TABLE 語句)
    有以下六種約束:
    – NOT NULL 非空約束,規定某個字段不能為空
    – UNIQUE 唯一約束,規定某個字段在整個表中是唯一的
    – PRIMARY KEY 主鍵(非空且唯一) – FOREIGN KEY 外鍵
    – CHECK 檢查約束
    – DEFAULT 默認值
    具體細節可以參閱W3Cschool手冊
    注意: MySQL不支持check約束,但可以使用check約束,而沒有任何效果;
    ? 根據約束數據列的限制,約束可分為:
    – 單列約束:每個約束只約束一列
    – 多列約束:每個約束可約束多列數據
    ? 根據約束的作用范圍,約束可分為:
    – 列級約束只能作用在一個列上,跟在列的定義后面
    – 表級約束可以作用在多個列上,不與列一起,而是單獨定義
    NOT NULL 約束
    非空約束用于確保當前列的值不為空值,非空約束只能出現在表對象的列上。
    Null類型特征:
    ?所有的類型的值都可以是null,包括int、float等數據類型
    ?空字符串””不等于null,0也不等于null
    創建 not null 約束:
    CREATE TABLE emp(
    id INT(10) NOT NULL,
    NAME VARCHAR(20) NOT NULL DEFAULT ‘abc’,
    sex CHAR NULL
    );
    增加 not null 約束
    ALTER TABLE emp
    MODIFY sex VARCHAR(30) NOT NULL;
    取消 not null 約束:
    ALTER TABLE emp
    MODIFY sex VARCHAR(30) NULL;

    取消 not null 約束,增加默認值:
    ALTER TABLE emp
    MODIFY NAME VARCHAR(15) DEFAULT ‘abc’ NULL;
    UNIQUE 約束
    ? 同一個表可以有多個唯一約束,多個列組合的約束。在創建唯一約束的時候,如果不給唯一約束名稱,就默認和列名相同。
    ? MySQL會給唯一約束的列上默認創建一個唯一索引
    ? 唯一約束,允許出現多個空值:NULL。
    CREATE TABLE USER(
    id INT NOT NULL,
    NAME VARCHAR(25),
    PASSWORD VARCHAR(16),
    #使用表級約束語法
    CONSTRAINT uk_name_pwd UNIQUE(NAME,PASSWORD)
    );
    表示用戶名和密碼組合不能重復
    添加唯一約束
    ALTER TABLE USER
    ADD UNIQUE(NAME,PASSWORD);
    ALTER TABLE USER
    ADD CONSTRAINT uk_name_pwd UNIQUE(NAME,PASSWORD);
    ALTER TABLE USER
    MODIFY NAME VARCHAR(20) UNIQUE;
    刪除約束
    ALTER TABLE USER
    DROP INDEX uk_name_pwd;
    PRIMARY KEY 約束
    ? 主鍵約束相當于唯一約束+非空約束的組合,主鍵約束列不允許重復,也不允許出現空值
    ? 如果是多列組合的主鍵約束,那么這些列都不允許為空值,并且組合的值不允許重復。
    ? 每個表最多只允許一個主鍵,建立主鍵約束可以在列級別創建,也可以在表級別上創建。
    ? MySQL的主鍵名總是PRIMARY,當創建主鍵約束時,系統默認會在所在的列和列組合上建立對應的唯一索引。
    CREATE TABLE emp4(
    id INT AUTO_INCREMENT PRIMARY KEY,
    NAME VARCHAR(20)
    );

    CREATE TABLE emp5(
    id INT NOT NULL AUTO_INCREMENT,
    NAME VARCHAR(20),
    pwd VARCHAR(15),
    CONSTRAINT emp5_id_pk PRIMARY KEY(id)
    );

    CREATE TABLE emp6(
    id INT NOT NULL,
    NAME VARCHAR(20),
    pwd VARCHAR(15),
    CONSTRAINT emp7_pk PRIMARY KEY(NAME,pwd)
    );
    刪除主鍵約束
    ALTER TABLE emp5
    DROP PRIMARY KEY;
    添加主鍵約束
    ALTER TABLE emp5
    ADD PRIMARY KEY(NAME,pwd);
    修改主鍵約束
    ALTER TABLE emp5
    MODIFY id INT PRIMARY KEY;
    FOREIGN KEY 約束
    ? 外鍵約束是保證一個或兩個表之間的參照完整性,外鍵是構建于一個表的兩個字段或是兩個表的兩個字段之間的參照關系。
    ? 從表的外鍵值必須在主表中能找到或者為空。當主表的記錄被從表參照時,主表的記錄將不允許刪除,如果要刪除數據,需要先刪除從表中依賴該記錄的數據,然后才可以刪除主表的數據。
    ? 還有一種就是級聯刪除子表數據。
    ? 注意:外鍵約束的參照列,在主表中引用的只能是主鍵或唯一鍵約束的列
    ? 同一個表可以有多個外鍵約束
    創建外鍵約束:
    CREATE TABLE dept(
    dept_id INT AUTO_INCREMENT PRIMARY KEY,
    dept_name VARCHAR(20)
    );

    CREATE TABLE emp(
    emp_id INT AUTO_INCREMENT PRIMARY KEY,
    last_name VARCHAR(15),
    dept_id INT,
    );
    創建多列外鍵組合,必須使用表級約束:
    CREATE TABLE classes(
    id INT,
    NAME VARCHAR(20),
    number INT,
    PRIMARY KEY(NAME,number)
    );

    CREATE TABLE student(
    id INT AUTO_INCREMENT PRIMARY KEY,
    classes_name VARCHAR(20),
    classes_number INT,
    FOREIGN KEY(classes_name,classes_number)
    REFERENCES classes(NAME,number)
    );

    ? 刪除外鍵約束:
    ALTER TABLE emp
    DROP FOREIGN KEY emp_dept_id_fk;
    ? 增加外鍵約束:
    ALTER TABLE emp
    ADD [CONSTRAINT emp_dept_id_fk] FOREIGN KEY(dept_id)
    REFERENCES dept(dept_id);
    FOREIGN KEY 約束的關鍵字
    – FOREIGN KEY: 在表級指定子表中的列
    – REFERENCES: 標示在父表中的列
    –ON DELETE CASCADE(級聯刪除): 當父表中的列被刪除時,子表中相對應的列也被刪除
    –ON DELETE SET NULL(級聯置空): 子表中相應的列置空

    CREATE TABLE student(
    id INT AUTO_INCREMENT PRIMARY KEY,
    NAME VARCHAR(20),
    classes_name VARCHAR(20),
    classes_number INT,
    /表級別聯合外鍵/
    FOREIGN KEY(classes_name, classes_number)
    REFERENCES classes(NAME, number) ON DELETE CASCADE);

    CHECK 約束
    ? MySQL可以使用check約束,但check約束對數據驗證沒有任何作用,添加數據時,沒有任何錯誤或警告

    CREATE TABLE temp(
    id INT AUTO_INCREMENT,
    NAME VARCHAR(20),
    age INT CHECK(age > 20),
    PRIMARY KEY(id)
    );
    二十七、MySQL中使用limit實現分頁
    ? 背景
    –查詢返回的記錄太多了,查看起來很不方便,怎么樣能夠實現分頁查詢呢?
    ? 分頁原理
    –所謂分頁顯示,就是將數據庫中的結果集,一段一段顯示出來需要的條件

    MySQL中使用limit實現分頁
    ? 怎么分段,當前在第幾段(每頁有幾條,當前在第幾頁)
    –前10條記錄:SELECT * FROM table LIMIT 0,10;
    –第11至20條記錄:SELECT * FROM table LIMIT 10,10;
    –第21至30條記錄: SELECT * FROM table LIMIT 20,10;
    ? 公式:
    (當前頁數-1)*每頁條數,每頁條數
    SELECT * FROM table LIMIT(PageNo - 1)*PageSize,PageSize; ? 注意:
    –limit子句必須放在整個查詢語句的最后!
    二十八、事務
    事務的概念
    事務:事務由單獨單元的一個或多個SQL語句組成,在這個單元中,每個MySQL語句是相互依賴的。而整個單獨單元作為一個不可分割的整體,如果單元中某條SQL語句一旦執行失敗或產生錯誤,整個單元將會回滾。所有受到影響的數據將返回到事物開始以前的狀態;如果單元中的所有SQL語句均執行成功,則事物被順利執行
    MySQL 中的存儲引擎[了解]
    1、概念:在mysql中的數據用各種不同的技術存儲在文件(或內存)中。
    2、通過show engines;來查看mysql支持的存儲引擎。
    3、 在mysql中用的最多的存儲引擎有:innodb,myisam ,memory 等。其中innodb支持事務,而myisam、memory等不支持事務
    事務的特點(重點)
    事務的ACID(acid)屬性
    –1. 原子性(Atomicity)
    原子性是指事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生。
    –2. 一致性(Consistency)
    事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態。
    –3. 隔離性(Isolation)
    事務的隔離性是指一個事務的執行不能被其他事務干擾,即一個事務內部的操作及使用的數據對并發的其他事務是隔離的,并發執行的各個事務之間不能互相干擾。
    –4. 持久性(Durability)
    持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來的其他操作和數據庫故障不應該對其有任何影響
    事務的使用
    以第一個 DML 語句的執行作為開始
    以下面的其中之一作為結束:
    –COMMIT 或 ROLLBACK 語句
    –DDL 或 DCL 語句(自動提交)
    –用戶會話正常結束
    –系統異常終了
    數據庫的隔離級別
    對于同時運行的多個事務, 當這些事務訪問數據庫中相同的數據時, 如果沒有采取必要的隔離機制, 就會導致各種并發問題:
    –臟讀: 對于兩個事務 T1, T2, T1 讀取了已經被 T2 更新但還沒有被提交的字段. 之后, 若 T2 回滾, T1讀取的內容就是臨時且無效的.
    –不可重復讀: 對于兩個事務T1, T2, T1 讀取了一個字段, 然后 T2 更新了該字段. 之后, T1再次讀取同一個字段, 值就不同了.
    –幻讀: 對于兩個事務T1, T2, T1 從一個表中讀取了一個字段, 然后 T2 在該表中插 入了一些新的行. 之后, 如果 T1 再次讀取同一個表, 就會多出幾行.
    數據庫事務的隔離性: 數據庫系統必須具有隔離并發運行各個事務的能力, 使它們不會相互影響, 避免各種并發問題.
    一個事務與其他事務隔離的程度稱為隔離級別. 數據庫規定了多種事務隔離級別, 不同隔離級別對應不同的干擾程度, 隔離級別越高, 數據一致性就越好, 但并發性越弱
    數據庫提供的 4 種事務隔離級別

    Oracle 支持的 2 種事務隔離級別:READ COMMITED, SERIALIZABLE。 Oracle 默認的事務隔離級別為: READ COMMITED
    Mysql 支持 4 種事務隔離級別. Mysql 默認的事務隔離級別為: REPEATABLE READ

    在 MySql 中設置隔離級別
    每啟動一個 mysql 程序, 就會獲得一個單獨的數據庫連接. 每個數據庫連接都有一個全局變量 @@tx_isolation, 表示當前的事務隔離級別.
    查看當前的隔離級別: SELECT @@tx_isolation;
    設置當前 mySQL 連接的隔離級別:
    –set transaction isolation level read committed;
    設置數據庫系統的全局的隔離級別:
    –set global transaction isolation level read committed;
    二十九、視圖
    ? 概念
    視圖:MySQL從5.0.1版本開始提供視圖功能。一種虛擬存在的表,行和列的數據來自定義視圖的查詢中使用的表,并且是在使用視圖時動態生成的,只保存了sql邏輯,不保存查詢結果
    ? 應用場景:
    – 多個地方用到同樣的查詢結果
    – 該查詢結果使用的sql語句較復雜
    ? 示例:
    CREATE VIEW my_v1
    AS
    SELECT studentname,majorname
    FROM student s
    INNER JOIN major m
    ON s.majorid=m.majorid
    WHERE s.majorid=1;
    常見題目
    1.查詢郵箱中包含a字符的員工名、部門名和工種信息
    2.查詢各部門的平均工資
    3.查詢平均工資最低的部門信息
    4.查詢平均工資最低的部門名和工資
    視圖的好處
    ? 重用sql語句
    ? 簡化復雜的sql操作,不必知道它的查詢細節
    ? 保護數據,提高安全性
    創建或者修改視圖
    ? 創建視圖的語法:
    create [or replace] view view_name
    As select_statement
    [with|cascaded|local|check option]
    ? 修改視圖的語法:
    alter view view_name
    As select_statement
    [with|cascaded|local|check option]
    視圖的可更新性和視圖中查詢的定義有關系,以下類型的視圖是不能更新的。
    ? 包含以下關鍵字的sql語句:分組函數、distinct、group by、having、union或者union all
    ? 常量視圖
    ? Select中包含子查詢
    ? join
    ? from一個不能更新的視圖
    ? where子句的子查詢引用了from子句中的表
    刪除視圖
    ? 刪除視圖的語法:
    用戶可以一次刪除一個或者多個視圖,前提是必須有該視圖的drop權限。
    drop view [if exists] view_name,view_name …[restrict|cascade]
    查看視圖
    ? 查看視圖的語法:
    show tables;
    如果需要查詢某個視圖的定義,可以使用show create view命令進行查看:
    show create view view_name \G
    三十、存儲過程和函數
    什么是存儲過程和函數
    存儲過程和函數:
    事先經過編譯并存儲在數據庫中的一段sql語句的集合。
    使用好處:
    1、簡化應用開發人員的很多工作
    2、減少數據在數據庫和應用服務器之間的傳輸
    3、提高了數據處理的效率
    創建存儲過程或函數
    ? 創建存儲過程:
    create procedure 存儲過程名 ([proc_parameter[,…]])
    [characteristic…]routine_body
    ? 創建函數:
    create function 函數名([func_parameter[,…]])
    returns type
    [characteristic…]routine_body
    語法解釋
    ? proc_parameter: [in|out|inout] param_name type
    ? Func_paramter:param_name type
    ? Type:
    任何有效的mysql數據類型
    ? Characteristic:
    language sql(默認,且推薦)
    |[not] deterministic
    |{contains sql|no sql|reads sql data|modifies sql data}
    |sql security{definer|invoker}
    |comment ‘string’
    ? Rountine_body:
    有效的sql 過程語句
    調用存儲過程或函數
    ? 調用存儲過程:
    call 存儲過程名(參數列表)
    ? 調用函數:
    Select 函數名(參數列表)
    案例
    ? 查詢員工名為king的所有記錄
    ? 根據輸入的員工名,查詢部門名
    ? 根據指定的員工編號,返回工資
    ? 根據指定的員工編號,返回工資和部門號
    ? 將輸入的a和b都翻倍并返回
    修改存儲過程或函數
    ? 修改存儲過程:
    alter procedure 存儲過程名 [charactristic…]
    ? 修改函數:
    alter function 函數名 [charactristic…]
    characteristic:
    {contains sql|no sql|reads sql data|modifies sql data}
    |sql security{definer|invoker}
    |comment ‘string’
    刪除存儲過程或函數
    說明:一次只能刪除一個存儲過程或者函數,并且要求有該過程或函數的alter routine 權限
    刪除存儲過程:
    drop procedure [if exists] 存儲過程名
    刪除函數:
    drop function [if exists] 函數名
    查看存儲過程或函數
    1.查看存儲過程或函數的狀態:
    show {procedure|function} status like 存儲過程或函數名
    2.查看存儲過程或函數的定義:
    show create {procedure|function} 存儲過程或函數名
    3.通過查看information_schema.routines了解存儲過程和函數的信息(了解)
    select * from rountines where rounine_name =存儲過程名|函數名
    三十一、數據庫設計
    為什么需要設計數據庫
    良好的數據庫設計
    -節省數據的存儲空間
    -能夠保證數據的完整性
    -方便進行數據庫應用系統的開發
    軟件項目開發周期中數據庫設計

    設計數據庫的步驟
    收集信息
    與該系統有關人員進行交流、座談,充分了解用戶需求,理解數據庫需要完成的任務
    標識實體 (Entity)
    標識數據庫要管理的關鍵對象或實體,實體一般是名詞
    標識每個實體的屬性(Attribute)
    標識實體之間的關系(Relationship)
    E-R圖

    轉化E-R圖為數據庫模型圖
    將各實體轉換為對應的表,將各屬性轉換為各表對應的列
    標識每個表的主鍵列
    在表之間建立主外鍵,體現實體

    為什么需要數據規范化
    不合規范的表設計
    信息重復
    更新異常
    插入異常
    無法正確表示信息
    刪除異常
    丟失有效信息
    第一范式 (1st NF)
    第一范式的目標是確保每列的原子性
    如果每列都是不可再分的最小數據單元(也稱為最小的原子單元),則滿足第一范式(1NF)

    第二范式 (2nd NF)
    第二范式要求每個表只描述一件事情

    第三范式 (3nd NF)
    如果一個關系滿足2NF,并且除了主鍵以外的其他列都不傳遞依賴于主鍵列,則滿足第三范式(3NF)

    總結

    以上是生活随笔為你收集整理的数据库知识点汇总(最全!!)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。