MySQL快速入门

谁说我不能喝 提交于 2019-11-30 07:41:35

继恶补了C++基础之后,又来恶补MySQL了,花了将近一天的时间啃完了<MySQL必知必会>这本书,整理了有点糙的读书笔记。

1.SHOW语句的使用:

SHOW DATABASES; //显示存在的数据库列表
SHOW TABLES; //显示当前数据库里存在的表
SHOW COLUMNS FROM user; //显示表user中的所有列(字段)信息,效果同DESCRIBE user
SHOW GRANTS; //显示授权用户

2.SELECT查询语句:

SELECT name FROM products; //查询单列
SELECT name,id FROM products; //查询多列
SELECT * FROM products; //查询所有列
SELECT DISTINCT id FROM products; //查询一列返回不同的行
SELECT products.name FROM factory.products; //使用完全限定的表明和数据库名

3.LIMIT子句限定显示结果行数:

SELECT name FROM products LIMIT 5; //查询一列返回从开始的5行
SELECT name FROM products LIMIT 5,5; //查询一列返回从第5行开始的5行

4.ORDER BY子句对查询结果进行排序:

SELECT name FROM products ORDER BY name; //通过单一列对查询结果排序,排序子句中的列名不一定是查询结果中的列明。
SELECT id,price,name FROM products ORDER BY price,name;//通过多列对结果排序,即当第一个列值相同时按照第二个再排,否则只按第一个排。
SELECT id,price,name FROM products ORDER BY price DESC,name;//同上,只不过先按price降序排列,再按name升序排列(没写ASC关键字是因为默认升序)
SELECT price FROM products ORDER BY price DESC LIMIT 1; //利用排序子句和LIMIT子句检索价格最大值

5.WHERE子句用于过滤行数据:

SELECT name,price FROM products WHERE price = 2.5; //过滤价格等于2.5的数据
SELECT name,price FROM products WHERE price BETWEEN 5 AND 10; //过滤价格在5到10之间的数据
SELECT id FROM customers WHERE email IS NULL //过滤表中email为空值得数据

    WHERE子句可以使用的基本操作符有: =、!= 、< 、> 、<= 、>= 、> 、 BETWEEN。还可以配合如下特殊操作符(AND \ OR \ IN \ NOT):

    SELECT id,price,name FROM products WHERE id = 1000 AND price <=10; //AND操作符
    SELECT name,price FROM products WHERE id = 1000 OR id = 1002; //OR操作符
    SELECT name,price FROM products WHERE id IN(1002,1003) ORDER BY name; //IN操作符
    SELECT name,price FROM products WHERE id NOT IN(1002,1003) ORDER BY name;//NOT操作符用于对后面子句取反

    6.LIKE子句:

    SELECT id,name FROM products WHERE name LIKE 'jet%'; //%通配符表示任何字符出现任意次数,这里表示以jet开头的词,jet后无论出现多少个任意字符。
    SELECT id,name FROM products WHERE name LIKE '_ ton'; //_通配符表示单个任意字符。

    7.REGEXP子句用于使用正则表达式进行搜索。详参照正则表达式。

    8.拼接函数Concat()

    SELECT Concat(name, '(' , country , ')') AS title FROM vendors ORDER BY name;
    查询结果显示name 和(country)拼接起来的结果,并且显示的列标题通过AS起别名为title

    9.SELECT中执行算术计算

    SELECT id,quantity,price*item_price AS price FROM order WHERE order_num = 2005; //让结果显示算术运算后的结果并起别名

      10.数据处理函数:A.文本处理函数

       B.日期和时间处理函数:

       C.数值处理函数:

      11.聚集函数

       12.GROUP BY子句用于分组数据:

      SELECT id, COUNT(*) AS num_prods FROM products GROUP BY id; //按照id进行分组,其中SELECT中出现的出聚集函数以外的列名必须出现在GROUP BY子句中,且GROUP BY不能使用别名。

      13.HAVING 子句用于过滤分组:

      SELECT id,COUNT(*) AS order FROM order WHERE id > 10 GROUP BY id HAVING COUNT(*) >= 2; //查询语句先回执行WHERE过滤行数据,再通过GROUP BY分组,接着是HAVING来过滤分组后的组

      14.SELECT相关子句书写顺序:SELECT -> FROM -> [WHERE] -> [GROUP BY] -> [HAVING] -> [ORDER BY] -> [LIMIT],其中括号括起来的是非必需的。

      15.子查询,常用yu过滤子句中和SELECT的计算字段:

      SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE pro_id = 'TNT2'); //这里在WHERE过滤子句中嵌套了一个子查询,执行顺序是先是子查询查到order_num,然后通过子查询的order_num过滤外层查询数据
      SELECT cust_name, cust_state, (SELECT COUNT(*) FROM orders WHERE orders.cust_id = customers.cust_id) AS orders FROM customers ORDER BY cust_name; //这里显示结果的第三列是来自另外一个表的子查询,并且指定了在子查询中过滤id等于当前表id的数据。

      16.外键是某个表中的一列,包含另一个表的主键值,定义了两个表之间的关系。

      17.INNER JOIN内部联结(也称等值联结)实现查询多个表的数据,来自多个表的数据通过一定的联结条件联结起来:

      SELECT ven_name , prod_name , prod_price FROM vendors , products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name , prod_name; //查询来自两个表vendors和products的数据,并且将数据通过WHERE子句中id相等条件内联起来,这里id一定要写限定全名区分,若不使用内联结会出现笛卡儿积的结果
      SELECT vend_name,prod_name,prod_price FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id; //查询效果同上,只不过这里通过INNER JOIN内联结,ON后为内联结条件。

      18.自联结,即通过当前表和当前表本身进行联结进行查询数据:

      SELECT p1.prod_id,p1.prod_name FROM products AS p1, products AS p2 WHERE p1.vend_id = p2.vend_id AND p2.prod_id = 'DTNTR';//将同一张表区别名p1和p2,通过vend_id为条件进行自联结,由于追加了p2.prod_id = 'DTNTR'使得p2只有一条数据,因此在自联结时p1只会过滤为只含有p2那条数据ven_id的数据。

        19.OUTER JOIN外联结,与内联结类似,区别就是包括了没有进行关联的行:

        SELECT customers.cust_id , order.order_num FROM customer LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id; //在外联结关键字OUTER JOIN前面加LEFT和RIGHT标志指定包括OUTER JOIN左边或者右边的所有行(包括没进行关联的,没进行关联的数据为NULL)。

          20.UNION组合查询,将多个查询语句的结果按行进行组合:

          SELECT vend_id , prod_id , prod_price FROM products WHERE prod_price <= 5 UNION SELECT vend_id , prod_id , prod_price FROM products WHERE vend_id IN (1001,1002) ORDER BY vend_id , prod_price; //组合的要求是多个查询结果的列数量和类型是相兼容的,并且组合会去重复行,要包括重复行使用UNION ALL,组合的结果只能用一个ORDER BY

          21.全文本搜索

          //启用全文搜索
          CREATE TABLE productnotes(
          note_id int NOT NULL AUTO_INCREMENT,
          prod_id char(10) NOT NULL,
          note_date datetime NOT NULL,
          note_text text NULL,
          PRIMARY KEY(note_id),
          FULLTEXT(note_text) //对note_text字段开启全文本搜索支持
          )ENGINE = MyISAM //使用MyISAM引擎,因为此引擎支持全文本搜索
          //使用全文本搜索
          //Match(note_text)即对note_text字段进行全文本搜索,Against('rabbit')指出搜索的关键字是'rabbit'
          SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit
          ');

            22.INSERT语句用于插入数据:

            INSERT INTO customers VALUES(NULL,'Test','Test1','Test2',99,NULL);//直接插入完整的数据,数据按位入座。但容易写漏,不安全
            INSERT INTO customers (cust_address , cust_city , cust_state , cust_zip , cust_country,cust_contact , cust_email) VALUES('Test','TEST','TEST','TEST','TEST','TEST',NULL,NULL); //插入一行数据的指定列的数据,没指定的列为默认为NULL或默认值。
            INSERT INTO customers(cust_id , cust_contact , cust_email , cust_name , cust_address, cust_city , cust_state , cust_zip , cust_country)SELECT cust_id , cust_contact , cust_email , cust_name , cust_address, cust_city , cust_state , cust_zip , cust_country FROM custnew;//将查询的数据插入

            23.UPDATE语句更新数据:

            UPDATE customers SET cust_name = 'The Fudds',cust_email = 'elmer@fudd.com' WHERE cust_id 1005; //修改指定行的数据。若不加WHERE会更新所有行的数据

            24.DELETE语句删除数据:

            DELETE FROM customers WHERE cust_id = 1005; //删除指定行的数据,若不加WHERE则删除所有行数据。

            25.CREATE TABLE语句创建表:

            //建表关键字CREATE TABLE,后面接表名,括号内为各列的名称及属性
            CREATE TABLE orderitems(
            //NOT NULL执行这一列不能为空,设为NULL则可以为空,DEFAULT指出若这一列若没赋值则使用默认值,AUTO_INCREMENT指出这一列的数据若没赋值会根据上一个值自动增加。
            order_num int NOT NULL, AUTO_INCREMENT,
            order_item int NOT NULL,
            prod_id char(10) NOT NULL DEFAULT 1,
            quantity int NOT NULL,
            item_price decimal(8.2) NOT NULL,
            //设置主键
            PRIMARY KEY (order_num , order_item)
            )ENGINE = InnoDB;//选择使用引擎

            26.ALTER TABLE语句更新表:

            ALTER TABLE vendors ADD vend_phone CHAR(20) ; //在表中添加一列
            ALTER TABLE orders ADD CONSTAINT fk_orders_customers FOREIGN KEY(cust_id) REFERENCES customers(cust_id); //更新表常用来添加外键约束,这里添加约束列fk_orders_customers,指出是外键cust_id,引用于customers的cust_id列
            ALTER TABLE Vendors DROP COLUMN vend_phone; //删除表中的一列

            27.DROP TABLE 删除表

            DROP TABLE customers2;

            28.RENAME TABLE重命名表:

            RENAME TABLE customers2 TO customers;

              29.VIEW视图可以看作虚拟的表本身不包含任何数据,不能使用索引和触发器,本身保存一个SQL查询语句,用于之后的SELECT,简化查询操作,复用SQL代码。

              //创建视图
              CREATE VIEW productcustomers AS SELECT cust_name , cust_contact , prod_id FROM customers , orders , orderitems WHERE customers.cust_id = order.cust_id AND orderitems.order_num = orders.order_num; //AS后面保存的就是一个SQL查询,此视图就是基于此查询得出来的虚拟表
              //从视图查询,直接得出结果而不用在敲上面那么多代码
              SELECT * FROM productcustomers
              //删除视图
              DROP VIEW viewname;

              可以对视图中的数据进行插入、更新、删除操作,操作完会修改原本的基类表。

              30.存储过程暂时没看之后补上

              31.游标暂时没看之后补上

              32.TRIGGER触发器即某些语句被执行时自动执行一些操作,可以使用出发语句有INSERT\DELETE\UPDATE,包括其之前和之后触发因此一个表最多含有6个触发器:

              CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added'; //创建的触发器名是newproduct,出发条件在插入表之后,FOR EACH ROW指出每次插入都触发,触发内容就是显示'Product added'行
              CREATE TRIGGER neworder AFTER INSERT ON orders FOR EACH ROW SELECT NEW.order_num; //这里的NEW.order_num指的是新插入的记录的order_num字段
              CREATE TRIGGER deleteorder BEFORE DELETE ON orders FOR EACH ROW BEGIN INSERT INTO archive_orders(order_num,order_date,cust_id) VALUES(OLD.order_num,OLD.order_date,OLD.cust_id); END; //这里使用BEGIN和END使得可以执行多条语句。
              DROP TRIGGER newproduct; //删除触发器

              33.事务处理保证SQL操作要么执行,要么完全不执行:

              START TRANSACTION;//开启事务
              ROLLBACK; //回滚操作到开启事务处,只能在一个事务处理内使用
              COMMIT; //提交整个事务操作
              SAVEPOINT pos; //使用保留点
              ROLLBACK TO pos; //回滚到保留点
              SET autocommit = 0; //关闭自动提交行为

               

              标签
              易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
              该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!