總結
數據庫(Database)
理解為“文件夾”,里面可以裝很多張表。作業中要求先建一個名字叫 mydb6_product 的數據庫。
表(Table)
理解為“Excel 工作表”,由“列(字段)”和“行(記錄)”組成。
列(Column / Field)
表中的一豎條數據,每列都有:
? 數據類型(整型、字符串、浮點型、日期型)
? 約束(主鍵、非空、默認值、外鍵等)
主鍵(Primary Key)
一列或多列的組合,用來唯一標識一行。相當于“身份證號碼”,不能重復,不能為 NULL。
外鍵(Foreign Key)
一張表里的某列引用另一張表的主鍵。作用:讓兩張表產生“關聯”。
例:involces 表的 order_id 是外鍵 → 指向 orders 表的 id。
自增長(AUTO_INCREMENT)
整型主鍵專用,每插入一行自動 +1,省得手寫編號。
非空(NOT NULL)
該列必須有值,不能留空。
默認值(DEFAULT)
插入數據時如果不給值,系統就自動用默認值填充。
浮點型(FLOAT / DOUBLE)
存小數,如價格、工資、金額。
日期型(DATE)
存年月日,如訂單日期。
SQL 語言
用來“說話”讓數據庫干活的語言。核心就 4 類:
? DDL(數據定義):CREATE / DROP / ALTER
? DML(數據操作):INSERT / UPDATE / DELETE / SELECT
? DCL(權限控制):GRANT / REVOKE(本次作業暫時用不到)
數據類型再認識
? INT(11) —— 整數,括號里的 11 只是“顯示寬度”,跟真正存儲大小無關。
? FLOAT(8,2) —— 最多 8 位,其中小數占 2 位(例如 999999.99)。
? DATE —— 只存年月日,格式 ‘YYYY-MM-DD’。
? VARCHAR(20) —— 可變長度字符串,最多 20 個字符。
列級約束/說明
? NOT NULL —— 這一列必須填值。
? DEFAULT —— 不給值時的默認值。
? PRIMARY KEY —— 主鍵,不能重復。
? COMMENT —— 給列寫中文注釋,方便以后看。
插入數據 INSERT INTO … VALUES …
把一行行真實數據塞進表里。
查詢 SELECT(本次重點)
? 基本查詢:SELECT * FROM 表名;
? 去重:SELECT DISTINCT 列名 …
? 聚合:COUNT()、MAX()、MIN()、AVG()、SUM()
? 排序:ORDER BY 列名 [ASC|DESC]
? 條件:WHERE 列名 BETWEEN … AND …、LIKE、IN、AND/OR 等
? 分組:GROUP BY 列名
? 分組后再過濾:HAVING 條件
? 限制返回行數:LIMIT n
建“新表”并復制數據
CREATE TABLE 新表名 AS SELECT …;
?mysql端口號:3306
mysql體系架構:
?(1)網絡連接層
?(2)數據服務層
?(3)存儲引擎層 (innodb事物管理(MyISAM) )
?(4)文件系統層(物理存儲層)
客戶端的連接指令
mysql
?-u用戶名
?-p密碼
?-h 主機名/ip #(localhost/127.0.0.1默認)
?-P 端口
?-D 庫名
?-e sql語句 #直接在客戶端連接時執行sql語句不登錄mysql管理系統
1.4 sql 4大類別
?? 獲取關鍵字的語法
?\c 清空當前命令,不執行當前命令
?\d 指定sql結束字符 默認結束字符;
?\! 調用系統指令 system
?\q 退出 exit quit
2. DDL數據庫定義語句
2.1 庫
show展示(查看)
show databases|tables|warnings;
show databases like '模糊值'; ? #‘%my%’
?? ??? ??? ?% ?任意長度任意字符
??? ??? ? ? ?_ ?任意單個字符
mysql> create database db2 character set utf8mb4 collate utf8mb4_general_ci;
Query OK, 1 row affected (0.01 sec) ?? ?
mysql> select * from ?information_schema.schemata;
create
create database 數據庫名;
create database if not exists 數據庫名;
use 數據名
use mysql ? 進入mysql數據庫
drop 刪除
drop ?database 庫名;
??mysql引號區別:
?`` 將關鍵字可以引用作為數據值創建
?‘’ “” 引用字符串數據值
2.2 表定義語句
create table 表名 (字段名1 數據類型,字段名2 數據類型,....);
drop ?table ?表名; ? #在對應的數據庫下刪除
show tables; 顯示庫下的所有表
顯示表字段名(列名)
desc|describe|explain ?
desc 表名;
show columns from 表名;
復制表
create table 新表名 like 舊表; ?#僅復制舊表的表結構給新表
insert ?into 新表名 ?select ?* from 舊表; ? #將舊表數據插入到新表 (舊表 和新表字段和數據類型一致)
create table 新表名 select * from ?舊表名; ?#復制舊表的表結構以及表數據給新表
5.5 ?5.8
DQL數據查詢語言 select
select 查詢表數據
?函數結果
select ? ? ? ? ?函數結果
select database();
select version();
? ? ? ?now()
? ? ? ?current_date()
? ? ? ?current_time()
? ? ? ?user()
?
?
創建數據庫
CREATE DATABASE mydb6_product;
USE mydb6_product;
按順序建 3張表
(1)employees 員工表
CREATE TABLE employees (
? ? id INT PRIMARY KEY,
? ? name VARCHAR(50) NOT NULL,
? ? age INT,
? ? gender VARCHAR(10) NOT NULL DEFAULT 'unknown',
? ? salary FLOAT
);
(2)orders 訂單表
CREATE TABLE orders (
? ? id INT PRIMARY KEY,
? ? name VARCHAR(100) NOT NULL,
? ? price FLOAT,
? ? quantity INT,
? ? category VARCHAR(50)
);
(3)involces 發票表(注意拼寫是 involces,作業原圖如此)
CREATE TABLE involces (
? ? number INT PRIMARY KEY AUTO_INCREMENT,
? ? order_id INT,
? ? in_date DATE,
? ? totalamount FLOAT CHECK (totalamount > 0),
? ? FOREIGN KEY (order_id) REFERENCES orders(id)
);
做好之后可以使用SHOW TABLES;
?查看庫里的表,用?DESC 表名;
?查看表結構。
?
(1)顯示所有職工的基本信息。
SELECT * FROM t_worker;
(2)查詢所有職工所屬部門的部門號,不顯示重復的部門號。
SELECT DISTINCT department_id FROM t_worker;
(3)求出所有職工的人數。
SELECT COUNT(*) AS 總人數 FROM t_worker;
(4)列出最高工和最低工資。
思路:聚合 MAX、MIN。
SELECT MAX(wages) AS 最高工資, MIN(wages) AS 最低工資 FROM t_worker;
列出職工的平均工資和總工資。
思路:聚合 AVG、SUM,保留 2 位小數。
SELECT ROUND(AVG(wages),2) AS 平均工資, ROUND(SUM(wages),2) AS 總工資 FROM t_worker;
(6)創建一個只有職工號、姓名和參加工作的新表,名為工作日期表。
思路:建表并復制三列數據。
CREATE TABLE 工作日期表 AS
SELECT worker_id, name, worker_date FROM t_worker;
(7)顯示所有黨員的年齡。思路:先算年齡 = 今年 - 出生年;篩選 politics='黨員'。
SELECT name, YEAR(CURDATE())-YEAR(borth_date) AS 年齡
FROM t_worker
WHERE politics='黨員';
(8)列出工資在 4000–8000 之間的所有職工姓名。
SELECT name FROM t_worker WHERE wages BETWEEN 4000 AND 8000;
(9)列出所有孫姓和李姓的職工姓名。
SELECT name FROM t_worker
WHERE name LIKE '孫%' OR name LIKE '李%';
(10)列出所有部門號為 102 和 103 且不是黨員的職工號、姓名。
思路:多條件 AND + IN。
SELECT worker_id, name
FROM t_worker
WHERE department_id IN (102,103) AND politics != '黨員';
(11)將職工表 t_worker 中的職工按出生的先后順序排序。
SELECT * FROM t_worker ORDER BY borth_date;
(12)顯示工資最高的前 3 名職工的職工號和姓名。
SELECT worker_id, name
FROM t_worker
ORDER BY wages DESC
LIMIT 3;
(13)求出各部門黨員的人數。
SELECT department_id, COUNT(*) AS 黨員人數
FROM t_worker
WHERE politics='黨員'
GROUP BY department_id;
(14)統計各部門的工資和平均工資并保留 2 位小數。
思路:GROUP BY + SUM/AVG + ROUND。
SELECT department_id,
? ? ? ?ROUND(SUM(wages),2) ? AS 部門總工資,
? ? ? ?ROUND(AVG(wages),2) ? AS 部門平均工資
FROM t_worker
GROUP BY department_id;
(15)列出總人數大于等于 3 的部門號和總人數。
思路:分組后統計人數,再用 HAVING 過濾。
SELECT department_id, COUNT(*) AS 總人數
FROM t_worker
GROUP BY department_id
HAVING 總人數 >= 3;
?