整理来自-菜鸟教程:http://www.runoob.com/mysql/mysql-tutorial.html
说明:适用初学者,大神勿喷
MYsql安装:
Mysql 下载网址:https://www.mysql.com/downloads/
检查自己的系统上是否自带安装mysql:rmp -qa |grep mysql
删除命令:rpm -e mysql (普通删除)
rpm -e --nodeps mysql (上述命令删除不全时可以使用这个命令)
安装mysql:yum install mysql;yum install mysql-server;yum install mysql-devel;
启动mysql:service mysqld start;
备注:如果我们第一次启动mysql,mysql服务器会进行初始化的配置;
如果是centos7系统,由于mysql数据库从默认的程序列表中删除,可以使用mariadb代替;
Mariadb数据库的相命令:
Systemctl start mariadb (启动mariadb数据库)
Systemctl stop mariadb (停止mariadb数据库)
Systemctl reatart mariadb (重启mariadb数据库)
Systemctl enable mariadb (设置开机的确启动)
验证mysql安装:mysqladmin --version(基于系统的相关信息)
安装完成后mysql的默认密码为空,修改密码:mysqladmin -u root password“******”;
设置好后连接服务器:mysql -u root -p ,接着出现enter password 输入密码即可;
启动mysql服务器:
ps -ef|grep mysqld(查看是否启动)
如果未启动,执行:cd /usr/bin ./mysqld_safe &
关闭mysql服务器:
Cd /usr/bin 执行:./mysqladmin -u root -p shutdown出现enter password输入密码即可;
配置文件在/etc/my.conf里;(一般不需要修改可以指定错误日志的路径)。
———————————————————————————————————————
Windows下安装mysql:
1.下载安装包解压到指定目录;
2.配置环境变量path后追加路径如:C:\Program Files\mysql-5.7.19-winx64\bin;
3.将my-default改为my.ini,配置为:
[mysqld]
basedir=C:\Program Files\mysql-5.7.19-winx64(mysql所在目录)
datadir=C:\Program Files\mysql-5.7.19-winx64\data (mysql所在目录\data)(没有的话就创建写进去,data文件夹没有也自己创建)
4.管理员身份启动cmd,进入到mysql所在路径,执行mysqld -install,如果已经存在,查看一下,命令:sc query mysql 删除命令:sc delete mysql 最后载执行mysqld -install。
5.启动mysql服务,net start mysql(说明我的版本解压后没有data文件夹和ini的配置文件,都是需要手动创建,但是到启动这步就失败,需要将创建的配置文件放进bin文件夹里,执行:mysqld --initialize --user=mysql --console(记下初始化的密码) 然后在mysqld -install(如果前边安装了就删除),再执行net start mysql,最后进入:mysql -u root -p输入记下的初始化密码),关闭执行net stop mysql.
6.修改初始化密码:进入mysql执行:mysql> set password for用户名@localhost = password('新密码'); 或者mysqladmin -u用户名 -p旧密码password 新密码 或者【首先登录MySQL。连接权限数据库:use mysql;改密码:update user set password=password("shapolang") where user="root";(别忘了最后加分号);刷新权限(必须步骤):flush privileges;重新登录,输入新密码shapolang就ok了;】
7.刚装上的mysql只能默认127.0.0.1或者localhost访问 需要别的ip访问需要设置:
如:mysql -uroot -h127.0.0.1 -p可以访问 但mysql -uroot -h192.168.1.101 -p不可以访问 。
修改:进入mysql执行use mysql后输入下列括号中的命令即可。
【GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.107' IDENTIFIED BY '123123' WITH GRANT OPTION;】--设置账号为root密码为123123可以访问用ip 192.168.1.107访问mysql服务器 。这时候可以用navicat premium去链接,不然拒绝链接。
8.查看版本:show variables like ‘version’;
———————————————————————————————————————
MYsql管理:
数据库管理命令:
Use+数据库名(选择将要操作的数据库)
SHOW DATABASES (列出来所有的数据库列表)
SHOW TABLES(显示指定数据里的所有表单)
SHOW COLUMNS FROM 数据表(显示数据表的属性,主键信息,默认值等信息)
SHOW INDEX FROM 数据表(显示表的详细索引信息,包括主键(PRIMARY KEY))
SHOW TABLE STATUS LIKE [FROM db_name] [LIKE 'pattern'] \G(按列打印数据库中的表)
用户设置:
给mysql数据库中的user添加用户:
1.mysql> INSERT INTO user
(host, user, password,
select_priv, insert_priv, update_priv)
VALUES ('localhost', 'guest',
PASSWORD('guest123'), 'Y', 'Y', 'Y');
mysql> FLUSH PRIVILEGES;(不使用这个命令需要重启mysql服务器)
Mysql5.7版本中password换成了authentication_string。(这种方法出现Field 'id' doesn't have a default value-------???)
修改配置文件my.ini中的
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"为
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
2.mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON TUTORIALS.*
-> TO 'zara'@'localhost'
-> IDENTIFIED BY 'zara123';
MYsql中php用法:
函数格式如:mysqli_funtion(value,value,...)
例如:
mysqli_connect($connect);
mysqli_query($connect,"SQL 语句");
mysqli_fetch_array()
mysqli_close()
MYsql中创建及删除数据库:
mysqladmin -uroot -h192.168.1.107 -p create xxxxxx(创建了名为xxxxx的数据库)
mysqladmin -u -root -p create xxxxxx(创建了名为xxxxx的数据库)
或者php脚本创建数据库--暂不关注
mysqladmin -uroot -h192.168.1.107 -p drop xxxxxx(删除了名为xxxxx的数据库)
mysqladmin -u -root -p drop xxxxxx(删除了名为xxxxx的数据库)
或者php脚本删除数据库--暂不关注
MYsql数据类型:
--暂不关注
MYsql创建及删除数据表:
通用语法:
CREATE TABLE table_name (column_name column_type);
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;
或者php脚本创建数据表--暂不关注
可以使用desc+数据表查看表结构。
如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL,就会报错。
AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
ENGINE 设置存储引擎,CHARSET设置编码。
删除命令:DROP TABLE 数据表名
或者php脚本删除数据表--暂不关注
MYsql数据表中插入数据:
语法:
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
如果是字符型,必须加””或者’’ 如:
mysql> INSERT INTO runoob_tbl
-> (runoob_title, runoob_author, submission_date)
-> VALUES
-> ("学习 MySQL", "菜鸟教程", NOW());
Query OK, 1 rows affected, 1 warnings (0.01 sec)
mysql> INSERT INTO runoob_tbl
-> (runoob_title, runoob_author, submission_date)
-> VALUES
-> ("JAVA 教程", "RUNOOB.COM", '2016-05-06');
NOW是sql的一个函数,返回时间和日期,->不是sql语句结束是换行,结束标志是;
MYsql数据查询替换删除排序分组等:
select语法:
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[OFFSET M ][LIMIT N]
查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
SELECT 命令可以读取一条或者多条记录。
你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据。
你可以使用 WHERE 语句来包含任何条件。
你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
你可以使用 LIMIT 属性来设定返回的记录数。
例:select *from runoob_tbl;
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表中的字段值来读取指定的数据。
操作符类似与c语言,只是不等于可以为!=或者<>.
Where本身不区分大小写,可以使用 BINARY来区分
例:SELECT *from runoob_tbl WHERE BINARY runoob_author='runoob.com';
UPDATA语法:(其实就是替换修改某个字段的值)
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
你可以同时更新一个或多个字段。
你可以在 WHERE 子句中指定任何条件。
你可以在一个单独表中同时更新数据。
当你需要更新数据表中指定行的数据时 WHERE 子句是非常有用的。
例:UPDATE runoob_tbl SET runoob_title='学习 C++' WHERE runoob_id=3;
DELETE语法:
DELETE FROM table_name [WHERE Clause]
如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。
你可以在 WHERE 子句中指定任何条件
您可以在单个表中一次性删除记录。
当你想删除数据表中指定的记录时 WHERE 子句是非常有用的。
例:DELETE FROM runoob_tbl WHERE runoob_id=3;
LIKE语法:
SELECT field1, field2,...fieldN
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
你可以在 WHERE 子句中指定任何条件。
你可以在 WHERE 子句中使用LIKE子句。
你可以使用LIKE子句代替等号=。
LIKE 通常与 %一同使用,类似于一个元字符的搜索。
你可以使用 AND 或者 OR 指定一个或多个条件。
你可以在 DELETE 或UPDATE 命令中使用WHERE...LIKE 子句来指定条件。
例:SELECT *from runoob_tbl WHERE runoob_author LIKE '%COM';
UNION语法:
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
expression1, expression2, ... expression_n: 要检索的列。
tables: 要检索的数据表。
WHERE conditions: 可选, 检索条件。
DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION操作符已经删除了重复数据,所以 DISTINCT修饰符对结果没啥影响。
ALL: 可选,返回所有结果集,包含重复数据。
例:SELECT country FROM Websites
UNION
SELECT country FROM apps
ORDER BY country;
ORDER BY语法:
SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
你可以设定多个字段来排序。
你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。
你可以添加 WHERE...LIKE 子句来设置条件。
例:SELECT *from runoob_tbl ORDER BY submission_date ASC;(升序)
SELECT *from runoob_tbl ORDER BY submission_date DESC;(降序)
GROUP BY 语法:
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
根据一列或者多列进行分组
例:SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;(统计每个人的记录数)
SELECT name, SUM(singin) as singin_count FROM employee_tbl GROUP BY nameWITH ROLLUP;(在第一步的基础上再统计每个人的登陆次数)结果总的登录次数的name为NULL,我们可以使用coalesce(a,b,c)代替:
参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null,则返回为null(没意义)。
以下实例中如果名字为空我们使用总数代替:
语句改为:SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;
+--------+--------------+
| name | singin_count |
+--------+--------------+
| 小丽 | 2 |
| 小明 | 7 |
| 小王 | 7 |
| NULL | 16 |
+--------+--------------+
+--------------------------+--------------+
| coalesce(name, '总数') | singin_count |
+--------------------------+--------------+
| 小丽 | 2 |
| 小明 | 7 |
| 小王 | 7 |
| 总数 | 16 |
+--------------------------+--------------+
JOIN语法:
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
RIGHT JOIN(右连接): 与 LEFT JOIN相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
两个表如下:
mysql> SELECT * FROM tcount_tbl;
+---------------+--------------+
| runoob_author | runoob_count |
+---------------+--------------+
| 菜鸟教程 | 10 |
| RUNOOB.COM | 20 |
| Google | 22 |
+---------------+--------------+
mysql> SELECT * from runoob_tbl;
+-----------+---------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 1 | 学习 PHP | 菜鸟教程 | 2017-04-12 |
| 2 | 学习 MySQL | 菜鸟教程 | 2017-04-12 |
| 3 | 学习 Java | RUNOOB.COM | 2015-05-01 |
| 4 | 学习 Python | RUNOOB.COM | 2016-03-06 |
| 5 | 学习 C | FK | 2017-04-05 |
+-----------+---------------+---------------+-----------------+
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;
连接以上两张表来读取runoob_tbl表中所有runoob_author字段在tcount_tbl表对应的runoob_count字段值:
+-------------+-----------------+----------------+
| a.runoob_id | a.runoob_author | b.runoob_count |
+-------------+-----------------+----------------+
| 1 | 菜鸟教程 | 10 |
| 2 | 菜鸟教程 | 10 |
| 3 | RUNOOB.COM | 20 |
| 4 | RUNOOB.COM | 20 |
+-------------+-----------------+----------------+
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;
runoob_tbl 为左表,tcount_tbl为右表!
+-------------+-----------------+----------------+
| a.runoob_id | a.runoob_author | b.runoob_count |
+-------------+-----------------+----------------+
| 1 | 菜鸟教程 | 10 |
| 2 | 菜鸟教程 | 10 |
| 3 | RUNOOB.COM | 20 |
| 4 | RUNOOB.COM | 20 |
| 5 | FK | NULL |
+-------------+-----------------+----------------+
该语句会读取左边的数据表 runoob_tbl的所有选取的字段数据,即便在右侧表 tcount_tbl中没有对应的runoob_author 字段值。
RIGHT JOIN:会读取右边全部数据,即使左边没有对应
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;
+-------------+-----------------+----------------+
| a.runoob_id | a.runoob_author | b.runoob_count |
+-------------+-----------------+----------------+
| 1 | 菜鸟教程 | 10 |
| 2 | 菜鸟教程 | 10 |
| 3 | RUNOOB.COM | 20 |
| 4 | RUNOOB.COM | 20 |
| NULL | NULL | 22 |
+-------------+-----------------+----------------+
Mysql -NULL处理:
为了查询字段含有NULL,MySQL提供了三大运算符:
IS NULL: 当列的值是 NULL,此运算符返回true。
IS NOT NULL: 当列的值不为 NULL,运算符返回 true。
<=>: 比较操作符(不同于=运算符),当比较的的两个值为NULL 时返回true。
关于 NULL 的条件比较运算是比较特殊的。你不能使用= NULL 或 != NULL 在列中查找 NULL值 。
在 MySQL 中,NULL值与任何其它值的比较(即使是 NULL)永远返回false,即NULL = NULL 返回false。
MySQL 中处理 NULL使用 IS NULL和 IS NOT NULL运算符。
Mysql -正则表达式:
MySQL中使用 REGEXP操作符来进行正则表达式匹配。
^
匹配输入字符串的开始位置。如果设置了 RegExp对象的 Multiline属性,^也匹配 '\n'或 '\r'之后的位置。
$
匹配输入字符串的结束位置。如果设置了RegExp对象的 Multiline属性,$也匹配 '\n'或 '\r'之前的位置。
.
匹配除 "\n"之外的任何单个字符。要匹配包括 '\n'在内的任何字符,请使用象 '[.\n]'的模式。
[...]
字符集合。匹配所包含的任意一个字符。例如, '[abc]'可以匹配 "plain"中的 'a'。
[^...]
负值字符集合。匹配未包含的任意字符。例如, '[^abc]'可以匹配 "plain"中的'p'。
p1|p2|p3
匹配 p1 或 p2 或p3。例如,'z|food'能匹配 "z"或 "food"。'(z|f)ood'则匹配 "zood"或 "food"。
*
匹配前面的子表达式零次或多次。例如,zo*能匹配 "z" 以及 "zoo"。*等价于{0,}。
+
匹配前面的子表达式一次或多次。例如,'zo+'能匹配 "zo" 以及 "zoo",但不能匹配"z"。+等价于 {1,}。
{n}
n 是一个非负整数。匹配确定的n 次。例如,'o{2}'不能匹配 "Bob"中的 'o',但是能匹配"food" 中的两个o。
{n,m}
m 和 n均为非负整数,其中n <= m。最少匹配n 次且最多匹配m 次。
查找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事物:
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行//-------》》设置保存点再回滚再保存是可以保存前边的语句。
事务用来管理 insert,update,delete 语句
一般来说,事务是必须满足4个条件(ACID):Atomicity(原子性).Consistency(稳定性)、Isolation(隔离性).Durability(可靠性)
1.事务的原子性:一组事务,要么成功;要么撤回。
2.稳定性 :有非法数据(外键约束之类),事务撤回。
3.隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
4.可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得,innodb_flush_log_at_trx_commit 选项 决定什么时候吧事务保存到日志里。
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令BEGIN 或START TRANSACTION,或者执行命令SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。
事物控制语句:
1.BEGIN或START TRANSACTION;显式地开启一个事务;
2.COMMIT或者COMMIT WORK,COMMIT会提交事务,并永久保存对数据库的修改;
3.ROLLBACK或者ROLLBACK WORK,回滚会结束用户的事务,并撤销所有未提交的修改;
4.SAVEPOINT identifier;SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;
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 开启自动提交
Mysql--alter命令:
SET AUTOCOMMIT=1 开启自动提交
我们需要修改表名或者表的某个字段时用到它。
删除表中某个字段:
Alter table 表名 drop 字段;
如:alter table mytest drop i;
添加某个字段:
Alter table 表名 add 字段 类型 ;(默认添加到末尾)
Alter table 表名 add 字段 类型 first;(默认添加在第一列)
Alter table 表名 add 字段 类型 after 字段名;(在后字段名之后一列添加)
如:alter table mytest add ii int;
alter table mytest add ii int first;
alter table mytest add ii int after name;
修改某个字段及类型:
Alter table 表名 modify 字段 新类型;
Alter table 表名 change 字段 新字段(新)类型;
如: alter table mytest modify ii char;
Alter table mytest change ii xx char(int);
修改字段的默认值:
上述操作不说明默认值,一般默认为NULL;
Alter table 表名 alter 字段 set default 数值;
Alter table 表名 alter 字段 drop default;
Alter table mytest alter xx set default 100;
Alter table mytest alter xx drop default;
修改数据表类型:
Alter table mytest engine=MYISAM;//修改类型
SHOW TABLE STATUS LIKE 'mytest'\G//查看
修改表名:
Alter table mytest rename to newtest;
Mysql--alter索引:
索引分为:单列索引和组合索引;单列索引指一个索引包含单列,一个表可以有多个单列索引组合索引指一个索引包含多列。
普通索引:(单列)
直接创建:
create index 索引名on表名(字段(长度));//加长度没通过--字段必须存在。。
Create index search on mytest (name);
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定length。
修改表单创建:
Alter table 表名 add index 索引名 (字段)//字段必须存在
Alter table mytest add index search (name);
创建表的时候指定:
mysql> create table mmm(
-> id int(11) not null,
-> name char(8) not null,
-> index search (name(5)) //指定索引名及字段
-> );
创建成功对应的DDL为:
CREATE TABLE `mytestt` (
`id` int(11) NOT NULL,
`name` char(8) NOT NULL,
KEY `search` (`name`(5))
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
查看索引:
Show index from 表名;
Show index from mytestt \G
删除索引:
Drop index 索引名 on 表名;或者alter table表名 drop index(字段);
Drop index search on mytestt;
唯一索引:(单列)
直接创建:
create unique index 索引名on 表名(字段(长度));//加长度没通过--字段必须存在。。
Create unique index search on mytestt (name);
修改表单创建:
Alter table 表名 add unique 索引名 (字段);
Alter table mytestt add unique search (id);
创建表的时候指定:
mysql> create table mytestt(
-> id int(11) not null,
-> name char(8) not null,
-> unique search (name(5)) //指定索引名及字段
-> );
创建成功对应的DDL为:
CREATE TABLE `mytestt` (
`id` int(11) NOT NULL,
`name` char(8) NOT NULL,
UNIQUE KEY `search` (`name`(5))
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
组合索引:(对应普通索引和唯一索引)
创建表:
直接创建:
create unique index 索引名 on 表名(字段,字段)
Create unique index search on zxd (name ,age);
修改表单创建:
Alter table 表名 add unique 索引名 (字段,字段)
Alter table zxd add unique search (name,age);
创建表:
mysql> create table zxd(
-> id int(11) not null,
-> name char(11) not null,
-> age int(8) not null,
-> primary key (id),
-> unique search (id,name(8))
-> );
创建成功对应的DDL为:
CREATE TABLE `zxd` (
`id` int(11) NOT NULL,
`name` char(11) NOT NULL,
`age` int(8) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `search` (`id`,`name`(8))
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
这个主键也是索引值删除的时候只能删掉name这个索引。
注:组合索引原则:最左前缀原则!
针对上边的表相当于有两组:id ,name 和id 而没有name这组。
Select *from zxd where id=1 and name=”zxd”
Select *from zxd where id=1 ;
没有Select *from zxd where name=”zxd”
使用ALTER 命令添加和删除索引
有四种方式来添加数据表的索引:
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 ADD INDEX (c);
你还可以在 ALTER 命令中使用DROP 子句来删除索引。尝试以下实例删除索引:
mysql> ALTER TABLE testalter_tbl DROP INDEX c;
使用 ALTER 命令添加和删除主键
主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
你也可以使用 ALTER 命令删除主键:
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
删除主键时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。
Mysql--临时表:
创建方法:create temporary table 表名.......
创建完成后可以添加数据并查看,但是在数据表列表中看不到这个临时表(show tables;)
断开数据库后自动删除临时表,也可以手动删除:drop table 临时表名
Mysql--复制表:
断开数据库后自动删除临时表,也可以手动删除:drop table 临时表名;
1.show create table 表名 \G (按列显示老表信息)
2.Create table 新表名.... (按照上边显示的信息创建空表)
3.Insert into 新表名(..,..,..,..) select字段,...字段from 表名;
例:
mysql> show create table mm ;
+-------+---------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------------------+
| mm | CREATE TABLE `mm` (
`id` int(11) NOT NULL,
`hah` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+---------------------------------------------------------------------------------------------------------------+
mysql> create table mmm(
-> id int(11)not null,
-> hah int(11) default null
-> )engine =InnoDB DEFAULT CHARSET=latin1;
Query OK, 0 rows affected
mysql> insert into mmm(id,hah) select id,hah from mm;
Query OK, 2 rows affected
Mysql--元数据:
断开数据库后自动删除临时表,也可以手动删除:drop table 临时表名;
查询结果信息 服务器信息数据库数据表信息
Select version(); //显示服务器版本信息
Select database(); // 显示当前数据库名或者返回NULL
Select user(); //显示当前用户名
Show status; //显示服务器状态
Show variables; //显示服务器配置变量
Mysql--处理重复数据:
设置主键(primary key)或者索引字段(unique index)来保证数据唯一;
两个字段不重复就设置两个主键 或者两个索引字段;
Insert ignore into 表名 .....和insert into表名 ....区别:前者重复不报错也不保存
统计重复数据:
mysql> select count(*)as repetitions,haha
-> from mmmm
-> group by haha //列出重复的列
-> having repetitions >1; //设置重复数大于1
+-------------+------+
| repetitions | haha |
+-------------+------+
| 2 | asa |
| 3 | cd |
+-------------+------+
过滤重复数据:使用distinct或者group by
例:mysql> select distinct name from life_tbl;
mysql> select name from life_tbl group by name;
删除重复数据:《-------》
Mysql--导出数据:
语句:select ......into outfile......
Select *from life_tbl into outfile ‘/tmp/my.txt’;
导出表作为原始数据:
mysqldump是mysql用于转存储数据库的实用程序。它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等。
使用mysqldump导出数据需要使用--tab 选项来指定导出文件指定的目录,该目标必须是可写的。
mysqldump -u root -p --no-create-info \
--tab=/tmp life_tbl
password ******
导出SQL格式的数据:
mysqldump -u root -p mysql life_tbl > my.txt
password ******
如果你需要导出整个数据库的数据,可以使用以下命令:
$ mysqldump -u root -p mysql > database_dump.txt
password ******
如果需要备份所有数据库,可以使用以下命令:
$ mysqldump -u root -p --all-databases > database_dump.txt
password ******
--all-databases 选项在 MySQL 3.23.12及以后版本加入。
Mysql--导出数据:
语句:mysql> LOAD DATA LOCAL INFILE 'dump.txt'INTO TABLE mytbl;
Local:表名从当前主机路径读取,不加表示从服务器上读取。
*****************************************************************************
查询表单中某个字段不重复的数据:
id |
na |
aa |
1 |
ss |
3 |
2 |
ff |
5 |
3 |
gg |
4 |
4 |
hh |
5 |
语句:
select na, aa from ss group by aa ;
结果如此
语句:
select *,count(distinct aa)from ss group by aa;
结果如此
查询数据库库特征表单id唯一url为NULL和id重复url全为NULL:
语句:嵌套
select *
from lib_er_rel
where rel_source_id not in
(
select rel_source_id from lib_er_rel where url is not null
)
and url is null and db_feature <> '0'