天天看點

MySQL

一:Mysql安裝

       #yum install mysql

  #yum install mysql-server

  #yum install mysql-devel

    啟動mysql

  #service mysqld start

  驗證安裝

      #mysql --version

  設定資料庫登入密碼

  #mysqladmin -u root password "new_password";

  密碼登入

  # mysql -u root -p 

     Enter password:*******

二:Mysql管理

  添加使用者   
  # mysql -u root -p
  mysql> use mysql;
  mysql> INSERT INTO user (host, user, password,select_priv, insert_priv, update_priv)VALUES ('localhost', 'guest',PASSWORD('guest123'), 'Y', 'Y', 'Y');
  mysql> FLUSH PRIVILEGES;
  注意:PASSWORD() 函數來對密碼進行加密。 你可以在以上執行個體看到使用者密碼加密後為: 6f8c114b58f2ce9e.
  注意:在注意需要執行 FLUSH PRIVILEGES 語句。 這個指令執行後會重新載入授權表。如果你不使用該指令,你就無法使用新建立的使用者來連接配接mysql伺服器,除非你重新開機mysql伺服器。
  
  配置檔案
  mysql配置檔案在/etc/my.cnf       
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid      
 管理mysql指令      
mysql> use RUNOOB;

mysql> SHOW DATABASES;

mysql> SHOW TABLES;      

      root密碼重置

#vim /etc/my.cnf      

       在[mysqld]下添加skip-grant-tables,然後儲存并退出

    重新開機mysql服務:service mysqld restart

三:Mysql連接配接

連接配接
# mysql -u root -p
退出
mysql> exit      

四:Mysql管理資料庫

  建立資料庫

  # mysqladmin -u root -p create RUNOOB

  删除資料庫

  #mysqladmin -u root -p drop RUNOOB

  備份資料庫

  #mysqldump -uroot -p -h127.0.0.1 --opt mysql  > mysql.sql

  修改資料庫密碼

  mysqladmin -u root password "新密碼"; 

五:資料類型

  大緻可以分為三類:數值、日期/時間和字元串(字元)類型。

        tinyint、smallint、mediumint、int、bigint、float、double、decimal

    數值

   

MySQL

   日期/時間

          data、time、year、datetime、timestamp

    

MySQL

   字元串

   char、varchar、tinyblob、tinytext、blob、text、mediumblob、mediumtext、longblob、longtext

   

MySQL

  最大整數:bigint

  最大字元串:longtext

六:表的增、删、查、改

6.1建立

CREATE TABLE IF NOT EXISTS `runoob_tbl`(
`runoob_id` INT UNSIGNED AUTO_INCREMENT,
`runoob_title` VARCHAR(100) NOT NULL,
`runoob_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `runoob_id` )
 )ENGINE=InnoDB DEFAULT CHARSET=utf8;      
create table yy5(id int,name varchar(20));      
解析:
      

      如果你不想字段為 NULL 可以設定字段的屬性為 NOT NULL, 在操作資料庫時如果輸入該字段的資料為NULL ,就會報錯。

      AUTO_INCREMENT定義列為自增的屬性,一般用于主鍵,數值會自動加1。

      PRIMARY KEY關鍵字用于定義列為主鍵。 您可以使用多列來定義主鍵,列間以逗号分隔。

      ENGINE 設定存儲引擎,CHARSET 設定編碼。

6.2删除

      DROP TABLE test;

           DELETE FROM runoob_tbl WHERE runoob_id=3;

6.3查詢

          select * from runoob_tbl;

6.4修改

     增加:

                  INSERT INTO runoob_tbl

      (runoob_title, runoob_author, submission_date)

      VALUES

      ("學習mysql","mysql",NOW());

                  修改:

           UPDATE runoob_tbl SET runoob_title='學習 C++' WHERE runoob_id=3;

 七:LIKE 子句

     7.1查詢user表中姓名中包含“王”字的:

        select * from user where name like '%王%';

     7.2查詢user表中姓名中沒有“王”字的:

        select * from user where name not like '%王%';

     7.3查詢user中姓名以“王”開頭的:

        select * from user where name not like '王%';

                  7.4查詢user中姓名以“王”結尾的:

        select * from user where name not like '%王';

     7.5查詢user表中位址在上海姓名中沒有“王”字和所有姓名為空的:

        select * from user where adress =‘上海’ and name not like '%王%' or name is null;

     7.6查詢user表中位址在上海姓名中沒有“王”字和位址在上海姓名為空的:

        select * from user where adress =‘上海’ and (name not like '%王%' or name is null);

八:union

    

MySQL
MySQL

    8.1求兩個table某列的交集

      SELECT country FROM Websites

      UNION

      SELECT country FROM apps

      ORDER BY country;

    8.2求兩個table某列的并集

      UNION ALL

九:排序-order by

      SELECT * from runoob_tbl ORDER BY submission_date ASC;           

      SELECT * from runoob_tbl ORDER BY submission_date DESC;

十:分組-group by

      GROUP BY 語句根據一個或多個列對結果集進行分組。

      在分組的列上我們可以使用 COUNT, SUM, AVG,等函數。

      

MySQL

     

      mysql> SELECT name, COUNT(*) FROM   employee_tbl GROUP BY name;
      +--------+----------+
      | name   | COUNT(*) |
      +--------+----------+
      | 小麗    |        1 |
      | 小明    |        3 |
      | 小王    |        2 |
      +--------+----------+
      3 rows in set (0.01 sec)      

十一:INNER JOIN

    Mysql和JOIN來進行多連接配接

    JOIN 按照功能大緻分為如下三類:

      INNER JION:内連接配接或者等值連接配接

      LEFT  JION:左連接配接

      RIGHT JION:右連接配接

    1: INNER JOIN 

                      SELECT

       a.runoob_id, a.runoob_author, b.runoob_count

       FROM

       runoob_tbl a INNER JOIN tcount_tbl b

       ON

       a.runoob_author = b.runoob_author;

       等價于-------------------------------------------------------

       SELECT

        a.runoob_id, a.runoob_author, b.runoob_count

        FROM

        runoob_tbl a, tcount_tbl b

        WHERE

        a.runoob_author = b.runoob_author;

    2: LEFT JOIN

      SELECT 
      a.runoob_id, a.runoob_author, b.runoob_count  
      FROM      
      runoob_tbl a LEFT JOIN tcount_tbl b 
      ON 
      a.runoob_author = b.runoob_author;
      

十二:Null空值

       mysql> SELECT * FROM runoob_test_tbl WHERE runoob_count IS NULL;

       mysql> SELECT * from runoob_test_tbl WHERE runoob_count IS NOT NULL;

十三:正規表達式

      MySQL中使用 REGEXP 操作符來進行正規表達式比對。

       1:找出字元串中以"st"開頭的字元串

        mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';

       2:找出字元串中以“st”結束的字元串

        mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

       3:找出字元串中包含'mar'的字元串

        mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';

十四:事務

       一般說來,事務滿足四個條件(ACID):Atomicity(原子性)、Consistency(穩定性)、Isolation(隔離性)、Durability(可靠性)

        1:事務的原子性:一組事務要麼成功,要麼失敗。

        2:穩定性:有非法資料(外鍵限制),事務撤回。

        3:隔離性:事務獨立運作,獨立撤回。

               4:可靠性:軟硬體崩潰後,InnoDB回依靠日志問價進行重構。

      事務控制語句

        1:開啟事務:begin或者start transaction

        2:送出事務:commit或者commit work,但二者不等價,commit會對資料庫進行徹底修改。

        3:rollback:復原使用者送出的資料,并進行停止正在進行的

        4:SAVEPOINT identifier:事務儲存點,一個事務可以擁有多個儲存點,

        5:RELEASE SAVEPOINT identifier;删除一個事務的儲存點,當沒有指定的儲存點時,執行該語句會抛出一個異常;

        6:ROLLBACK TO identifier:把事務復原到标記點;

        7:SET TRANSACTION;用來設定事務的隔離級别。InnoDB存儲引擎提供事務的隔離級别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。

        MYSQL 事務處理主要有兩種方法:

        1、用 BEGIN, ROLLBACK, COMMIT來實作

          BEGIN 開始一個事務

          ROLLBACK 事務復原

          COMMIT 事務确認

      2、直接用 SET 來改變 MySQL 的自動送出模式:

          SET AUTOCOMMIT=0 禁止自動送出

          SET AUTOCOMMIT=1 開啟自動送出

十五:ALTER指令

       1:ALTER TABLE 語句插入删除

        删除:ALTER TABLE testalter_tbl DROP i;

          增加: ALTER TABLE testalter_tbl ADD i INT;

        修改字段類型:

           modify:ALTER TABLE testalter_tbl MODIFY c CHAR(10);    修改c的類型為char(10)

           change:ALTER TABLE testalter_tbl CHANGE i j BIGINT;

        修改字段預設值:

           ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;

        删除字段預設值:

          ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;

        修改表名:

          alert table testalert_tbl rename to alter_test;

十六:索引

十七:臨時表

        建立臨時表:      

            CREATE TEMPORARY TABLE SalesSummary (

              product_name VARCHAR(50) NOT NULL

              , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00

              , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00

              , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0

            );

        修改臨時表:           

            INSERT INTO SalesSummary

              (product_name, total_sales, avg_unit_price, total_units_sold)

              VALUES

              ('cucumber', 100.25, 90, 2);

        查詢臨時表:       

            SELECT * FROM SalesSummary;
        删除臨時表:
            DROP TABLE SalesSummary;      

十八:複制表

         1:執行SHOW CREATE TABLE runoob_tbl \G;得到建立runoob_tbl 的語句

         2:執行建立runoob_tbl 的語句,并修改表名

         3:将原表中的資料select複制過來

十九:中繼資料

        SELECT VERSION( )           伺服器版本資訊

        SELECT DATABASE( )        目前資料庫名 (或者傳回空)

        SELECT USER( )                 目前使用者名

        SHOW STATUS         伺服器狀态

        SHOW VARIABLES             伺服器配置變量

          

二十:序列使用

         1:auto_increment自增

           id INT  AUTO_INCREMENT,

        2:重置序列

          如果删除了自增的id部分值,則剩下的id不是連續的,怎樣設定為連續          

          mysql> ALTER TABLE insect DROP id;    
          mysql> ALTER TABLE insect
              -> ADD id INT AUTO_INCREMENT FIRST,
              -> ADD PRIMARY KEY (id);
       3:設定ip的起始值
          ALTER TABLE t AUTO_INCREMENT = 100;      

二十一:處理重複資料

        1:防止重複資料的方法有設定主鍵和唯一索引

           設定雙主鍵         

         CREATE TABLE person_tbl
          (
           first_name CHAR(20) NOT NULL,
           last_name CHAR(20) NOT NULL,
           sex CHAR(10),
           PRIMARY KEY (last_name, first_name)
        );
          唯一索引
      
         CREATE TABLE person_tbl
         (
          first_name CHAR(20) NOT NULL,
          last_name CHAR(20) NOT NULL,
          sex CHAR(10)
          UNIQUE (last_name, first_name)
         );      
           2:統計重複資料
      

          SELECT COUNT(*) as repetitions, last_name,fist_name

          from person_tbl

          GROUP BY lst_name, fist_name

          HAVING repetitons >1;

       3:過濾重複資料

         方法1;distinct

          select distinct last_name, fist_name from person_tbl;

        方法2:grop by

         select last_name, fist_name from person_tbl  GROUP BY (last_name, first_name);

二十二:MySQL導入出資料

        1:select into outfile語句

        select * from user_img into outfile "/tmp/mysqluser.txt";

        會出現權限報錯:ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

        因為導出隻能導出到規定檔案中

        mysql> show global variables like '%secure%';

        進行檢視:

               +----------------------+---------------------------+

        | Variable_name  | Value                       | 

        +------------------- -+---------------------------+

        | secure_auth      | ON                           |

        | secure_file_priv | /var/lib/mysql-files/- |

        +---------------------+---------------------------+

        可知我本地的檔案隻能複制到/var/lib/mysql-files/目錄下      

        mysql> select * from user_img into outfile "/var/lib/mysql-files/user_img.txt";

           Query OK, 0 rows affected (0.11 sec)

        導出為csv格式

        mysql> SELECT * INTO OUTFILE '/var/lib/mysql-files/user_1.txt' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM user;

            Query OK, 2 rows affected (0.00 sec)

        mysqldump導出資料做備份

        #mysqldump -uroot -p -h127.0.0.1 --opt xserver > xserver.sql

        将備份的資料導入到資料庫

        mysql -u使用者名 -p -h127.0.0.1 --default-character-set=utf8 資料庫 < 需要導入的資料庫檔案.sql