• Mysql语句


    Linux: 安装

    --yum -y install mariadb mariadb-server

    OR

    --yum -y install mysql mysql-server

    启动

    --service mysqld start 开启

    --chkconfig mysqld on 设置开机自动启动

    --systemctl start mariadb

    --systemctl enable mariadb

    查看

    --ps aux | grep mysqld 查看进程

    --netstat -an | grep 3306 查看端口

    设置密码

    --mysqladmin -uroot password 'xxxxx' 设置初始密码,初始密码为空因此-p选项没用

    --mysqladmin -uroot -pxxxx password 'xxxxxxxxxx' 修改root用户密码

    登录

    -- mysql #本地登录,默认用户root,空密码,用户为root@127.0.0.1

    -- mysql -uroot -p1234 #本地登录,指定用户名和密码,用户为root@127.0.0.1

    -- mysql -uroot -p1234 -h 192.168.31.95 #远程登录,用户为root@192.168.31.95

    数据库由字段和记录组成

    SQL语句是结构化语句
    规范:
    1、不区分大小写,命令建议大写
    2、以分号作为结束符号
    3、注释-- 多行注释/* */


    数据库的操作

    SHOW DATABASES; --显示已有的数据库


    CREATE DATABASE 数据库名称(小写) CHARACTER SET utf8; --创建数据库,指定数据库字符集

    DROP DATABASE databasename; --删除数据库
    ALTER DATABASE databasename CHARACTER SET xxx; --修改数据库的字符集


    SHOW CREATE DATABASE databasename; --查看创建的数据库信息


    DROP DATABASE databasename; --删除某一个数据库
    USE databasename; --使用某一个数据库,切换到数据库目录下

    创建表

    数据表的操作

    CREATE TABLE table_name(

    字段名 字段数据类型[约束],
    字段名 字段数据类型[约束],
    字段名 字段数据类型[约束],
    字段名 字段数据类型[约束],

    )
    主键:非空且唯一

    /* 约束:

    primary key (非空且唯一) :能够唯一区分出当前记录的字段称为主键!

    主键特点:非空且唯一

    注意:

    1、每张表只能有一个主键

    2、每一张表不一定只有一个非空且唯一的字段

    3、如果表中只有一个非空且唯一字段,那它就是主键
    如果表中不只有一个非空且唯一字段,那第一个非空切唯一的字段就是主键

    unique  唯一

    not null 非空

    auto_increment :用于主键字段,主键字段必须是数字类型,自增   */

    查看表信息

    DESC table_name; --查看表结构

    SHOW CREATE table_name; --查看创建表信息

    SHOW TABLES;  --查看数据库中的表

    SHOW COLUMNS FROM table_name; --查看表列结构

    修改表结构

    单次单项操作

    ALTER TABLE table_name ADD [column] 列名 类型 [约束条件] [FIRST | AFTER] 字段名;       --向表中添加列

    单次多项操作

    ALTER TABLE table_name ADD [column] 列名 类型 [约束条件] [FIRST | AFTER] 字段名,

                ADD [column] 列名 类型 [约束条件] [FIRST | AFTER] 字段名,

                ADD [column] 列名 类型 [约束条件] [FIRST | AFTER] 字段名,

                ADD [column] 列名 类型 [约束条件] [FIRST | AFTER] 字段名;

    ALTER TABLE table_name MODIFY 列名 类型 [约束条件] [FIRST | AFTER] 字段名;  --改变列的数据类型

    ALTER TABLE table_name DROP [column] 列名; --删除某列

    ALTER TABLE table_name CHANGE 列名 新列名 类型 [约束] [FIRST | AFTER] 字段名; --改变某列的名称

    RENAME TABLE 表名 to 新表名; --修改表名称

    ALTER TABLE table_name CHARACTER SET xxx; --修改表字符集

    DROP TABLE table_name; --删除表

    增加表记录

    插入一条记录
    INSERT [INTO] table_name (field1,filed2,......) VALUES (value1,value2,.......); 

    插入多条记录

    INSERT [INTO] table_name (field1,field2,......) VALUES (value1,value2,......),

                             (value1,value2,......),

                             (value1,value2,......),

                              ........;

    修改表记录

    UPDATE table_name SET field1=value1,field2=value2,...... [where] 

    删除表记录

    DELETE FROM table_name [WHERE];

    如果不跟WHERE,DELETE语句会删除整张表中的数据,只能删除表内容而不能删除表

    TRUNCATE TABLE table_name 也可以删除表中的所有数据,首先摧毁表再创建新表,此种方式不能恢复

    查询表记录

    SELECT [DISTINCT] * | field1,field2,...... FROM table_name  [WHERE 条件] [GROUP BY field HAVING 条件] [ORDER BY field] [LIMIT 条数]; --查询显示表中信息

    SELECT * FROM table_name; --查询显示表中所有信息

    SELECT field1 [AS] 别名,field2 [AS] 别名...... FROM table_name; 

    使用WHERE子句进行过滤查询

    WHERE子句中可以使用:

        比较运算符:

          > < >= <= != <>

          between ... and ...  之间

          in (80,90,100)   80 90 100

          like "a%" 表示任意多个字符,alpha , abc都可以

          如果是"a_"表示一个字符,只有ab , ac符合

       逻辑运算符:

          多个条件可以使用逻辑运算符 and or not

    ORDER BY 排序

    SELECT * | field1,field2,... FROM table_name ORDER BY field [ASC | DESC];

    -- ASC 升序, DESC降序,其中ASC为默认值,ORDER BY 子句应位于SELECT语句的结尾

    GROUP BY 分组查询

    GROUP BY 子句其后可以接多个列名,也可以跟having子句,对GROUP BY 的结果进行筛选

    HAVING和WHERE两者都可以对查询结果进行进一步的过滤,差别有:

    1、WHERE语句只能用在分组之前的筛选,HAVING可以用在分组之后的筛选

    2、使用WHERE的语句的地方可以用HAVING进行替换

    3、HAVING中可以使用聚合函数,WHERE中不能

    聚合函数

    COUNT(列名):统计行的个数

    SUM(列名):统计满足条件的行的内容和

    SELECT SUM(字段) AS 别名,                         --多条SUM查询

        SUM(字段) AS 别名,

        ...... FROM table_name;

    AVG(列名):求平均值

    MAX,MIN : 求最大值,最小值

    SELECT MAX((ifnull(字段1,0)+ifnull(字段2,0)+......) FROM table_name; --null和所有的数计算都是null,所以需要用ifnull将null转换为0

    查询平均成绩大于85的学生姓名和平均成绩
    SELECT sname,AVG(num) FROM student INNER JOIN score ON student.sid=score.student_id GROUP BY student_id HAVING AVG(num)>85

    使用正则表达式查询

    SELECT * FROM employee WHERE emp_name REGEXP '^yu';

    创建外键

    CREATE TABLE ClassCharger(
    
           id TINYINT PRIMARY KEY auto_increment,
           name VARCHAR (20),
           age INT ,
           is_marriged boolean  -- show create table ClassCharger: tinyint(1)
    
    );
    CREATE TABLE Student(
    
           id INT PRIMARY KEY auto_increment,
           name VARCHAR (20),
           charger_id TINYINT,     --切记:作为外键一定要和关联主键的数据类型保持一致
           -- [ADD CONSTRAINT charger_fk_stu]FOREIGN KEY (charger_id) REFERENCES ClassCharger(id);
    
    )
    
    
    DELETE FROM ClassCharger WHERE name="冰冰";
    INSERT student (name,charger_id) VALUES ("yuan",1);
    -- 删除居然成功,可是 alvin3显示还是有班主任id=1的冰冰的;
    
    -----------增加外键和删除外键---------
    
    ALTER TABLE student  ADD CONSTRAINT abc
                         FOREIGN KEY(charger_id)
                         REFERENCES  classcharger(id);
    
    
    ALTER TABLE student DROP FOREIGN KEY abc;
     

    内链接

    查询生物成绩不及格的学生姓名和对应生物分数
    SELECT sname,num FROM student INNER JOIN (SELECT * FROM score WHERE course_id=1) a ON student.sid=a.student_id WHERE num<60

    select * from employee,department where employee.dept_id = department.dept_id;
    --select * from employee inner join department on employee.dept_id = department.dept_id;
     

    外链接

    --(1)左外连接:在内连接的基础上增加左边有右边没有的结果
    
     select * from employee left join department on employee.dept_id = department.dept_id;
    
         +--------+----------+------+---------+---------+-----------+
        | emp_id | emp_name | age  | dept_id | dept_id | dept_name |
        +--------+----------+------+---------+---------+-----------+
        |      1 | A        |   19 |     200 |     200 | 人事部    |
        |      5 | E        |   20 |     200 |     200 | 人事部    |
        |      2 | B        |   26 |     201 |     201 | 技术部    |
        |      3 | C        |   30 |     201 |     201 | 技术部    |
        |      4 | D        |   24 |     202 |     202 | 销售部    |
        |      6 | F        |   38 |     204 |    NULL | NULL      |
        +--------+----------+------+---------+---------+-----------+
    
     --(2)右外连接:在内连接的基础上增加右边有左边没有的结果
    
     select * from employee RIGHT JOIN department on employee.dept_id = department.dept_id;
    
            +--------+----------+------+---------+---------+-----------+
            | emp_id | emp_name | age  | dept_id | dept_id | dept_name |
            +--------+----------+------+---------+---------+-----------+
            |      1 | A        |   19 |     200 |     200 | 人事部    |
            |      2 | B        |   26 |     201 |     201 | 技术部    |
            |      3 | C        |   30 |     201 |     201 | 技术部    |
            |      4 | D        |   24 |     202 |     202 | 销售部    |
            |      5 | E        |   20 |     200 |     200 | 人事部    |
            |   NULL | NULL     | NULL |    NULL |     203 | 财政部    |
            +--------+----------+------+---------+---------+-----------+
    
     --(3)全外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果
    
        -- mysql不支持全外连接 full JOIN
        -- mysql可以使用此种方式间接实现全外连接
        
       select * from employee RIGHT JOIN department on employee.dept_id = department.dept_id
       UNION
       select * from employee LEFT JOIN department on employee.dept_id = department.dept_id;
    
            
    
            +--------+----------+------+---------+---------+-----------+
            | emp_id | emp_name | age  | dept_id | dept_id | dept_name |
            +--------+----------+------+---------+---------+-----------+
            |      1 | A        |   19 |     200 |     200 | 人事部    |
            |      2 | B        |   26 |     201 |     201 | 技术部    |
            |      3 | C        |   30 |     201 |     201 | 技术部    |
            |      4 | D        |   24 |     202 |     202 | 销售部    |
            |      5 | E        |   20 |     200 |     200 | 人事部    |
            |   NULL | NULL     | NULL |    NULL |     203 | 财政部    |
            |      6 | F        |   38 |     204 |    NULL | NULL      |
            +--------+----------+------+---------+---------+-----------+
    
          -- 注意 union与union all的区别:union会去掉相同的纪录

     联合主键

    Pymysql:

    import pymysql
    
    conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='lyp6187028',db='employee')  #创建连接
    cursor=conn.cursor() #创建游标
    command=cursor.execute("update emp set dept_id=199 where dept_name='HR'") #执行命令并返回受影响行数
    print(command) #1
    conn.commit()
    cursor.close() #关闭游标
    conn.close() #关闭连接
    import pymysql
    
    conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='lyp6187028',db='employee')
    cursor=conn.cursor()
    command=cursor.executemany("INSERT INTO emp (dept_id,dept_name) VALUES(%s,%s)",[(204,"Product"),(205,"Admin")])
    print(command) #2
    
    conn.commit()
    cursor.close()
    conn.close()

    获取查询语句

    import pymysql
    
    conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='lyp6187028',db='employee')
    cursor=conn.cursor()
    command=cursor.execute("SELECT * FROM emp")
    row=cursor.fetchone() #或许查询第一行
    #
    row=cursor.fetchmany(3) #((199, 'HR'), (201, 'TECH'), (202, 'SALE')) 获取查询结果指定数目
    #row=cursor.fetchall() #((199, 'HR'), (201, 'TECH'), (202, 'SALE'), (203, 'FINANCE'), (204, 'Product'), (205, 'Admin')) 获取全部的查询结果
    print(row) # (199, 'HR')
    conn.commit()
    cursor.close()
    conn.close()

    获取数据的默认类型为元组类型,可以将其设置为字典类型

    import pymysql
    
    conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='lyp6187028',db='employee')
    cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
    command=cursor.execute("SELECT * FROM emp")
    row=cursor.fetchall()
    print(row)
    conn.commit()
    cursor.close()
    conn.close()
    执行结果
    [{'dept_id': 199, 'dept_name': 'HR'}, {'dept_id': 201, 'dept_name': 'TECH'}, {'dept_id': 202, 'dept_name': 'SALE'}, 
    {'dept_id': 203, 'dept_name': 'FINANCE'}, {'dept_id': 204, 'dept_name': 'Product'}, {'dept_id': 205, 'dept_name': 'Admin'}]

    创建索引

    --创建表时
    --语法:
        CREATE TABLE 表名 (
                    字段名1  数据类型 [完整性约束条件…],
                    字段名2  数据类型 [完整性约束条件…],
                    [UNIQUE]   INDEX | KEY
                    [索引名]  (字段名[(长度)]  [ASC |DESC])
                    );
    
    --------------------------------
    
    --创建普通索引示例:
    
        CREATE TABLE emp1 (
            id INT,
            name VARCHAR(30) ,
            resume VARCHAR(50),
            INDEX index_emp_name (name)
        --KEY index_dept_name (dept_name)
            );
    
    
    --创建唯一索引示例:
    
        CREATE TABLE emp2 (
            id INT,
            name VARCHAR(30) ,
            bank_num CHAR(18) UNIQUE ,
            resume VARCHAR(50),
            UNIQUE INDEX index_emp_name (name)
            );
    
    --创建全文索引示例:
    
        CREATE TABLE emp3 (
            id INT,
            name VARCHAR(30) ,
            resume VARCHAR(50),
            FULLTEXT INDEX index_resume (resume)
            );
    
    --创建多列索引示例:
    
        CREATE TABLE emp4 (
            id INT,
            name VARCHAR(30) ,
            resume VARCHAR(50),
            INDEX index_name_resume (name,resume)
            );
    
    
    
    ---------------------------------

    添加和删除索引

    ---添加索引
    
        ---CREATE在已存在的表上创建索引
          CREATE  [UNIQUE]  INDEX  索引名
                  ON 表名 (字段名[(长度)]  [ASC |DESC]) ;
        
        ---ALTER TABLE在已存在的表上创建索引
        
          ALTER TABLE 表名 ADD  [UNIQUE] INDEX
                        索引名 (字段名[(长度)]  [ASC |DESC]) ;
        
        
         CREATE INDEX index_emp_name on emp1(name);
         ALTER TABLE emp2 ADD UNIQUE INDEX index_bank_num(band_num);
    
    
    -- 删除索引
        
        语法:DROP INDEX 索引名 on 表名
        
        DROP INDEX index_emp_name on emp1;
        DROP INDEX bank_num on emp2;
  • 相关阅读:
    产生多种anchor的代码讲解!很好!
    一个报错
    将自己的数据制作成voc格式
    Python list 增加/插入元素的说明
    SAP 物料主数据屏幕增强 .
    软件測试必读书籍
    20160309,微软3月8日公布13个安全补丁
    UVA
    LLVM每日谈之十九 LLVM的第一本系统的书&lt;Getting Started with LLVM Core Libraries&gt;
    计算程序执行的时间
  • 原文地址:https://www.cnblogs.com/c491873412/p/7236209.html
Copyright © 2020-2023  润新知