美文网首页
MySQL基本操作

MySQL基本操作

作者: 眼泪成诗HOCC | 来源:发表于2019-07-09 18:14 被阅读0次

    登录:

    [root@host]# mysql -u root -p

    查看版本:

    [mysql]> select version();

    更改密码:

    mysql> alter user user() identified by "123";

    创建用户:

    查询MySQL用户:

    1、查询MySQL数据库中所有用户:

    mysql> SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;

    2、查询数据库中具体某个用户的权限:

    mysql> show grants for 'root'@'localhost'; 

    3、查看user表的表结构。需要具体的项可以根据表的结构来查询。

    mysql> desc mysql.user; 

    修改用户权限:

    mysql> GRANT ALL ON *.* TO `用户名`@`127.0.0.1` WITH GRANT OPTION;


    创建数据库:

    CREATE DATABASE 数据库名;

    CREATE DATABASE IF NOT EXISTS RUNOOB DEFAULT CHARSET utf8 COLLATE utf8_general_ci;     //如果数据库不存在则创建,存在则不创建

    删除数据库:

    drop database <数据库名>;

    注:一个汉字占多少长度与编码有关:

    UTF-8:一个汉字=3个字节

    删除表内数据:

    delete from 表名 where 删除条件;

    清除表内数据,保存表结构:

    truncate table 表名;

    删除表:

    drop table 表名;


    创建数据表:

    CREATE TABLE IF NOT EXISTS `WeeklyPaper`

    (`WeeklyPaper_id` INT UNSIGNED AUTO_INCREMENT,

     `WeeklyPaper_date` DATE,

     `WeekArrange` VARCHAR(100) NOT NULL, 

     `PlanNextWeek` VARCHAR(40) NOT NULL, 

     PRIMARY KEY ( `WeeklyPaper_id` )

    )ENGINE=InnoDB DEFAULT CHARSET=utf8;

    删除数据表:

    DROP TABLE table_name ;


    插入数据:

    INSERT INTO WeeklyPaper 

    (WeekArrange, PlanNextWeek)

     VALUES

    ("数据可视化财务指标数据","巩固数据库+hive查询+python数据处理");


    查询表结构:

    desc table_name;

    查询数据:

    SELECT column_name,column_name

    FROM table_name

    [WHERE Clause]    //包含任何条件

    [LIMIT N]    //设定返回记录数

    [ OFFSET M]    //语句开始查询的数据偏移量,默认为0;

    WHERE子句:

    SELECT field1, field2,...fieldN FROM table_name1, table_name2...

    [WHERE condition1 [AND [OR]] condition2.....

    查询语句中你可以使用一个或者多个表,表之间使用逗号, 分割,并使用WHERE语句来设定查询条件;

    你可以在 WHERE 子句中指定任何条件。

    你可以使用 AND 或者 OR 指定一个或多个条件。

    WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。

    WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。

    查询区分大小写:

    mysql> SELECT * from runoob_tbl WHERE BINARY runoob_author='RUNOOB.COM';


    UPDATE更新:

    UPDATE table_name SET field1=new-value1, field2=new-value2[WHERE Clause]

    mysql> UPDATE runoob_tbl SET runoob_title='学习 C++' WHERE runoob_id=3;

    UPDATE table_name SET field=REPLACE(field, 'old-string', 'new-string') [WHERE Clause]

    UPDATE runoob_tbl SET runoob_title = REPLACE(runoob_title, 'C++', 'Python') where

    runoob_id = 3;


    DELETE语句:

    DELETE FROM table_name [WHERE Clause]

    LIKE子句:

    SELECT * from runoob_tbl WHERE runoob_author LIKE '%COM';

    '%a' //以a结尾的数据

    'a%' //以a开头的数据

    '%a%' //含有a的数据

    '_a_' //三位且中间字母是a的

    '_a' //两位且结尾字母是a的

    'a_' //两位且开头字母是a的

    查询以 java 字段开头的信息。

    SELECT * FROM position WHERE name LIKE 'java%';

    查询包含 java 字段的信息。

    SELECT * FROM position WHERE name LIKE '%java%';

    查询以 java 字段结尾的信息。

    SELECT * FROM position WHERE name LIKE '%java';


    UNION操作符

    SELECT expression1, expression2, ... expression_n

    FROM tables

    [WHERE conditions]

    UNION [ALL | DISTINCT]

    SELECT expression1, expression2, ... expression_n

    FROM tables

    [WHERE conditions];

    SELECT country, name FROM Websites

    WHERE country='CN'

    UNION ALL

    SELECT country, app_name FROM apps

    WHERE country='CN'

    ORDER BY country;


    ORDER BY子句

    mysql> SELECT * from runoob_tbl ORDER BY submission_date ASC;

    mysql> SELECT * from runoob_tbl ORDER BY submission_date DESC;

    MySQL 拼音排序

    如果字符集采用的是 gbk(汉字编码字符集),直接在查询语句后边添加 ORDER BY:

    SELECT * FROM runoob_tbl ORDER BY runoob_title;

    如果字符集采用的是 utf8(万国码),需要先对字段进行转码然后排序:

    SELECT * FROM runoob_tbl ORDER BY CONVERT(runoob_title using gbk);


    GROUP BY 语句

    mysql> SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;

    WITH ROLLUP

    WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。

    例如我们将以上的数据表按名字进行分组,再统计每个人登录的次数:

    mysql> SELECT name, SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;


    在多个表中查询数据JOIN

    INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。

    LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。

    RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

    mysql> 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;

    mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a, tcount_tbl b WHERE a.runoob_author = b.runoob_author;

    mysql> 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;

    mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a RIGHT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;

    查找数据表中 runoob_test_tbl 列是否为 NULL,必须使用 IS NULL 和 IS NOT NULL:

    mysql> SELECT * FROM runoob_test_tbl WHERE runoob_count IS NULL;


    正则表达式

    查找name字段中以'st'为开头的所有数据:

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

    查找name字段中以'ok'为结尾的所有数据:

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

    查找name字段中包含'mar'字符串的所有数据:

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

    查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据:

    mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

    如果你需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。

    删除,添加或修改表字段:

    ALTER TABLE testalter_tbl DROP i;

    ALTER TABLE testalter_tbl ADD i INT FIRST;

    ALTER TABLE testalter_tbl DROP i;

    ALTER TABLE testalter_tbl ADD i INT AFTER c;

    修改字段类型及名称:

    如果需要修改字段类型及名称, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。

    mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);

    修改字段默认值

    mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;

    mysql> SHOW COLUMNS FROM testalter_tbl;

    mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;    //删除

    修改数据表类型:

    查看数据表类型可以用SHOW TABLE STATUS 

    mysql> ALTER TABLE testalter_tbl ENGINE = MYISAM;

    mysql> SHOW TABLE STATUS LIKE 'testalter_tbl'\G

    修改表名:

    mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;

    修改存储引擎:修改为myisam

    alter table tableName engine=myisam;

    删除外键约束:keyName是外键别名

    alter table tableName drop foreign key keyName;

    修改字段的相对位置:这里name1为想要修改的字段,type1为该字段原来类型,first和after二选一,这应该显而易见,first放在第一位,after放在name2字段后面

    alter table tableName modify name1 type1 first|after name2;


    索引

    创建索引:

    CREATE INDEX indexName ON mytable(username(length));

    修改表结构(添加索引)

    ALTER table tableName ADD INDEX indexName(columnName)

    创建表时直接指定:

    CREATE TABLE mytable(

    ID INT NOT NULL, 

    username VARCHAR(16) NOT NULL, 

    INDEX [indexName] (username(length)) 

    ); 

    删除索引:

    DROP INDEX [indexName] ON mytable;


    唯一索引

    创建唯一索引:

    CREATE UNIQUE INDEX indexName ON mytable(username(length))

    修改表结构:

    ALTER table mytable ADD UNIQUE [indexName] (username(length))

    创建表的时候直接指定

    CREATE TABLE mytable(

    ID INT NOT NULL, 

    username VARCHAR(16) NOT NULL, 

    UNIQUE [indexName] (username(length)) 

    ); 


    添加删除索引

    四种方式添加数据表索引:

    ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。

    ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。

    ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。

    ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。


    添加删除主键

    mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;

    mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);

    mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;


    显示索引信息

    你可以使用 SHOW INDEX 命令来列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息。

    mysql> SHOW INDEX FROM table_name; \G


    MySQL复制表

    一、获取数据表的完整结构:

    mysql> SHOW CREATE TABLE runoob_tbl \G;

    二、修改SQL数据表名:

    mysql> CREATE TABLE `clone_tbl` (

     -> `runoob_id` int(11) NOT NULL auto_increment, 

     -> `runoob_title` varchar(100) NOT NULL default '', 

     -> `runoob_author` varchar(40) NOT NULL default '', 

     -> `submission_date` date default NULL, 

     -> PRIMARY KEY (`runoob_id`),

     -> UNIQUE KEY `AUTHOR_INDEX` (`runoob_author`)

    -> ) ENGINE=InnoDB;

    三、在数据库中创建新的克隆表 clone_tbl

    mysql> INSERT INTO clone_tbl (runoob_id,

     -> runoob_title, 

     -> runoob_author, 

     -> submission_date) 

     -> SELECT runoob_id,runoob_title, 

     -> runoob_author,submission_date

     -> FROM runoob_tbl;

    复制表方法二:

    CREATE TABLE targetTable LIKE sourceTable;

    INSERT INTO targetTable SELECT * FROM sourceTable;

    来给大家区分下mysql复制表的两种方式。

    第一、只复制表结构到新表

    create table 新表 select * from 旧表 where 1=2

    或者

    create table 新表 like 旧表 

    第二、复制表结构及数据到新表

    create table新表 select * from 旧表 


    MySQL序列使用

    AUTO_INCREMENT

    mysql> CREATE TABLE insect

    -> (  id INT UNSIGNED NOT NULL AUTO_INCREMENT,    

    -> PRIMARY KEY (id),    

    -> name VARCHAR(30) NOT NULL, # type of insect   

     -> date DATE NOT NULL, # date collected   

     -> origin VARCHAR(30) NOT NULL # where collected);

    mysql> INSERT INTO insect (id,name,date,origin) VALUES

     -> (NULL,'housefly','2001-09-10','kitchen'),   

     -> (NULL,'millipede','2001-09-10','driveway'),    

    -> (NULL,'grasshopper','2001-09-10','front yard');

    mysql> SELECT * FROM insect ORDER BY id;


    获取AUTO_INCREMENT值

    在MySQL的客户端中你可以使用 SQL中的LAST_INSERT_ID( ) 函数来获取最后的插入表中的自增列的值。

    设置序列开始值:

    mysql> CREATE TABLE insect

     -> ( id INT UNSIGNED NOT NULL AUTO_INCREMENT,   

     -> PRIMARY KEY (id),  

     -> name VARCHAR(30) NOT NULL,

     -> date DATE NOT NULL,  

     -> origin VARCHAR(30) NOT NULL)engine=innodb auto_increment=100 charset=utf8;

    mysql> ALTER TABLE t AUTO_INCREMENT = 100;

    杜峰

    相关文章

      网友评论

          本文标题:MySQL基本操作

          本文链接:https://www.haomeiwen.com/subject/poefkctx.html