SQL概要與表的創建

来源:https://www.cnblogs.com/notfind/archive/2019/08/22/11396299.html
-Advertisement-
Play Games

SQL概要與表的創建 1.表的結構 ​ 關係資料庫通過類似Excel 工作表那樣的、由行和列組成的二維表來管理數據。用來管理數據的二維表在關係資料庫中簡稱為表。 ​ 根據 SQL 語句的內容返回的數據同樣必須是二維表的形式 ,這也是關係資料庫的特征之一 。返回結果如果不是二維表的SQL 語句則無法執 ...


SQL概要與表的創建

1.表的結構

​ 關係資料庫通過類似Excel 工作表那樣的、由行和列組成的二維表來管理數據。用來管理數據的二維表在關係資料庫中簡稱為表。

​ 根據SQL 語句的內容返回的數據同樣必須是二維表的形式 ,這也是關係資料庫的特征之一。返回結果如果不是二維表的SQL 語句則無法執行。

​ 表的(垂直方向)稱為欄位,它代表了保存在表中的數據項目。表的(水平方向)稱為記錄,它相當於一條數據。

關係資料庫必須以行為單位進行數據讀寫。

一個單元格中只能輸入一個數據。

2.SQL 語句及其種類

​ SQL是為操作資料庫而開發的語言。

​ SQL通過一條語句來描述想要進行的操作,發送給RDBMS。

​ SQL根據操作目的可以分為DDL、DML和DCL。

​ SQL 用關鍵字、表名、列名等組合而成的一條語句(SQL 語句)來

描述操作的內容。

2.1.DDL

​ DDL(Data Definition Language,數據定義語言) 用來創建或者刪除存儲數據用的資料庫以及資料庫中的表等對象。

create :創建資料庫和表等對象
drop :刪除資料庫和表等對象
alert :修改資料庫和表等對象的結構
2.2 DML

​ DML(Data Manipulation Language,數據操縱語言) 用來查詢或者變更表中的記錄。

select:查詢表中的數據
insert:向表中插入新數據
updata:更新表中的數據
delete:刪除表中的數據
2.3DCL

​ DCL(Data Control Language,數據控制語言) 用來確認或者取消對資料庫中的數據進行的變更。除此之外,還可以對RDBMS 的用戶是否有許可權操作資料庫中的對象(資料庫表等)進行設定。

commit: 確認對資料庫中的數據進行的變更
rollback: 取消對資料庫中的數據進行的變更
grant: 賦予用戶操作許可權
revoke: 取消用戶的操作許可權

3.表的創建

3.1創建資料庫
create database  <資料庫名稱>;
例:create database shop;
3.2創建表
create table <表名>
(<列名1> <數據類型> <該列所需約束>,
<列名2> <數據類型> <該列所需約束>,
<列名3> <數據類型> <該列所需約束>,
<列名4> <數據類型> <該列所需約束>,
.. .
<該表的約束1>, <該表的約束2>,……)
例:
create table product
(product_id char(4) not null,
product_name varchar(100) not null,
product_type varchar(32) not null,
sale_price integer,
purchase_price interge ,
regist_date data ,
primary key (product_id));
<列名1> <數據類型> <該列所需約束> l<列名2> <數據類型> <該列所需約束> ... <該表的約束1> ...

4.數據類型的指定

詳細

部分數據類型

數值:tinyint、int 、bigint float、double、decimal

字元串:char、varchar、text

時間類型:data 、time、datatime、timestamp

枚舉和集合類型:enum、set

4.1 tinyint型

tinyint[(m)] [unsigned] [zerofill] []表示可選

有符號:-128 ~ 127 無符號:0 ~ 255,SQL中無布爾值,使用tinyint(1)構造。

用1代表TRUE,0代表FALSE,boolean在MySQL里的類型為tinyint(1),
MySQL里有四個常量:true,false,TRUE,FALSE,它們分別代表1,0,1,0

mysql> create table t2(YON boolean);
Query OK, 0 rows affected (0.04 sec)

mysql> insert into t2(YON) values(true);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t2;
+------+
| YON  |
+------+
|    1 |
+------+
mysql> create table t3(YON tinyint(1));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t3(YON) values(true);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t3;
+------+
| YON  |
+------+
|    1 |
+------+
mysql> create table t4(YON tinyint(1));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t4(YON) values(0);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t4;
+------+
| YON  |
+------+
|    0 |
+------+
1 row in set (0.00 sec)

4.2 int型

​ 用來指定存儲整數的列的數據類型(數字型),不能存儲小數。int(5),5表示的是顯示長度,其它的數據類型中都是存儲寬度,所以我們來設計表的時候 int類型的欄位不用加顯示寬度,預設是總長度的位數+1。負數不能zerofill

mysql> create table t2(number int(1));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t2(number) values(123);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t2;
+--------+
| number |
+--------+
|    123 |
+--------+
1 row in set (0.00 sec)

4.3 float型

float[(m,d)] [unsigned] [zerofill]

M是全長,D是小數點後個數。m最大值為255,d最大值為30

mysql> create table t4(digite float(6,3) zerofill);
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t4(digite) values(1.2);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t4;
+--------+
| digite |
+--------+
| 01.200 |
+--------+
4.4 char型

​ char 是character(字元)的縮寫,是用來指定存儲字元串的列的數據類型(字元型)。可以像char(10) 或者char(200) 這樣,在括弧中指定該列可以存儲的字元串的長度(最大長度)。字元串超出最大長度的部分是無法輸入到該列中的。

字元串以定長字元串的形式存儲在被指定為char型的列中。所謂定長字元串,就是當列中存儲的字元串長度達不到最大長度的時候,使用半形空格進行補足。例如,我們向char(8) 類型的列中輸入'abc'的時候,
會以'abc'(abc 後面有5 個半形空格)的形式保存起來。

​ 在檢索或者說查詢時,查出的結果會自動刪除尾部的空格,除非我們打開pad_char_to_full_length SQL模式(設置SQL模式:SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';)

4.5 varchar型

​ 同char 類型一樣,varchar 型也是用來指定存儲字元串的列的數據類型(字元串類型),也可以通過括弧內的數字來指定字元串的長度(最大長度)。但該類型的列是以 可變長字元串 的形式來保存字元串的定長字元串在字元數未達到最大長度時會用半形空格補足,但可變長字元串不同,即使字元數未達到最大長度,也不會用半形空格補足。例如,我們向varcha(8) 類型的列中輸入字元串'abc'的時候,保存的就是字元串'abc'。創建表時,定長的類型往前放,變長的往後放

mysql> create table t1(x char(5),y varchar(5));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t1 values('abc ','abc ');
Query OK, 1 row affected (0.00 sec)

mysql> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode                                 |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)
#檢索時char類型的數據時,不會把末尾的空格計入字元長度(包括自己創建的)
mysql> select x,char_length(x),y,char_length(y) from t1;
+------+----------------+------+----------------+
| x    | char_length(x) | y    | char_length(y) |
+------+----------------+------+----------------+
| abc  |              3 | abc  |              4 |
+------+----------------+------+----------------+
1 row in set (0.00 sec)

mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
Query OK, 0 rows affected (0.00 sec)

mysql> select @@sql_mode;
+-------------------------+
| @@sql_mode              |
+-------------------------+
| PAD_CHAR_TO_FULL_LENGTH |
+-------------------------+
1 row in set (0.00 sec)

mysql> select x,char_length(x),y,char_length(y) from t1;
+-------+----------------+------+----------------+
| x     | char_length(x) | y    | char_length(y) |
+-------+----------------+------+----------------+
| abc   |              5 | abc  |              4 |
+-------+----------------+------+----------------+

關於:sql_mode

4.5 時間
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 時間值或持續時間
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和時間值
TIMESTAMP 4 1970-01-01 00:00:00/2038 結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和時間值,時間戳
mysql> create table t3(y year,d date,dt datetime,t time);
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t3(y,d,dt,t) values(now(),now(),now(),now());
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from t3;
+------+------------+---------------------+----------+
| y    | d          | dt                  | t        |
+------+------------+---------------------+----------+
| 2019 | 2019-08-21 | 2019-08-21 21:14:43 | 21:14:43 |
| 2019 | 2019-08-21 | 2019-08-21 21:14:55 | 21:14:55 |
+------+------------+---------------------+----------+
4.6 enum和set
mysql> create table t5(id int,se enum('man','woman'));
Query OK, 0 rows affected (0.03 sec)
#插入值從enum中單選
mysql> insert into t5(id,se) values(1,'man');
Query OK, 1 row affected (0.00 sec)

mysql> create table t6(id int,hobby set('sing','dance','rap'));
Query OK, 0 rows affected (0.04 sec)
#插入值從set中可多選,註意這裡的語法。
mysql> insert into t6(id,hobby) values(1,'sing,rap');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t6;
+------+----------+
| id   | hobby    |
+------+----------+
|    1 | sing,rap |
+------+----------+

5.約束的設置

​ 約束是除了數據類型之外,對列中存儲的數據進行限制或者追加條件的功能,保證數據的完整性和一致型

​ 另外,在創建product 表的create table語句的後面,還有下麵這樣的記述。primary key (product_id)這是用來給product_id 列設置主鍵約束的。所謂鍵,就是在指定特定數據時使用的列的組合。鍵種類多樣,主鍵(primary key)就是可以特定一行數據的列。也就是說,如果把product_id 列指定為主鍵,就可以通過該列取出特定的商品數據了。反之,如果向product_id 列中輸入了重覆數據,就無法取出唯一的特定數據了(因為無法確定唯一的一行數據)。這樣就可以為某一列設置主鍵約束了。

5.1 null和default

​ null 是代表空白(無記錄)的關鍵字。在null 之前加上了表示否定的not,就是給該列設置了不能輸入空白,也就是必須輸入數據的約束(如果什麼都不輸入就會出錯)。

​ default預設值,當插數據時未主動設置值時,則自動添加預設值。

mysql> create table t1(product_id int not null,pruduct_name char(10) default 'unknow');
Query OK, 0 rows affected (0.06 sec)
mysql> insert into t1(product_id) values(1);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t1;
+------------+--------------+
| product_id | pruduct_name |
+------------+--------------+
|          1 | unknow       |
+------------+--------------+

mysql> create table t2(id int not null default 0);
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t2 values();
Query OK, 1 row affected (0.00 sec)

mysql> select * from t2;
+----+
| id |
+----+
|  0 |
+----+
5.2 unique

​ unique表示該列唯一,可添加多列。如果在表的最後面單獨設置,例:unique(id,name)表示組合唯一,id與name有一個不同即可插入。

mysql> create table t3(id int,name char(5),unique(id,name));
Query OK, 0 rows affected (0.05 sec)

mysql> insert into t3(id,name) values(1,'a'),(2,'a');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into t3(id,name) values(1,'a');
ERROR 1062 (23000): Duplicate entry '1-a' for key 'id'
5.3 primary key

在MySQL的一個表中只有唯一的一個主鍵,不能有多列主鍵,但可以有複合主鍵

一個表中可以:單列做主鍵 、多列做主鍵(複合主鍵)

約束:等價於 not null unique,欄位的值不為空且唯一

存儲引擎預設是(innodb):對於innodb存儲引擎來說,一張表必須有一個主鍵。

mysql> create table t4(id int ,name char,primary key(id));
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t4(id,name) values(1,'a');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t4(id,name) values(1,'b');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> insert into t4(name) values('c');
ERROR 1364 (HY000): Field 'id' doesn't have a default value
5.4 auto_increment

約束的欄位為自動增長,約束的欄位必須同時被key約束

mysql> create table t5(id int primary key auto_increment,name char(5));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t5(name) values('a');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t5(name) values('b');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t5;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
+----+------+
2 rows in set (0.00 sec)

mysql> delete from t5;
Query OK, 2 rows affected (0.00 sec)
#即使被刪除(delete),欄位仍然繼續增加,如果使用truncate,則不會。
mysql> insert into t5(name) values('d');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t5;
+----+------+
| id | name |
+----+------+
|  3 | d    |
+----+------+
5.5外鍵

1.創建被關聯的表

2.創建關聯表

3.向被關聯的表插入數據

4.向關聯表插入數據

mysql> create table department(seq int primary key auto_increment,name varchar(20) not null);
Query OK, 0 rows affected (0.05 sec)

mysql> create table staff(id int primary key,name char(10),dep_seq int,constraint fk foreign key(dep_seq) references department(seq));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into department(name) values('生產部'),('技術部'),('銷售部'),('財務部');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> insert into staff(id,name,dep_seq) values(1,'趙',2),(2,'錢',3);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from department;
+-----+-----------+
| seq | name      |
+-----+-----------+
|   1 | 生產部    |
|   2 | 技術部    |
|   3 | 銷售部    |
|   4 | 財務部    |
+-----+-----------+
4 rows in set (0.00 sec)

mysql> select * from staff;
+----+------+---------+
| id | name | dep_seq |
+----+------+---------+
|  1 | 趙   |       2 |
|  2 | 錢   |       3 |
+----+------+---------+
2 rows in set (0.00 sec)

#如果被關聯的表中的某條數據被關聯,則該行無法刪除
#創建關聯表時添加同步刪除和同步更新,再去刪被關聯表的記錄,關聯表中的記錄也跟著刪除和更新。
 create table staff(id int primary key,name char(10),dep_seq int,constraint fk foreign key(dep_seq) references department(seq) on delete cascade on update cascade);


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

-Advertisement-
Play Games
更多相關文章
  • 需求1:新建除了root之外的新用戶,並且新用戶具有root用戶的相關功能 1.首先修改/etc/sudoers文件具有寫入的許可權 chmod 777 /etc/sudoers 2.修改/etc/sudoers vim /etc/sudoers,定位到如下行: ## Allow root to ru ...
  • 備份資料庫/usr/local/mysql5.5/bin/mysqldump -uroot -p1234abcd wordpress >~/wordpress_20151206.sql59 23 * * * /usr/local/mysql5.5/bin/mysqldump -uroot -p123 ...
  • 1.進程管理 psps --help 列印當前的進程信息ps -a 列印所有進程信息ps -e 列印所有進程信息 用的最多ps -eu 列印所有進程信息(更便捷的顯示方式)2.需要在進程中挑出我們需要管理的進程ps -e | grep mysqld3.kill進程典型需要kill關閉進程kill:向 ...
  • 0. 基本概念 一個【傳輸】(控制、批量、中斷、等時):由多個【事務】組成; 一個【事務】(IN、OUT、SETUP):由一多個【Packet】組成。 USB數據在【主機軟體】與【USB設備特定的端點】間被傳輸。【主機軟體】與【USB設備特定的端點】間的關聯叫做【pipes】。一個USB設備可以有多 ...
  • 轉自Clement-Xu的csdn博客 http://blog.csdn.net/clementad/article/details/41620631 Apache在Linux系統中,其實叫“httpd”,可以使用yum來安裝。 1、查看httpd包是否可用: # yum list | grep h ...
  • 1、某進程1執行 SETNX lock 以嘗試獲取鎖 2、由於某進程2已獲得了鎖,所以進程1執行 SETNX lock 返回0,即獲取鎖失敗 3、進程1執行 GET lock 來檢測鎖是否已超時,如果沒超時,則線程等待一段時間,再次檢測 4、如果進程1檢測到鎖已超時,即當前的時間大於鍵 lock 的 ...
  • [20190821]關於CPU成本計算.txt--//有人問鏈接http://blog.itpub.net/267265/viewspace-2653964/中CPU成本如何計算的,實際上一般在優化中考慮這個細節很少,--//因為CPU COST占整個COST的比例很少,至於如何計算說複雜很複雜,說 ...
  • MySql學習筆記1 1.SQL 分類 1. DDL(Data Definition Language)數據定義語言 2. DML(Data Manipulation Language)數據操作語言 3. DQL(Data Query Language)數據查詢語言 4. DCL(Data Cont ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...