(三十五)數據庫

1、什麼是數據庫mysql

數據庫管理系統(英語:Database Management System,簡稱DBMS)是爲管理數據庫而設計的電腦軟件系統,通常具備存儲、截取、安全保障、備份等基礎功能。sql

2、簡單使用數據庫

  1. 啓動/關閉服務

     net start mysql(這個是啓動mysqld,在mysqld  --install  <能夠本身設置名字>)windows

     net stop mysql 關閉服務。安全

  1. 直接使用mysql -uroot -p 命令打開,而後會讓用戶輸入密碼。接着就會進入了,而後就能夠開始建庫,建表,輸入數據,修改數據,最後刪表,刪庫走人。
  2. 修改密碼

1)在cmd窗口下,不須要鏈接到mysql裏面,也就在外部執行的指令mysqladmin -u root -p舊密碼 password 新密碼 -----這種方式在沒有配置my.ini文件前使用,若是一旦配置了,就不生效了。服務器

2set password for root@localhost = password(‘123’) -----進入mysql後才能夠修改。session

3use mysql;  update user set password=password(‘123’) where user = ‘root’;-------直接修改mysql數據庫,修改用戶的密碼。less

4)忘記root密碼修改密碼(windows):函數


     1. 關閉正在運行的MySQL服務,net stop mysql(這個mysql是你添加的mysqld到系統服務時的服務名)。 
    2. 打開DOS窗口,轉到mysql\bin目錄。 
    3. 輸入mysqld --skip-grant-tables 回車。--skip-grant-tables 的意思是啓動MySQL服務的時候跳過權限表認證,由於之因此mysql啓動以後,客戶端鏈接的時候須要登錄認證,輸入密碼什麼的,是由於mysql服務端啓動的時候,加載了本身內部的一些權限相關信息的受權表、權限認證表什麼的,這樣就要求客戶端必須有認證,若是啓動的時沒有加載這些表和設置,那麼咱們客戶端再進行登錄的時候,就不須要認證了,那麼就能夠登錄上了,登錄以後,咱們到mysql這個存有全部用戶信息的表中去修改root用戶或者別的用戶的密碼了,仍是比較6的,可是這樣搞須要關閉服務端,在實際工做中想關閉mysql服務??你以爲可能嗎??記住這個問題,我後面給你們解決。 ui

   注意一個問題,若是咱們直接使用的上面這個指令,也便是mysqld --skip-grant-tables,也就是直接經過mysqld啓動的mysql服務的話,咱們就不能經過net stop mysql的方式來關閉mysql服務了。可是能夠經過別的方式來關閉,我在安裝mysql的那篇博客裏面寫到了,殺進程的方式,知道你確定忘記了,再給你寫一下(win10):tasklist |findstr mysqld找到這個mysqld服務的端口號,而後taskkill /F /PID 端口號來殺死這個mysql服務的進行,之後就可使用net start/stop mysql的方式來啓動和關閉了。

                        

 

               4. 再開一個DOS窗口(由於剛纔那個DOS窗口已經不能動了),轉到mysql\bin目錄。 
    5. 輸入mysql回車,若是成功,將出現MySQL提示符 > 
    6. 鏈接權限數據庫: use mysql;  
    6. 改密碼:update user set password=password("123") where user="root";(別忘了最後加分號) 。 
    7. 刷新權限(必須步驟):flush privileges; 。凡是涉及到密碼修改或者後面咱們會學到的權限修改,修改完以後所有要再執行一下這一句。 
    8. 退出 quit 
    9. 註銷系統,再進入,使用用戶名root和剛纔設置的新密碼123登陸。

 

(5)在初始文件中設置帳號密碼

 

                                                                                                           

在這個根目錄下找my.ini,若是沒有就本身建立一個,文件名是my,文件的後綴名是ini。在裏面配置一句話:

[mysql]

user=root #root是用戶名

password=000  #這裏的000就是密碼

#配置客戶端鏈接的時候,指定一下用戶名和密碼,那麼咱們在進行mysql客戶端鏈接的時候,直接輸入mysql而後回車就能夠了,而且用戶是咱們指定的root用戶。

 

3、設置字符集

 

     在咱們建立數據庫和表時,mysql會爲咱們默認配置一個字符集----latin1。可是咱們把漢字存入數據庫後,就會亂碼。爲了解決這個問題,下面設置一下編碼問題。

 

  1. 在插入數據以前,先執行一條指令:set  names  latin1;」,臨時修改客戶端的字符集,可是當關閉DOS窗口,再次進來添加漢字時,仍是會亂碼。
  2. 在配置文件裏面修改客戶端和服務端參數,能夠實現set names latin1;的效果,而且永久生效。

 

     這句話放在[mysql]default-character-set=utf8

 

再添加上下面三行,爲服務器設置編碼格式:

 

[mysqld]

character_set_server=utf8

collation-server=utf8_general_ci

 

 #就是一個校對規則,通常默認都是這個,若是不是就改爲這個就能夠了,因此直接寫上就好了,這個規則後面咱們會講的~~~

 

添加下面兩行目的是爲了,來客戶端了解時,編碼設置爲utf-8:

 

[client]

default-character-set=utf8

上面內容最好放到[mysqld]上面,不然可能會報出下面的錯誤:

mysql: unknown variable 'sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES'

 

來張圖卡一下:

 

                    

 

上面的文件配置完畢後,須要重啓一下服務,而後再次進來時,就不須要輸入mysql -uroot -p ,直接輸入mysql就能夠進入了。

 

4、基本數據類型

 

    數值類型(整數類型,浮點類型),字符類型,日期時間類型,枚舉類型,集合類型

 

  1. 數據類型

                                                                              

2.日期類型

     YEAR

            YYYY(範圍:1901/21552018

 

        DATE

            YYYY-MM-DD(範圍:1000-01-01/9999-12-31)例:2018-01-01

 

        TIME

            HH:MM:SS(範圍:'-838:59:59'/'838:59:59')例:12:09:32

 

        DATETIME

            YYYY-MM-DD HH:MM:SS(範圍:1000-01-01 00:00:00/9999-12-31 23:59:59    Y)例: 2018-01-01 12:09:32

 

        TIMESTAMP

            YYYYMMDD HHMMSS(範圍:1970-01-01 00:00:00/2037 年某時)

3.字符串類型

Char varchar,前者是不可變長的,定義爲多少,在內存中就佔多少;varchar是可變長度的,可是爲了讀取準確,會在每一個字符串前面添加一個這個字符串長度的記錄,所以也佔了一位。

看下錶,說明了這二者的特色與區別:

                                                        

再來看看其餘的字符串類型:

                                                   

二者的區別:1.讀取速度char大於varchar,由於varchar讀取時還得使用開始的長度;2.存儲方式,char根據寬度開闢存儲空間能夠按照寬度直接取值,varchar會按照存入的長度進行開闢空間,爲了識別存入的內容會在最開始的位置添加此段內容的長度。3.char在存儲空間的寬度是不可變的,varchar是可變的。

4.枚舉類型和集合類型

 

枚舉類型(enum)
An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.) 示例: CREATE TABLE shirts ( name VARCHAR(40), size ENUM('x-small', 'small', 'medium', 'large', 'x-large') ); INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');

 

  

集合類型(set)
            A SET column can have a maximum of 64 distinct members.
            示例:
                CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
                INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');

  

5.嚴格模式

嚴格模式若是級別較低,有些狀況下會致使明明錯了,可是卻並不會報錯。例如:設置了,字段不爲空,可是若是模式不嚴格,那麼不會報錯,int型的會默認給個0,其餘的會默認給個NULL

 

好了設置一下模式吧:

 

 方式一先執行select @@sql_mode,複製查詢出來的值並將其中的NO_ZERO_IN_DATE,NO_ZERO_DATE刪除,而後執行set sql_mode = '修改後的值'或者set session sql_mode='修改後的值';,例如:set session sql_mode='STRICT_TRANS_TABLES';改成嚴格模式

 

        此方法只在當前會話中生效,關閉當前會話就不生效了。

 

方式二先執行select @@global.sql_mode,複製查詢出來的值並將其中的NO_ZERO_IN_DATE,NO_ZERO_DATE刪除,而後執行set global sql_mode = '修改後的值'

 

        此方法在當前服務中生效,從新MySQL服務後失效

 

 

 

方法三mysql的安裝目錄下,或my.cnf文件(windows系統是my.ini文件),新增 sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

 

        添加my.cnf以下:

 

        [mysqld]

 

        sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER

 

 

 

        而後重啓mysql

 

    此方法永久生效.固然生產環境上是禁止重啓MySQL服務的,因此採用方式二加方式三來解決線上的問題,那麼即使是有一天真的重啓了MySQL服務,也會永久生效了。

 

 

 

sql_mode經常使用值以下: 
    ONLY_FULL_GROUP_BY:
    對於GROUP BY聚合操做,若是在SELECT中的列,沒有在GROUP BY中出現,那麼這個SQL是不合法的,由於列不在GROUP BY從句中
 
    NO_AUTO_VALUE_ON_ZERO:
    該值影響自增加列的插入。默認設置下,插入0或NULL表明生成下一個自增加值。若是用戶 但願插入的值爲0,而該列又是自增加的,那麼這個選項就有用了。
 
    STRICT_TRANS_TABLES:
    在該模式下,若是一個值不能插入到一個事務表中,則中斷當前的操做,對非事務表不作限制
    NO_ZERO_IN_DATE:
    在嚴格模式下,不容許日期和月份爲零
 
    NO_ZERO_DATE:
    設置該值,mysql數據庫不容許插入零日期,插入零日期會拋出錯誤而不是警告。
 
    ERROR_FOR_DIVISION_BY_ZERO:
    在INSERT或UPDATE過程當中,若是數據被零除,則產生錯誤而非警告。如 果未給出該模式,那麼數據被零除時MySQL返回NULL
 
    NO_AUTO_CREATE_USER:
    禁止GRANT建立密碼爲空的用戶
 
    NO_ENGINE_SUBSTITUTION:
    若是須要的存儲引擎被禁用或未編譯,那麼拋出錯誤。不設置此值時,用默認的存儲引擎替代,並拋出一個異常
 
    PIPES_AS_CONCAT:
    將"||"視爲字符串的鏈接操做符而非或運算符,這和Oracle數據庫是同樣的,也和字符串的拼接函數Concat相相似
 
    ANSI_QUOTES:
    啓用ANSI_QUOTES後,不能用雙引號來引用字符串,由於它被解釋爲識別符

  

5、數據庫操做

  1. 建立數據庫

CREATE DATABASE 數據庫名 <charset utf8,若是my.ini已經配置過,不須要。沒有配置過,能夠寫,也能夠不寫。>

         2.數據庫命名規則

      能夠由字母、數字、下劃線、@、#、$

      區分大小寫

      惟一性

      不能使用關鍵字如 create select等

      不能單獨使用數字

      最長128

         3.數據庫相關操做

   1) 查看數據庫

show databases;

show create database 數據庫名;

select database();

          2) 選擇數據庫

USE 數據庫名

          3) 刪除數據庫

DROP DATABASE 數據庫名;

          4) 修改數據庫

alter database 數據庫名 charset utf8;

 

6、表操做

 

  1. 存儲引擎便是表類型,mysql根據不一樣的表類型會有不一樣的處理機制。

  如今經常使用的引擎有:InnoDB,MyISAM等。如今,mysql默認使用的是InnoDB,這種引擎,這種引擎,使用的是行鎖定,也就是若是有一個客戶端使用某一行數據了,其餘的客戶端就不能使用。支持事物處理。

  MyISAM支持表鎖定。

  1. 新建表

  #語法:

create table 表名(

字段名1 類型[(寬度) 約束條件],

字段名2 類型[(寬度) 約束條件],

字段名3 類型[(寬度) 約束條件]

);

#注意:

(1)在同一張表中,字段名是不能相同

(2)寬度和約束條件可選、非必須,寬度指的就是字段長度約束,例如:char(10)裏面的10

(3) 字段名和類型是必須的

例如:

 

mysql> create table t1(  
    -> id int, 
    -> name varchar(50),
    -> sex enum('male','female'),
    -> age int(3)
    -> );

  

注意:每一個字段後面都要使用逗號隔開,最後結尾時,要使用分號。逗號和分號都是英文狀態下的。

3.插入數據到表中

插入數據的sql語句:

 

mysql> insert into t1 values
    -> (1,'zhangsan',18,'male'),
    -> (2,'lisi',81,'female')
    -> ;

 

  

注意:插入的每條消息後都要使用逗號分隔,最後結尾時使用分號。逗號和分號也必須是英文狀態下的。

4.查看錶結構

(1)describe t1; #查看錶結構,可簡寫爲:desc 表名
會展現出來表中字段的信息和一切要求。
(2)show create table t1\G; #查看錶詳細結構,可加\G

  

5.表的完整性約束

 

1)not null 與default
       create table tb1(
     nid int not null defalut 2,#nid設置爲int型,不可爲空(not null),default 默認值設置爲2
     num int not null #num設置爲int型,而且不可爲空
  	     );
(2)unique----惟一
   1)設置惟一
    方法一:
create table department1(
id int,
name varchar(20) unique,#name字段必須是惟一的不可重複的
comment varchar(100)
);


方法二:
create table department2(
id int,
name varchar(20),
comment varchar(100),
constraint uk_name unique(name)#name字段必須是惟一的不可重複的
);
2)聯合惟一
  create table service(
id int primary key auto_increment,
name varchar(20),
host varchar(15) not null,
port int not null,
unique(host,port) #聯合惟一);#二者必須同時與已存在的數據同樣時纔會報錯

 

  

7、修改表

語法:1. 修改表名
      ALTER TABLE 表名 
                          RENAME 新表名;
2. 增長字段
      ALTER TABLE 表名
                          ADD 字段名  數據類型 [完整性約束條件…], #注意這裏能夠經過逗號來分割,一下添加多個約束條件                          ADD 字段名  數據類型 [完整性約束條件…];
      ALTER TABLE 表名
                          ADD 字段名  數據類型 [完整性約束條件…]  FIRST; #添加這個字段的時候,把它放到第一個字段位置去。      ALTER TABLE 表名
                          ADD 字段名  數據類型 [完整性約束條件…]  AFTER 字段名;#after是放到後的這個字段的後面去了,咱們經過一個first和一個after就能夠將新添加的字段放到表的任意字段位置了。
                            
3. 刪除字段
      ALTER TABLE 表名 
                          DROP 字段名;
4. 修改字段
      ALTER TABLE 表名 
                          MODIFY  字段名 數據類型 [完整性約束條件…];
      ALTER TABLE 表名 
                          CHANGE 舊字段名 新字段名 舊數據類型 [完整性約束條件…];  #change比modify還多了個更名字的功能,這一句是隻改了一個字段名      ALTER TABLE 表名 
                          CHANGE 舊字段名 新字段名 新數據類型 [完整性約束條件…];#這一句除了改了字段名,還改了數據類型、完整性約束等等的內容
相關文章
相關標籤/搜索