【MySQL】SQL語句基礎

来源:https://www.cnblogs.com/haoworld/archive/2019/09/23/databasesql-yu-ju-ji-chu.html
-Advertisement-
Play Games

一、操作資料庫1.1 創建資料庫1.2 查看資料庫1.3 修改資料庫1.4 刪除資料庫1.5 選擇資料庫二、操作表2.1 創建表2.2 查看表2.3 修改表2.4 刪除表三、操作表記錄CRUD3.1 INSERT3.2 UPDATE3.3 DELETE3.4 SELECT四、備份恢複數據庫五、多表設... ...


一、操作資料庫

1.1 創建資料庫

 
CREATE  DATABASE  [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] 
    create_specification:    
      [DEFAULT] CHARACTER SET charset_name  |   [DEFAULT] COLLATE collation_name 
-- 1. ~創建一個名稱為mydb1的資料庫。
    create database mydb1;
-- 2.~創建一個使用gbk字元集的mydb2資料庫。
    create database mydb2 character set gbk;
-- 3.~創建一個使用utf8字元集,並帶校對規則的mydb3資料庫。
    create database mydb3 character set utf-8 collate utf8_bin;

1.2 查看資料庫

-- 顯示資料庫語句:
SHOW DATABASES
-- 顯示資料庫創建語句:
SHOW CREATE DATABASE db_name

-- 1. ~查看當前資料庫伺服器中的所有資料庫 
show databases;
-- 2. ~查看前面創建的mydb2資料庫的定義信息
show create database mydb3;

1.3 修改資料庫

    ALTER  DATABASE  [IF NOT EXISTS] db_name  [alter_specification [, alter_specification] ...] 
    alter_specification:    
    [DEFAULT] CHARACTER SET charset_name  |   [DEFAULT] COLLATE collation_name

-- 1. ~查看伺服器中的資料庫,並把其中mydb2字元集修改為utf8
    alter database mydb2 character set utf8;

1.4 刪除資料庫


DROP DATABASE  [IF EXISTS]  db_name 
-- 1.  ~刪除前面創建的mydb1資料庫 
drop database mydb1;

1.5 選擇資料庫

--  1. 進入資料庫:
USE db_name;
--2.查看當前所選的資料庫: 
SELECT DATABASE();

二、操作表

2.1 創建表

CREATE TABLE table_name
(
    field1  datatype,
    field2  datatype,
    field3  datatype,
)[character set 字元集] [collate 校對規則]

-- field:指定列名 datatype:指定列類型
-- ~創建一個員工表employee 

    CREATE TABLE employee(
        id int PRIMARY KEY AUTO_INCREMENT,
        name varchar(20) UNIQUE,
        gender bit NOT NULL,
        birthday date,
        entry_date date,
        job varchar(40),
        salary double,
        resume text
    );

2.2 查看表

-- 查看表結構:
DESC tab_name
-- 查看當前資料庫中所有表:
SHOW TABLES;
-- 查看當前資料庫表建表語句 
SHOW CREATE TABLE tab_name;

2.3 修改表

ALTER TABLE table_name  ADD/MODIFY/DROP/CHARACTER SET/CHANGE  (column datatype [DEFAULT expr][, column datatype]...);

-- *修改表的名稱:
RENAME TABLE 表名 TO 新表名;
    
    -- 1. ~在上面員工表的基本上增加一個image列。
    alter table employee add image blob;
    
    -- 2.~修改job列,使其長度為60。
    alter table employee modify job varchar(60);
    
    -- 3. ~刪除gender列。
    alter table employee drop gender;
    
    -- 4. ~表名改為user。
    rename table employee to user;
    
    -- 5. ~修改表的字元集為gbk
    alter table user character set gbk;
        
    -- 6. ~列名name修改為username
    alter table user change name username varchar(20);

2.4 刪除表

DROP TABLE tab_name;

-- ~刪除user表
drop table user;

三、操作表記錄CRUD

3.1 INSERT

INSERT INTO table [(column [, column...])] VALUES (value [, value...]);

-- 插入的數據應與欄位的數據類型相同。
-- 數據的大小應在列的規定範圍內,例如:不能將一個長度為80的字元串加入到長度為40的列中。
-- 在values中列出的數據位置必須與被加入的列的排列位置相對應。
-- 字元和日期型數據應包含在單引號中。
-- 插入空值:不指定或insert into table value(null)
-- 如果要插入所有欄位可以省寫列列表,直接按表中欄位順序寫值列表

-- ~使用insert語句向表中插入三個員工的信息
INSERT INTO employee (id,name,gender,birthday,entry_date,job,salary,resume) VALUES (null,'張飛',1,'1999-09-09','1999-10-01','打手',998.0,'老大的三弟,真的很能打');
INSERT INTO employee VALUES (null,'關羽',1,'1998-08-08','1998-10-01','財神爺',9999999.00,'老大的二弟,公司掙錢都指著他了');
-- 插入多條數據
INSERT INTO employee VALUES (null,'劉備',0,'1990-01-01','1991-01-01','ceo',100000.0,'公司的老大'),(null,'趙雲',1,'2000-01-01','2001-01-01','保鏢',1000.0,'老大貼身人');

3.2 UPDATE


UPDATE  tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition]  
    
-- UPDATE語法可以用新值更新原有表行中的各列。
-- SET子句指示要修改哪些列和要給予哪些值。
-- WHERE子句指定應更新哪些行。如沒有WHERE子句,則更新所有的行
    

-- 1. ~將所有員工薪水修改為5000元。
update employee set salary = 5000;
-- 2. ~將姓名為’張飛’的員工薪水修改為3000元。
update employee set salary = 3000 where name='張飛';
-- 3. ~將姓名為’關羽’的員工薪水修改為4000元,job改為ccc。
update employee set salary=4000,job='ccc' where name='關羽';
-- 4. ~將劉備的薪水在原有基礎上增加1000元。
update employee set salary=salary+1000 where name='劉備';
      

3.3 DELETE

DELETE FROM tbl_name [WHERE where_definition]    

-- 如果不使用where子句,將刪除表中所有數據。
-- Delete語句不能刪除某一列的值(可使用update)
-- 使用Delete語句僅刪除記錄,不刪除表本身。如要刪除表,使用drop table語句。
-- 同insert和update一樣,從一個表中刪除記錄將引起其它表的參照完整性問題,在修改資料庫數據時,頭腦中應該始終不要忘記這個潛在的問題。 外鍵約束
-- 刪除表中數據也可使用TRUNCATE TABLE 語句,它和delete有所不同,參看mysql文檔。
-- 1. ~刪除表中名稱為’張飛’的記錄。
delete from employee where name='張飛';
-- 2. ~刪除表中所有記錄。
delete from employee;
-- 3. ~使用truncate刪除表中記錄。
truncate table employee;

3.4 SELECT

~1.基本查詢
SELECT [DISTINCT] *|{column1, column2. column3..} FROM  table;
    
~查詢表中所有學生的信息。
    select * from exam;
~查詢表中所有學生的姓名和對應的英語成績。
    select name,english from exam;
~過濾表中重覆數據
     select distinct english from exam;
~在所有學生分數上加10分特長分顯示。
    select name , math+10,english+10,chinese+10 from exam;
~統計每個學生的總分。
    select name ,english+math+chinese from exam;
使用別名錶示學生總分。
    select name as 姓名 ,english+math+chinese as 總成績 from exam;
    select name 姓名 ,english+math+chinese 總成績 from exam;
select name english from exam;

~2.使用where子句進行過濾查詢
~查詢姓名為張飛的學生成績
    select * from exam where name='張飛';
~查詢英語成績大於90分的同學
    select * from exam where english > 90;
~查詢總分大於230分的所有同學
    select name 姓名,math+english+chinese 總分 from exam where math+english+chinese>230;
~查詢英語分數在 80-100之間的同學。
    select * from exam where english between 80 and 100;
~查詢數學分數為75,76,77的同學。
    select * from exam where math in(75,76,77);
~查詢所有姓張的學生成績。
    select * from exam where name like '張%';
    select * from exam where name like '張__';
~查詢數學分>70,語文分>80的同學。
    select * from exam where math>70 and chinese>80;

~3.使用order by關鍵字對查詢結果進行排序操作
SELECT column1, column2. column3.. FROM table where... order by column asc|desc;
asc 升序 -- 預設就是升序
desc 降序

~對語文成績排序後輸出。
    select name,chinese from exam order by chinese desc;
~對總分排序按從高到低的順序輸出
    select name 姓名,chinese+math+english 總成績 from exam order by 總成績 desc;
~對姓張的學生成績排序輸出
    select name 姓名,chinese+math+english 總成績 from exam where name like '張%' order by 總成績 desc;
~4.聚合函數
(1)Count -- 用來統計符合條件的行的個數
    ~統計一個班級共有多少學生?
        select count(*) from exam;
    ~統計數學成績大於90的學生有多少個?
        select count(*) from exam where math>70;
    ~統計總分大於230的人數有多少?
        select count(*)from exam where math+english+chinese > 230;
(2)SUM -- 用來將符合條件的記錄的指定列進行求和操作
    ~統計一個班級數學總成績?
        select sum(math) from exam;
    ~統計一個班級語文、英語、數學各科的總成績
        select sum(math),sum(english),sum(chinese) from exam;
    ~統計一個班級語文、英語、數學的成績總和
        select sum(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;
        在執行計算時,只要有null參與計算,整個計算的結構都是null
        此時可以用ifnull函數進行處理
    ~統計一個班級語文成績平均分
        select sum(chinese)/count(*) 語文平均分 from exam;
(3)AVG -- 用來計算符合條件的記錄的指定列的值的平均值
    ~求一個班級數學平均分?
        select avg(math) from exam;
    ~求一個班級總分平均分?
        select avg(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;

(4)MAX/MIN -- 用來獲取符合條件的所有記錄指定列的最大值和最小值
    ~求班級最高分和最低分
        select max(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;
        select min(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;
~5.分組查詢
~對訂單表中商品歸類後,顯示每一類商品的總價
    select product,sum(price) from orders group by product;
~詢購買了幾類商品,並且每類總價大於100的商品
    select product 商品名,sum(price)商品總價 from orders group by product having sum(price)>100;
    
where子句和having子句的區別:
    where子句在分組之前進行過濾having子句在分組之後進行過濾
    having子句中可以使用聚合函數,where子句中不能使用
    很多情況下使用where子句的地方可以使用having子句進行替代

~查詢單價小於100而總價大於150的商品的名稱
    select product from orders where price<100 group by product having sum(price)>150;
    
    

~~sql語句書寫順序: 
select from where groupby having orderby
~~sql語句執行順序:
from where select group by having order by   

四、備份恢複數據庫

方式1:
備份: 在cmd視窗下 mysqldump -u root -p dbName > c:/1.sql
恢復: 方式1:在cmd視窗下 mysql -u root -p dbName < c:/1.sql
方式2:
在mysql命令下, source c:/1.sql
要註意恢複數據只能恢複數據本身,資料庫沒法恢復,需要先自己創建出數據後才能進行恢復.

五、多表設計多表查詢

5.1 外鍵約束

表是用來保存顯示生活中的數據的,而現實生活中數據和數據之間往往具有一定的關係,我們在使用表來存儲數據時,可以明確的聲明表和表之前的依賴關係,命令資料庫來幫我們維護這種關係,向這種約束就叫做外鍵約束

CREATE TABLE dept(
        id int PRIMARY KEY AUTO_INCREMENT,
        name varchar(20)
    );

INSERT INTO dept values(null,'財務部'),(null,'人事部'),(null,'銷售部'),(null,'行政部');

create table emp(
    id int PRIMARY KEY AUTO_INCREMENT,
    name varchar(20),
    dept_id int,
    FOREIGN  KEY (dept_id) REFERENCES dept(id)
 );
 
INSERT INTO emp values(null,'小明',1),(null,'哈利波特',2),(null,'李四',3),(null,'張三',3);

5.2 多表設計

  • 一對多:在多的一方保存一的一方的主鍵做為外鍵
  • 一對一:在任意一方保存另一方的主鍵作為外鍵
  • 多對多:創建第三方關係表保存兩張表的主鍵作為外鍵,保存他們對應關係

5.3 多表查詢

  • 笛卡爾積查詢: 將兩張表的記錄進行一個相乘的操作查詢出來的結果就是笛卡爾積查詢,如果左表有n條記錄,右表有m條記錄,笛卡爾積查詢出有n*m條記錄,其中往往包含了很多錯誤的數據,所以這種查詢方式並不常用
select * from dept,emp;
  • 內連接查詢:查詢的是左邊表和右邊表都能找到對應記錄的記錄
select * from dept,emp where dept.id = emp.dept_id;
select * from dept inner join emp on dept.id=emp.dept_id;
  • 外連接查詢:

    • 左外連接查詢:在內連接的基礎上增加左邊表有而右邊表沒有的記錄
    select * from dept left join emp on dept.id=emp.dept_id;
    
    • 右外連接查詢:在內連接的基礎上增加右邊表有而左邊表沒有的記錄
    select * from dept right join emp on dept.id=emp.dept_id;
    
    • 全外連接查詢:在內連接的基礎上增加左邊表有而右邊表沒有的記錄和右邊表有而左表表沒有的記錄
    select * from dept full join emp on dept.id=emp.dept_id; 
    -- mysql不支持全外連接
    -- 可以使用union關鍵字模擬全外連接:
    select * from dept left join emp on dept.id = emp.dept_id
    union
    select * from dept right join emp on dept.id = emp.dept_id;

六、其他

  • MySQL中修改提示符
    • 第一種方式:登錄之後修改
MySQL 預設提示符為 >
prompt [MySQL提示符]

MySQL提示符
MySQL提示符

  • 第二種方式在登錄的時候就修改
mysql -uroot -proot -prompt [MySQL提示符]
  • MySQL修改分隔符,預設分隔符為; 修改為\
DELIMITER \\
  • SQL語言分類
  • SQL語言共分為四大類:數據查詢語言DQL,數據操縱語言DML,數據定義語言DDL,數據控制語言DCL。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼是布隆過濾器?它實際上是一個很長的二進位向量和一系列隨機映射函數。把一個目標元素通過多個hash函數的計算,將多個隨機計算出的結果映射到二進位向量的位中,依次來間接標記一個元素是否存在於一個集合中。布隆過濾器可以做什麼?布隆過濾器可以用於檢索一個元素是否在一個集合中。它的優點是空間效率和查詢時間 ...
  • 平時遇到的死鎖,絕大多數情況下,都可以根據當時的場景進行重現,然後具體分析解決,下文這個死鎖幾次嘗試測試模擬,均沒有成功重現在嘗試用profile跟蹤加鎖順序之後,大概可以推斷到當時死鎖發生的原因,但是仍有無法重現,為了避免不必要的麻煩,這裡用測試表的方式,儘可能還原嘗試的場景,來做進一步的分析。死 ...
  • ## SQL Server 命令式操作 - 首先 sql server 的基本操作分為三類 - CREATE (創建資料庫) - ALTER(修改資料庫) - DROP(刪除資料庫) **CREATE**創建資料庫 ```CREATE DATABASE TEST1 ##資料庫名稱 ON primar ...
  • 1.Playbook劇本小結 1.什麼是playbook,playbook翻譯過來就是“劇本”,那playbook組成如下 play: 定義的是主機的角色task: 定義的是具體執行的任務playbook: 由一個或多個play組成,一個play可以包含多個task任務 簡單理解為: 使用不同的模塊 ...
  • [TOC] 第十六章、淺識資料庫 資料庫配置 資料庫修改信息 用戶操作 表的修改 創建表的完整語法 資料庫表的引擎:驅動數據的方式 資料庫優化 資料庫的模式 mysql支持的數據類型 整型 浮點型 字元串:資料庫優化 char效率要高於varchar 時間 枚舉與集合 約束 ...
  • 經常需要查一些信息, 想寫視圖來返回數據以提高效率,但是用試視圖不能傳參,只好想到改存儲過程。記錄一下語法,方便以後做項目時候想不起來了用。 1:傳欄位返回datatable 2: 傳欄位回一串字元 3: 傳字元串返回datable 4:存儲過程調用存儲過程 --加半個小時(select datea ...
  • 從 MySQL 5.7.8 開始,MySQL 支持原生的 JSON 數據類型。 一. 創建json(不可以設置長度,可以是null,不能用有預設值) mysql> CREATE TABLE lnmp ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, ` ...
  • 建表語句: 報錯: 原因: 我這裡使用 api,method 來做 api 表的聯合主鍵,此時會根據這兩個欄位建立索引,charset 是 utf8 ,也就是一個字元3個位元組, 那麼總共索引的位元組為: 500*3+50*3 = 1650 個位元組,而mysql 要求的索引是 767 個位元組。 解決: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...