MySQL學習-入門語句以及增刪查改

1. SQL入門語句

SQL,指結構化查詢語言,全稱是 Structured Query Language,是一種 ANSI(American National Standards Institute 美國國家標準化組織)標準的計算機語言,可讓咱們能夠處理數據庫。python

SQL語句主要分爲:mysql

  • DQL:數據查詢語言,用於對數據進行查詢,如select
  • DML:數據操做語言,對數據進行增長、修改、刪除,如insert、udpate、delete
  • DDL:數據定義語言,進行數據庫、表的管理等,如create、drop
  • TPL:事務處理語言,對事務進行處理,包括begin transaction、commit、rollback
  • DCL:數據控制語言,進行受權與權限回收,如grant、revoke
  • CCL:指針控制語言,經過控制指針完成表的操做,如declare cursor

1.1 經常使用入門語句

mysql -uroot -p密碼      命令行連接 mysql

status;                   查看數據狀態信息

exit、quit               退出數據庫鏈接

show databases;           顯示全部的數據庫

create database data charset=utf8;      新建立一個數據庫

use 數據庫名;                 選擇要編輯的數據庫,例如是data,則語句就是 use data;

select database();        查看當前在哪一個數據庫下

show tables;             展現數據庫下全部的表

\c                                     當你輸入有誤,想重打的時候能夠試試加個 \c 取消  

source 數據庫文件名.sql;                 導入數據庫到mysql中
                                       能夠把別人事先建立好的數據庫文件導入到當前電腦的mysql中
desc `表名`; /describe ‘表名’           查看錶結構信息

鍵盤的上下鍵,能夠快速滾回咱們以前輸入的代碼。

1.2 SQL語句劃分以及命名規則

基本書寫規則sql

  • 每一條語句都要以」 ; 」英文分號結尾
  • SQL語句不區分關鍵字的大小寫,可是建議屬於SQL語句的語法規則用大寫,自建的表,字段用小寫
  • 字符串跟日期的類型的值都要以單引號括起來
  • 單詞之間須要使用半角的空格隔開
  • 咱們能夠經過使用’’反引號來括起來表名跟字段名,避免關鍵字衝突

2.DQL數據查詢語句

(1.)查詢select數據庫

select 字段1,字段2 from 表名 從指定表中查詢全部數據的字段1和字段2信息服務器

(2.)按條件查詢數據函數

select 字段1,字段2 from 表名 WHERE 字段名 = 字段值;性能

1、查找學生表的姓名跟年齡
     SELECT name,age FROM student;
   查找課程表中的id,課程名稱和教室編號
     select id,course,address from course;
     
2、查找學生表全部的信息
    SELET * FROM student;

3、爲字段名設置別名,簡化字段名
    SELECT name AS n,age AS a FROM student;

4、使用條件查詢想要的數據,查學號爲14的學生姓名
    SELECT name FROM student WHERE id = 14;
    
  使用條件查詢名字叫'吳傑'的學生姓名和年齡
    SELECT name,age FROM student WHERE name='吳傑';

注意:應該根據你的實際需求查詢所要的字段值,而不是使用 * ,使用這個效率很低。

(3.)邏輯運算符學習

image

1、查詢年齡大於10歲小於18歲的學生
      SELECT * FROM student WHERE age<18 ADN age>10;
   查詢年齡小於18歲 或者性別是女的學生
      select name,age,description as des from student where age<18 or sex=2;
   查詢年齡在18-22之間的女生信息(班級、姓名、年齡和性別)
      select class,name,age,sex from student where age>=18 and age<=22 and sex=2;
   查詢309班的全部男生信息(姓名、年齡、個性簽名)
      select name,age,description from student where class=309 and sex=1;
   查詢306班、305班、304班的學生信息(姓名、年齡、個性簽名)
      select name,age,description from student where class=304 or class=305 or class=306;

(4.)範圍運算符(between…and…)ui

判斷字段值是否在指定區間內編碼

1、 查詢年齡在18-22之間的學生(班級、姓名、年齡和性別)
    SELECT class,name,age,sex FROM student WHERE age BETWEEN 18 AND 22;  
2、 固然,反過來查的話,查詢18-22歲之外的學生
    SELECT class,name,age,sex FROM student WHERE NOT age BETWEEN 18 AND 22;

(5.)比較運算符

image

1、查詢小於等於19歲的學生
    SELECT *  FROM student WHERE age<=18;

(6.)in運算符(多條件值查詢)

IN 運算符 容許在 WHERE 子句中規定多個值。

1、查詢304,305和306班級的學生信息
     select name,class,age from student where class IN (304,305,306)
     
2、查詢學號爲 13、5的學生信息
    SELECT * FROM student WHERE id IN(1,3,5);

(7.)模糊查詢

LIKE 運算符 容許咱們針對只知道部分字符串的狀況下,查找全部的字符串,進行模糊查找

% 匹配任意多個字符 陳% _     匹配任意一個字符 陳__

1、查詢姓陳的學生
    SELECT * FROM student WHERE name LIKE '陳%';
   查找名字以風字結尾的學生
    select * from student WHERE name LIKE '%風';

2、查詢姓名中帶林的學生
   select * from student where name LIKE '%林%';
     
   查詢姓名是2個文字組成的學生
   select * from student where name LIKE '__';

(8.)聚合計算

  • AVG 返回指定列的平均值
  • COUNT 返回指定列中非NULL值的個數
  • MIN 返回指定列的最小值
  • MAX 返回指定列的最大值
  • SUM 返回指定列的全部值之和

聚合運算都是寫在select 後面  SELECT COUNT("字段") FROM 表名 WHERE 條件;

1、查詢305班全部的學生數量
   select COUNT(id) from student where class=305;
   # 上面查詢結果中,字段會變成COUNT('id'),可使用as別名來處理一下。
   select COUNT(id) as c from student where class=305;
   
2、查詢全部學生中最小的年齡
   SELECT MIN(age) FROM student;
   
3、查詢302班中全部學生的平均年齡。
   select AVG(age) from student where class=302;

(9.)分組查詢

GROUP BY子句, 能夠對錶進行分組,經常與聚合函數一塊兒使用

GROUP BY 字段名,當前這個字段名在表中出現多少個不一樣的字段值,那麼查詢結果就會有多少個組。

1、查詢表中有多少男女學生
   SELECT sex,count(sex) FROM student GROUP BY sex;
2、查詢學生表中各個年齡段的學生數量
   SELECT age,COUNT(name) FROM student GROUP BY age;
3、查詢各個班級的人數各是多少
   select class,COUNT(id) FROM student GROUP BY class;

(10.)查詢結果排序

  • ORDER BY 子句,對查詢結果排序
  • ASC表示升序(從小到大),爲默認值,
  • DESC爲降序(從大到小)
1、對309班級的學生的年齡進行倒敘排序
   select name,age,sex from student where class=309 order by age desc;

補充:

結果排序能夠多個字段排序

例如:對學生的年齡進行降序排列。

select id,name,sex from student order by age desc,id asc limit 10;
 
 # 上面就有2個排序的字段,
 # 系統會優先針對 age 進行降序排列,
 # 當age的值一致的時候,系統會按照id進行升序排列。

(11.)結果限制

LIMIT 子句,能夠對查詢出的結果進行數量限制,每每咱們不想一次取出全部的數據

limit有兩個使用方式:

  • limit後面跟着 一個參數 表示限制結果的數量
  • limit後面跟診 兩個參數,第一個參數表示取數據的開始下標[在表中下標從0開始],第二個參數表示限制結果的數量。
SELECT * FROM student LIMIT 3; // 等同於 limit 0,3    # 下標 0,1,2

SELECT * FROM student LIMIT 3,3; // 等同於 limit 3,3  # 下標 3,4,5

SELECT * FROM student LIMIT 6,3; // 等同於 limit 6,3  # 下標 6,7,8
1、查詢出年級最大的10個學生
    select * from student order by age desc,id asc limit 10;
2、從全部學生中,查詢年級最大的下標從10-19的學生出來。
       select id,name,age from student order by age desc,id asc limit 10,10;

limit 主要用於在項目開發中的分頁功能實現。

3.DML數據操做語句

3.1 添加數據(insert)

添加一名記錄

INSERT INTO 表名 (字段1,字段2,字段3,....) VALUES (字段值1,字段值2,字段值3,....);

# 也能夠省略不寫字段名,可是數據的數據項必須和表結構的字段數量保持一致,查詢表結構使用 desc 表名;
INSERT INTO 表名 VALUES (字段值1,字段值2,字段值3,....);
insert into student (id,name,sex,class,age,description) values (101,'劉德華',1,508,17,'給我一杯忘情水~');

# 上面的字段,若是是所有字段,那麼字段這一塊內容能夠省略不寫。
# 例如,咱們再次添加一個學生,若是省略了字段名,那麼填寫數據的數據項必須和表結構的字段數量保持一致。
insert into student values (102,'張學友',1,508,17,'愛就像頭餓狼~',0,0,0);


添加多名學生
INSERT INTO student(name,sex,class,age,description) VALUES ('周潤發',1,508,17,'5個A~'),('周杰倫',1,508,17,'給我一首歌的時間~');


注: 自動增加跟有默認值的字段能夠不寫。

3.2 更新數據(update)

UPDATE 表名 SET 字段1=字段值1,字段2=字段值2 WHERE 條件 
# 更新操做會影響數據的不可逆操做,因此更新的時候,必定要謹慎,添加條件。若是沒有條件,
# 或者條件的判斷結果一直是True,則整個表全部的記錄都會被更新。
修改學生的姓名,年齡
UPDATE student set age=8 where id=104;

3.3 刪除數據(delete)

DELETE FROM 表名 WHERE 條件

刪除一個學生
DELETE FROM student WHERE id=104;

注: 修改跟刪除數據都要記得加條件。

DELETE FROM table 刪除整個表的內容[沒有條件則表示刪除整個表全部數據],儘可能少用

4.DDL數據定義語言

4.1 建立表

CREATE TABLE 表名(
    字段名1 數據類型 約束規則,
    字段名2 數據類型,
    字段名3 數據類型,
    .....
    字段名N 數據類型,
    PRIMARY KEY(一個 或 多個 字段名)
);
# 上面語句中,最後一個小句子後面不能有英文逗號出現,前面的小句子必須加上英文逗號。

建立表

(1.)學生表

mysql> create table student(
    -> id int unsigned auto_increment not null, # 字段名 整型 無符號 自動增加 不能是空,
    -> name char(10),                           # 字段名 字符串(長度:10)
    -> sex int default 1,                       # 字段名 整型 默認值爲 1,
    -> class int,                               # 字段名 整型
    -> age int,                                 # 字段名 整型
    -> description text,                        # 字段名 文本[能夠填寫65535個字符]
    -> primary key(id)                          # 設置主鍵(id) 每一個表必須都有主鍵
    -> ) engine=innodb charset=utf8;            # 表引擎=innodb 編碼=utf8;[後面學習,先用]
Query OK, 0 rows affected (0.02 sec)            # 出現這句話,表示建立表成功

mysql> desc student; # 顯示錶結構
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| id          | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name        | char(10)         | YES  |     | NULL    |                |
| sex         | int(11)          | YES  |     | 1       |                |
| class       | int(11)          | YES  |     | NULL    |                |
| age         | int(11)          | YES  |     | NULL    |                |
| description | text             | YES  |     | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

(2.)班級表

create table classes(
    id int unsigned auto_increment primary key not null,
    name varchar(10)
);

(3.)課程表

create table `course`(
    id int unsigned not null auto_increment,
    course char(20) not null,
    lecturer int unsigned,
    address int unsigned,
    primary key(id)
) engine=innodb charset=utf8;

補充:顯示建表語句

show create table 表名 \G;
mysql> show create table course \G;
*************************** 1. row ***************************
       Table: course
Create Table: CREATE TABLE `course` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `course` char(20) NOT NULL,
  `lecturer` int(10) unsigned DEFAULT NULL,
  `address` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

其餘語句:

修改表-添加字段

alter table 表名 add 列名 類型;
例:
alter table students add birthday datetime;

修改表-修改字段:重命名版

alter table 表名 change 原名 新名 類型及約束;
例:
alter table students change birthday birth datetime not null;

修改表-修改字段:不重命名版

alter table 表名 modify 列名 類型及約束;
例:
alter table students modify birth date not null;

修改表-刪除字段

alter table 表名 drop 列名;
例:
alter table students drop birthday;

刪除表

drop table 表名;
例:
drop table students;

4.2 約束條件

4.2.1字段名

定義字段名,表名、數據庫名、規範:

在64個字符之內,建議簡短,若是不夠清晰,可使用前綴。

不能是關鍵字或者保留字

採用變量命名方式[ 由字母、數字、下劃線組成,不能以數字開頭 ]

4.2.2數據類型

瞭解數據的數據類型能夠經過如下語句來查看和使用幫助:

mysql> ? 查詢關鍵詞

# 若是,咱們但願瞭解關於int的能夠填值範圍
mysql> ? int

使用數據類型的原則:夠用就行,儘可能使用取值範圍小的,而不用大的,這樣能夠更多的節省存儲空間

  • 經常使用數據類型以下:

    • 整數:bit[0-64],tinyint, smallint, int

    • 小數:decimal

    • 字符串:varchar,char

    • 日期時間: date, time, datetime

    • 枚舉類型(enum) 多選一,例如性別字段 enum('男','女'),後面添加數據時,值得填寫只能'男'和'女'這兩項,其餘值填寫進來會報錯。

  • 特別說明的類型以下:

    • decimal表示浮點數,如decimal(5,2)表示共存5位數,小數佔2位

    • char表示固定長度的字符串,如char(3),若是填充'ab'時會補一個空格爲'ab '

    • varchar表示可變長度的字符串,如varchar(3),填充'ab'時就會存儲'ab'

    • 字符串text表示存儲大文本,當字符大於4000時推薦使用

    • 對於圖片、音頻、視頻等文件,不存儲在數據庫中,而是上傳到某個文件管理服務器上,而後在表中存儲這個文件的保存路徑

  • 更全的數據類型能夠參考http://blog.csdn.net/anxpp/article/details/51284106

(1.)數值類型-經常使用

image

(2.)小數類型

image

開發中,通常QQ號或者手機號都是使用字符串來保存的

(3.)字符串

image

在5.5版本的mysql之後,varchar類型能夠存儲的數據,能夠達到65535個字符。

(4.)日期時間類型

image

DATETIME 和 TIMESTAMP,不少時候,咱們會使用程序中的時間戳來代替,後面在數據庫中保存時設置字段的類型是數值型,這樣的話,能夠節省存儲空間,同時還能夠提升數據的讀取速度。

4.2.3 約束規則

  • 主鍵primary key:在表中區分每一行數據的惟一性的標誌服,數據在物理上存儲的順序

  • 非空not null:此字段不容許填寫空值,若是容許填寫空值,則直接不填not null

  • 唯一unique:此字段的值不容許重複

  • 默認default:當不填寫此值時會使用默認值,若是填寫時以填寫爲準

  • 外鍵 foreign key:用於鏈接兩個表的關係,對關係字段進行約束,當爲關係字段填寫值時,會到關聯的表中查詢時是否此值是否存在,若是存在則填寫成功,若是不存在則填寫失敗並拋出異常

  • 說明:雖然外鍵約束能夠保證數據的有效性,可是在進行數據的crud(create增長、update修改、delete刪除、read查詢)時,都會下降數據庫的性能,因此不推薦使用,那麼數據的有效性怎麼保證呢?答:能夠在python的邏輯層進行判斷控制[用代碼控制]

ok

相關文章
相關標籤/搜索