MySql 基本sql语句

时间:2022-06-24 05:29:52

  
#库操作: SHOW DATABASES;#显示所有数据库 CREATE DATABASE  IF NOT EXISTS db_name CHARACTER SET UTF8; # 创建库(选择字符编码) SHOW CREATE DATABASE db_name[CHARACTER SET UTF8];# 查看新建库的方式 ALTER DATABASE db_name [CHARACTER SET UTF-8]; # 修改数据库 USE db_name; # 使用数据库 SELECT DATABASE(); # 查看当前使用的数据库 #表操作: SHOW TABLES; CREATE TABLE tab_name (field type [完整性约束条件] CHECK (id>0)) [CHARACTER SET UTF-8]; #创建表 -- CHECK 为约束,插入更新数据时会检查,保证id是否大于0

        DESC tab_name; # 查看表结构 RENAME TABLE 旧表名 TO 新表名;# 重命名表 ALTER TABLE tab_name ADD 列名 type [完整约束条件], ADD 列名 type [完整约束条件]; ALTER TABLE tab_name DROP 列名;# 删除列 ALTER TABLE tab_name MODIFY 列名 type [完整约束条件] DEFAULT; ALTER TABLE tab_name CHANGE 旧列名 新列名 type;--改列名

        DROP TABLE tab_name;--删表
 #注释 /* 注释 */--注释

 #SELECT 语句: SELECT DISTINCT name FROM emp; #检索出不同的值(检索多列时若两列不完全相同, 所有列都会被检索出来) SELECT id FROM emp LIMIT 5 OFFSET 5; #检索从第5行起后5行 ORDER BY: SELECT prod_id,prod_price,prod_name FROM Products ORDER BY prod_price,prod_name; -- 仅在prod_price出现相同的值时,才会对prod_name进行排序,如果prod_price的值唯一
            --则不会对prod_name排序

            SELECT prod_id,prod_price,prod_name FROM Products ORDER BY 2,3; -- 先对第2个列进行排序,再对第三个列进行排序

            SELECT prod_id,prod_price,prod_name FROM Products ORDER BY prod_price DESC,prod_name; --有DESC的进行升序排列,默认排列为A到Z (ASC)

            SELECT prod_name as name FROM Product; --SELECT指定别名或进行运算都不会改动原表

        WHERE: SELECT vend_id,prod_name FROM Products WHERE vend_id <> DLL01; --检索除DLL01的值
            --进行不匹配,匹配检索时,null值不会出现在检索结果之中

            SELECT vend_id,prod_name FROM Products WHERE NOT vend_id = DLL01; SELECT prod_name,prod_price FROM Products WHERE prod_price BETWEEN 5 AND 10;--范围检查

            SELECT prod_name,prod_price FROM Products WHERE prod_price IS NULL;--检索空值

            SELECT vend_id,prod_price,prod_name FROM Products WHERE vend_id = DLL01 AND prod_price <=4; -- ORDER BY 子句应在WHERE之后

            SELECT prod_name,prod_price FROM Products WHERE (vend_id = DLL01 OR vend_id = BRS01) AND prod_price >= 10; --AND的优先级比OR高,一般要用圆括号分组

        --过滤:
                SELECT prod_name,prod_price FROM Products WHERE vend_id IN (DLL01,BRS01) ORDER BY prod_name; SELECT vend_id,prod_name FROM Products WHERE prod_name LIKE Fish%; --检索prod_name中以Fish开头的值(区分大小写),但不会检索出NULL的行
                --还可以这样用:‘%fish%‘

                SELECT vend_id,prod_name FROM Products WHERE prod_name LIKE _inch teddy bear; -- 下划线也是通配符,匹配一个字符

        --函数:
                SELECT Concat(vend_name,(,RTRIM(vend_country),)) --合并
                AS vend_title               -- 去掉右边的空格
                FROM Vendors ORDER BY vend_name; -- LTRIM()去掉左边的空格,TRIM()去两边

                SELECT quantity*item_price AS expanded_price FROM OrderItems WHERE order_num = 20008; SELECT cust_name,cust_contant FROM Customers WHERE SOUNDEX(cust_contact)=SOUNDEX(Michael Green); --拟声

                SELECT order_num FROM Orders WHERE YEAR(order_date) = 2012; #GROUP BY: SELECT vend_id ,COUNT(*) AS num_prods FROM Products GROUP BY vend_id; -- 要在WHERE子句之后,ORDER BY子句之前
                                  -- GROUP BY 后记得 ORDER BY

                HAVING -- 过滤组:
                    SELECT  cust_id,COUNT(*) AS orders FROM Orders GROUP BY cust_id HAVING orders >=2; SELECT vend_id,COUNT(*) AS num_prods FROM Products WHERE prod_price >=4
                    GROUP BY vend_id HAVING num_prods >=2; --子查询:
                -- 策略:看最后一个WHERE 和各个SELECT前的检索值
                 SELECT cust_name,cust_contact FROM Customers WHERE cust_id IN (SELECT cust_id FROM Orders WHERE order_num IN (SELECT order_num FROM OrderItems WHERE prod_id = RGAN01)); -- 还可通过联结进行查询
                 SELECT cust_name, cust_state, (SELECT COUNT(*) FROM Orders WHERE Orders.cust_id = Customers.cust_id) AS orders FROM Customers ORDER BY cust_name; --联结表:
            --内联结:
                --内联结就是将两个表并在一起,将两表中的信息同时检索出来
                SELECT vend_name,prod_name,prod_price FROM vendors INNER JION Products ON Vendors.vend_id = Products.vend_id; --‘标准写法‘

                SELECT prod_name,vend_name,prod_price,quantity FROM OrderItems,Products,Vendors WHERE Products.vend_id = Vendors.vend_id AND OrderItems.prod_id  = Products.prod_id AND order_num = 20007; --联结三张表

                SELECT cust_name,cust_contact FROM Customers AS C,Orders AS O,OrderItems AS OI WHERE C.cust_id = O.cust_id AND OI.order_num = O.order_num AND prod_id = RGAN01

            --自联结:
                SELECT C1.cust_id,C1.cust_name,C1.cust_contact FROM  Customers AS C1,Customers AS C2 WHERE C1.cust_name = C2.cust_name AND C2.cust_contact = Jim Jones

            --外联结:
                --包含了那些联结表中没有关联的行,叫外联结
                SELECT C.cust_id,O.order_num FROM Customers AS C LEFT OUTER JOIN Orders AS O ON C.cust_id = O.cust_id; -- LEFT OUTER 指左边未关联的行,RIGHT 为右边

                SELECT C.cust_id, COUNT(O.order_num) AS num_ord FROM Customers AS C LEFT OUTER JOIN Orders AS O ON C.cust_id = O.cust_id GROUP BY C.cust_id; --组合查询:
                --将多条SELECT语句的查询结果按一个结果返回
                --常用于不同表之间的查询
                --UNION ALL 返回所有行(包括重复的)
                SELECT cust_name,cust_contact,cust_email FROM Customers WHERE cust_state IN (IN,IL,MI) UNION
                SELECT cust_name,cust_contact,cust_email FROM Customers WHERE cust_name = Fun4All
                ORDER BY cust_name --ORDER BY 语句必须放在最后一个SELECT语句后

--插入数据:
        INSERT INTO emp (name,department) VALUES("远东","销售部"),("安发","财政部"); INSERT INTO emp SET name="hzw"; # 插入表记录 INSERT INTO Customers(cust_id) SELECT cust_id FROM CustNew --导入数据

        SELECT *
        INTO CustCopy FROM Customers;--导出数据

        CREATE TABLE CustCopy AS
        SELECT * FROM Customers; --运行中创建的表CustCopy将与Customers一样

--更新与删除:
    --UPDATE 修改列数据,DELETE删除行
        UPDATE emp SET depart = "销售部", age = 18
        WHERE name = "ldy" # 修改表记录,UPDATE只能用SET修改 DELETE FROM emp; # 删除全部表记录 DELETE FROM emp WHERE id=1 OR id=2; # 删除两行表记录 DELETE FROM emp WHERE name ="ldy" AND DEPART = "技术部"; -- 准确删除表记录,安全模式下要加上id>0

        TRUNCATE TABLE emp; --删表(先摧毁再新建一个一模一样的)

--视图:

    CREATE VIEW ProductCustomers AS
    SELECT cust_name,cust_contact,prod_id FROM Customers AS C,Orders AS O,OrderItems AS OI WHERE C.cust_id = O.cust_id AND OI.order_num = O.order_num; SELECT cust_name,cust_contact FROM ProductCustomers WHERE prod_id = RGAN01; --事务处理:
    START TRANSACTION; INSERT INTO tab_name (name) values(ldy); SAVEPOINT INSERT1; ROLLBACK TO INSERT1; --可回退INSERT,UPDATE,DELETE

    COMMIT TRANSACTION;--提交事务
    --只有提交了事务sql语句才真正生效

--游标:
        DECLARE CustCursor CURSOR
        FOR
        SELECT * FROM Customers WHERE cust_email IS NULL --创建游标

        OPEN CURSOR CustCursor --使用游标
 #约束条件: PRIMARY KEY # 非空且唯一 UNIQUE # 唯一 NOT NULL # 不为空 AUTO_INCREMENT # 自增长 #类型: #数字类型: TINYINT,SMALLINT,INT #字符串类型:CHAR(2) # 只能存2个字节的字符串 VARCHAR20) #存20字节以内的字符串 BLOB # 2进制字符串 TEXT #文本字符串 #时间字符串类型: DATA 格式:yyyy-mm-dd TIME 格式:hh:mm:ss YEAR格式:yyyy DATETIME 格式:yyyy-mm-dd hh:mm:ss --外键:
       CREATE tab_name ( filed_1 INT PRIMARY KEY
               FOREIGN KEY (filed_1) REFERENCES new_tab_name(filed) ) -- new_tab_name 被称为主表,tab_name 为子表
              ENGINE = INNODB;--创建外键,filed_1数据类型必须与new_tab_name(filed)的一致
       ALTER TABLE tab_name ADD CONSTRAINT abc FOREIGN KEY (filed_1) REFERENCES new_tab_name(filed) #常用函数: LEFT()--返回字符串左边的字符
    RIGHT()--返回字符串右边的函数
    LENGTH()--返回字符串的长度
    LOWER(),UPPER()--小写大写
    RTRIM(),LTRIM(),TRIM()--删除空格
    SOUNDEX()--返回字符串的SOUNDEX值 --soundex可将任何文本转换成语音表示字母数字模式的算法
    AVG()--某列平均值
    COUNT()--返回某列行数
    MAX()--返回某列的最大值,用于文本数据时返回最后一行
    MIN()--返回某列的最小值,用于文本数据时返回最前一行,均忽略null值
    SUM()--返回某列之和
    COUNT(*)--对所有行进行计数
    COUNT(column)--对特定列进行计数
    LIMIT 5 --检索5行
    OFFSET 5 -- 从第5行开始检索
    DISTINCT field --返回不同的值
    CURRENT_DATE() --获得系统日期